.NET 下制作 Shareware 的关键技术探讨二:éžå¯¹ç§°åР坆
March 16th, 2005
剿–‡æè¿°äº†.NET 为 Shareware 程åºå¼€å‘æä¾›äº†è®¸å¯è¯æ£€æµ‹æœºåˆ¶ï¼Œä½¿å¾—å¼€å‘者å¯ä»¥é›†ä¸ç²¾åŠ›åˆ°å¦‚ä½•éªŒè¯è®¸å¯è¯ã€‚
把一个信æ¯ç»ç”±ä¸å¯ä¿¡ä»»çš„é€”å¾„ä¼ è¾¾ç»™æŽ¥å—者的时候,就需è¦è¿›è¡ŒåŠ å¯†ã€‚å¯¹äºŽä¿¡æ¯æŽ¥å—者æ¥è¯´ï¼Œåˆ™éœ€è¦ç¡®è®¤ä¿¡æ¯çš„æ¥æºæ˜¯æ¥è‡ªæ£ç¡®çš„,就需è¦è¿›è¡Œæ•°å—ç¾å。Shareware ç¨‹åºæ‹¥æœ‰è€…è¦å‘Šè¯‰è¿œåœ¨ç”¨æˆ·æœºå™¨ä¸Šçš„自己的程åºç”¨æˆ·æœ‰æƒä½¿ç”¨è¿™ä¹ˆä¸ªä¿¡æ¯ï¼Œæ˜¯è¦åŠ å¯†çš„ã€‚å› ä¸ºä½ ä¸æƒ³è®©å…¶ä»–人知é“è¿™ä¸ªä¿¡æ¯æ˜¯å¦‚何表达的,更ä¸èƒ½è®©äººå®¶å¦‚法炮制出相åŒçš„ä¿¡æ¯ã€‚
.NET æä¾›äº†åŠ å¯†å’Œæ•°å—ç¾åç‰çŽ°åœ¨ç”¨åœ¨ç½‘ç»œå®‰å…¨æ–¹é¢çš„æŠ€æœ¯ç”¨åˆ° Shareware 上是ç»å¯¹å¥½çš„ã€‚ä¸‹é¢æ˜¯ç”¨ .NET RSACryptoServiceProvider 的一个办法。
RSA 是一ç§éžå¯¹ç§°åŠ å¯†æŠ€æœ¯ Asymmetric Cryptography,å³åŠ å¯†ç”¨çš„å¯†ç å’Œè§£å¯†ç”¨çš„å¯†ç æ˜¯åˆ†å¼€ï¼Œç›¸äº’ä¸èƒ½æŽ¨æ¼”的。如果知é“了解密用的密ç ï¼Œæ— æ³•çŸ¥é“åŠ å¯†ç”¨çš„å¯†ç ã€‚è¿™æ¯”å¯¹ç§°åŠ å¯†å®‰å…¨æ€§å¥½ï¼Œå› ä¸º Shareware 总是需è¦ä¸€ä¸ªå¯†ç 用æ¥è§£æ³¨å†Œç ï¼Œç”¨å¯¹ç§°åŠ å¯†çš„æƒ…å†µä¸‹ï¼Œå¦‚æžœè¢«äººä»Žç¨‹åºä¸åˆ†æžåˆ°äº†è§£å¯†çš„密ç ,有å¯èƒ½å¤åˆ¶æ³¨å†Œæœºã€‚而用éžå¯¹ç§°åŠ å¯†ï¼Œå³ä½¿è§£å¯†çš„å¯†ç æ³„æ¼ï¼Œä¹Ÿæ— 法åšå‡ºæ³¨å†Œæœºã€‚
1ã€ç”Ÿæˆå’Œä¿å˜å¯†ç
创建个新的 RSACryptoServiceProvider 对象,.NET å°±éšæœºç”Ÿæˆäº†å¯†ç 。
RSACryptoServiceProvider 对象å¯ä»¥æŠŠå¯†ç è¾“å‡ºæˆ xml。
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
Console.WriteLine(rsa.ToXmlString(true));
这个 xml 是è¦å¥½å¥½ä¿å˜èµ·æ¥çš„秘密。其ä¸åŒ…å«äº†ç”¨æ¥åšæ³¨å†Œæœºçš„åŠ å¯†ç”¨çš„ private key å’Œ å°†æ¥åœ¨ç¨‹åºä¸ç”¨æ¥è§£å¯†çš„用 public key。
<RSAKeyValue>
<Modulus>…</Modulus>
<Exponent>…</Exponent>
<P>…</P>
<Q>…</Q>
<DP>…</DP>
<DQ>…</DQ>
<InverseQ>…</InverseQ>
<D>…</D>
</RSAKeyValue>
2ã€æ³¨å†Œæœº
æ ¹æ®ä¸Šé¢çš„密ç xml,å¯ä»¥è¿™æ ·ç”Ÿæˆæ³¨å†Œæœºæ‰€éœ€è¦çš„ RSACryptoServiceProvider 对象。然åŽç”¨æ•°å—ç¾åçš„åŠžæ³•ç”Ÿæˆæ³¨å†Œç 。
SignData æ˜¯åšæ•°å—ç¾å。它与å•çº¯çš„åŠ å¯†è§£å¯†æœ‰åŒºåˆ«ã€‚
如果è¦å˜æˆæ³¨å†Œç æ˜¯è¿™æ ·ä¸€å¥è¯ï¼šæŸäººäºŽæŸæ—¶æŸåœ°è´ä¹°äº†æˆ‘的软件。å•çº¯çš„åŠ å¯†åŽçš„è§£å¯†ä½ ä¼šçœ‹åˆ°è¿™å¥åŽŸè¯(从内å˜é‡Œä»€ä¹ˆåœ°æ–¹æŒ–出æ¥)。而用数å—ç¾å办法,解密åŽçœ‹ä¸åˆ°åŽŸè¯ï¼Œè€Œæ˜¯ä¸€ä¸ªå•å‘计算出æ¥çš„ Hash å€¼ã€‚æ‰€ä»¥å¯¹æ‰€ä¼ é€çš„ä¿¡æ¯å¤šäº†ä¸€å±‚ä¿æŠ¤ã€‚RSACryptoServiceProvider æä¾›äº†ç›´æŽ¥çš„ç”Ÿæˆæ•°å—ç¾åå’ŒéªŒè¯æ•°å—ç¾å的方法。
private static byte[]CreateKey()
{
byte[] digestInput = fileEncoding.GetBytes(GetRegistrationInfo());
RSACryptoServiceProvider RSAalg= new RSACryptoServiceProvider();
RSAalg.ImportParameters(GetPrivateKeyParam());
return RSAalg.SignData(digestInput, new SHA1CryptoServiceProvider());
}
private static string GetRegistrationInfo()
{
return GetValue(“NAME”)+GetValue(“PURCHASE_TIME”)+GetValue(“FROM”);
}
private static RSAParametersGetPrivateKeyParam()
{
RSAParameters param = new RSAParameters();
param.D= Convert.FromBase64String(“…”);
param.DP = Convert.FromBase64String(“…”);
param.DQ = Convert.FromBase64String(“…”);
param.Q = Convert.FromBase64String(“…”);
param.P = Convert.FromBase64String(“…”);
param.Exponent= Convert.FromBase64String(“…”);
param.Modulus= Convert.FromBase64String(“…”);
param.InverseQ= Convert.FromBase64String(“…”);
return param;
}
从 XML ä¸ç”Ÿæˆ private key æ¥åˆ¶ä½œæ•°å—ç¾å,需è¦ç”¨åˆ°å…¨éƒ¨å‚数:D, DP, DQ, P, Q, Exponent, Modulus, InverseQ.
3ã€éªŒè¯æ•°å—ç¾å
在 Shareware 程åºä¸ï¼Œä»Žå¯†ç xml 文件生æˆéªŒè¯æ•°å—ç¾å所需è¦çš„ SACryptoServiceProvider 对象,然åŽè¯·ç”¨æˆ·è¾“入他的åå—ã€ä»¥åŠè´ä¹°è½¯ä»¶çš„æ—¶é—´åœ°ç‚¹ã€‚组æˆä¸€ä¸ªå¥å:æŸäººäºŽæŸæ—¶æŸåœ°è´ä¹°äº†æˆ‘的软件,用 SACryptoServiceProvider 验è¯ä¸€ä¸‹å®ƒçš„æ•°å—ç¾å是å¦ç¬¦åˆæ³¨å†Œæœºç”Ÿæˆæ³¨å†Œç 。
private static bool VerifyKey(byte[]digestInput, byte[] signed)
{
RSACryptoServiceProviderRSAalg = new RSACryptoServiceProvider();
RSAalg.ImportParameters(GetPublicKeyParam());
return RSAalg.VerifyData(digestInput, new SHA1CryptoServiceProvider(),signed);
}
private static RSAParametersGetPublicKeyParam()
{
RSAParameters param = new RSAParameters();
param.Exponent = Convert.FromBase64String(“…”);
param.Modulus = Convert.FromBase64String(“…”);
return param;
}
从 XML ä¸ç”Ÿæˆ public key æ¥éªŒè¯æ•°å—ç¾å,åªè¦ç”¨ä¸¤ä¸ªå‚数:Exponent, Modulus. 别人å³ä½¿ä»Žä½ æ•£å‘å‡ºåŽ»çš„ç¨‹åºæœ¬èº«ç ´è§£å¾—到了public key,没有其它多大用处。
å½“ç„¶ï¼Œç ´è§£ä¸ä»…仅是è¦å¾—到密ç 。如果æ¥ä¸ªæš´åŠ›ç ´è§£ï¼ŒæŠŠä½ çš„ç¨‹åºå编译出æ¥ï¼ŒæŠŠä½ çš„ public key æ¢æˆä»–的,与他自己的注册机é…åˆçš„ï¼Œé‚£ä½ ä¸å°±è¢«æŠ¢åŠ«ä¸€ç©ºäº†ï¼Œæˆ–è€…å编译出æ¥åˆ æŽ‰å‰æ–‡æ‰€è¿°çš„ LicenseProvdier,或者 …….,还有很多办法。
.NET æä¾›çš„许å¯è¯ç›‘测机制,éžå¯¹ç§°åŠ å¯†æ˜¯å¦èƒ½çœŸæ£å‘æŒ¥ï¼Œè¿˜å¾—çœ‹ç¨‹åºæœ¬èº«çš„åŠ æ‰°ç¨‹åº¦ã€‚ä¸‹ä¸€ç¯‡æ–‡ç« ä»‹ç»ã€‚
Tags: shareware asymmetric cryptography rsa private key public key
Entry Filed under: WB Editor
Leave a Comment
Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackback this post | Subscribe to the comments via RSS Feed