软件注册码随笔

用到的是:BouncyCastle.Crypto.dll类库

官网:http://www.bouncycastle.org/csharp/

生成密钥对

 RsaKeyPairGenerator keyGenerator = new RsaKeyPairGenerator();
            //密钥构造器
            RsaKeyGenerationParameters p = new RsaKeyGenerationParameters(BigInteger.ValueOf(3), new SecureRandom(), 1024, 25);
            //初始化密钥构造器
            keyGenerator.Init(p);
            //密钥对
            AsymmetricCipherKeyPair keyPair = keyGenerator.GenerateKeyPair();
            //公钥和私钥
            AsymmetricKeyParameter publicKey = keyPair.Public;
            AsymmetricKeyParameter privateKey = keyPair.Private;

保存密钥对到文件(我这里用*.key形式保存的,当然也可以用其它的)

1  private static void SavePublicKey(AsymmetricKeyParameter publicKey)
2         {
3             SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);
4             Asn1Object ao = publicKeyInfo.ToAsn1Object();
5             byte[] publicKeyByte = ao.GetEncoded();
6             FileStream fs = new FileStream(@"D:\public.key", FileMode.Create, FileAccess.Write);
7             fs.Write(publicKeyByte, 0, publicKeyByte.Length);
8             fs.Close();
9         }
1  private static void SavePrivateKey(AsymmetricKeyParameter privateKey)
2         {
3             PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey);
4             Asn1Object ao = privateKeyInfo.ToAsn1Object();
5             byte[] privateKeyByte = ao.GetEncoded();
6             FileStream fs = new FileStream(@"D:\private.key", FileMode.Create, FileAccess.Write);
7             fs.Write(privateKeyByte, 0, privateKeyByte.Length);
8             fs.Close();
9         }

软件注册基本结构:

自己拥有私密:privatekey

客户拥有公密:publicKey

1:客户端生成序列号

2:客户把序列号告诉私密拥有者

3:私密拥有者用私钥加密信息(时间,版本,或者什么的)

4:加密后的信息给客户,客户在软件操作,验证

1,2步骤不用说了,很简单

直接3,4步骤

私密加密

1 IAsymmetricBlockCipher enginePrivate = new RsaEngine();
2             Asn1Object aobj = Asn1Object.FromStream(new FileStream(@"D:\private.key", FileMode.Open, FileAccess.Read));
3             PrivateKeyInfo priKey = PrivateKeyInfo.GetInstance(aobj);
4             AsymmetricKeyParameter privateKey = PrivateKeyFactory.CreateKey(priKey);
5             enginePrivate.Init(true, privateKey);
6             byte[] enData = enginePrivate.ProcessBlock(data1, 0, data1.Length);
7             string tempEnString = ConvertBytesToHexString(enData);

公密解密

1  byte[] data = ConvertHexStringToBytes(tempEnString);
2             IAsymmetricBlockCipher engine = new RsaEngine();
3             Asn1Object aobject = Asn1Object.FromStream(new FileStream(@"D:\public.key", FileMode.Open, FileAccess.Read));  //a.puk??
4             SubjectPublicKeyInfo pubInfo = SubjectPublicKeyInfo.GetInstance(aobject);
5             AsymmetricKeyParameter publicKey = (RsaKeyParameters)PublicKeyFactory.CreateKey(pubInfo);
6             engine.Init(false, publicKey);
7             engine.GetInputBlockSize();
8             byte[] deData = engine.ProcessBlock(data, 0, data.Length);
9             string tempString = byteToHexStr(deData);

帮助类

 private string byteToHexStr(byte[] bytes)
        {
            string returnStr = "";

            if (bytes != null)
            {

                for (int i = 0; i < bytes.Length; i++)
                {

                    returnStr += bytes[i].ToString("X2");

                }
            }
            return returnStr;
        }
        public byte[] ConvertHexStringToBytes(string hexString)
        {
            int len = hexString.Length / 2;
            byte[] bytes = new byte[len];
            for (int i = 0; i < len; i++)
            {
                bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            }
            return bytes;
        }
        public string ConvertBytesToHexString(byte[] bytes)
        {
            StringBuilder sb = new StringBuilder();
            foreach (byte b in bytes)
            {
                sb.Append(string.Format("{0:X2}", b).PadLeft(2, '0'));
            }
            return sb.ToString();
        }

直接看代码,有些东西是自己要研究的,

 

原文地址:https://www.cnblogs.com/macheal/p/3066086.html