不对称加密和解密

所谓不对称,指的是加密使用的密钥和解密使用的密钥不是同一个。有密钥A和密钥B(这两个密钥是一对的,互相匹配的,后文的公钥或者私钥,可参照【示例代码使用的密钥】),对于一段数据,发送者使用密钥A进行加密,接收者使用密钥B进行解密。

这种过程,可以理解为不对称加密解密。

使用场景:

1.A用户群使用公钥加密数据,B用户使用私钥解密数据

公钥加密,私钥解密。

2.B用户使用私钥加密数据,A用户群使用公钥解密数据

私钥数字签名,公钥验证。

 

此代码为场景2的示例代码:

使用语言为C#

仅供参考

/**
         * 使用私钥加密
         * 参数1:加密前数据
         * 返回加密后的签名
         **/
        public string getSignature(string text)
        {
            // 加密

            // 使用配置了公钥和算法的对象,将参数1密文加密签名
            byte[] bytes_ = Encoding.UTF8.GetBytes(text);
            SHA1Managed sHA1Managed_ = new SHA1Managed();
            byte[] rgbHash_ = sHA1Managed_.ComputeHash(bytes_);


            RSACryptoServiceProvider key = new RSACryptoServiceProvider();
            // 设置签名私钥
            key.FromXmlString(ViSC.My.Resources.Resources.PrivateKey001);
            RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
            formatter.SetHashAlgorithm("SHA1");

            byte[] inArray = formatter.CreateSignature(rgbHash_);


            // print to file
            StreamWriter sw = new StreamWriter("\\Signature.txt", false, Encoding.Default);
            sw.Write(Convert.ToBase64String(inArray));
            sw.Flush();
            sw.Close();

            return Convert.ToBase64String(inArray);

        }

        /**
        * 使用公钥
         * 参数1:加密前数据
         * 参数2:加密后的签名
        * 返回比对结果
        **/
        public bool verifySignature(string text, string s)
        {
            // licens:参数1
            byte[] bytes = Encoding.UTF8.GetBytes(text);
            SHA1Managed sHA1Managed = new SHA1Managed();
            byte[] rgbHash = sHA1Managed.ComputeHash(bytes);


            RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
            //设置验证公钥
            rSACryptoServiceProvider.FromXmlString(ViSC.My.Resources.Resources.PublicKey001);
            RSAPKCS1SignatureDeformatter rSAPKCS1SignatureDeformatter = new RSAPKCS1SignatureDeformatter(rSACryptoServiceProvider);
            // 设置算法
            rSAPKCS1SignatureDeformatter.SetHashAlgorithm("SHA1");

            if (!rSAPKCS1SignatureDeformatter.VerifySignature(rgbHash, Convert.FromBase64String(s)))
            {
                System.Console.WriteLine(false + "比对不一致,验证失败");
                return false;
            }
            else
            {
                System.Console.WriteLine(true + "比对一致,验证成功");
                return true;
            }
        }

        /**
        * 生成一对密钥
        * 
        **/
        public void getKey()
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            using (StreamWriter writer = new StreamWriter(".\\PrivateKey.xml"))
            {
                writer.WriteLine(rsa.ToXmlString(true));
            }
            using (StreamWriter writer = new StreamWriter(".\\PublicKey.xml"))
            {
                writer.WriteLine(rsa.ToXmlString(false));
            }
        }

示例代码使用的密钥

公钥:

<RSAKeyValue>
  <Modulus>oFt+suALWv4hsMV1hGRCbG2382YOG+kO33O4o+MfaLemKLveXZRvMJQPzBNyHK27Hacb8g/Kwr4BOsuumZ1ggks5VYz9DLj0dcHKyuywMwfE97bjBk5g4RLD6x97FNSZAmGvN7V/WHKo3cbF4OJeytRxk4Pag7YSu5ODlRbpri8=</Modulus>
  <Exponent>AQAB</Exponent>
</RSAKeyValue>

 私钥:

<RSAKeyValue>
  <Modulus>oFt+suALWv4hsMV1hGRCbG2382YOG+kO33O4o+MfaLemKLveXZRvMJQPzBNyHK27Hacb8g/Kwr4BOsuumZ1ggks5VYz9DLj0dcHKyuywMwfE97bjBk5g4RLD6x97FNSZAmGvN7V/WHKo3cbF4OJeytRxk4Pag7YSu5ODlRbpri8=</Modulus>
  <Exponent>AQAB</Exponent>
  <P>zPRUVq8pwO+D9MwNSGBdZ8rvF6twjGFwYvqa/xzPLtCA3bbLbGmND9eEhUgHp8xynwnzGrUzfx60awWC1500xw==</P>
  <Q>yEu1ZgsFB84+wuFJkijmgqAV9YEYooT659VK5udGoJhSt1ptGzR719sUWjYuMEOoFGiagS5HDldS7yQuvTwDWQ==</Q>
  <DP>PAKKMztkeVZoB6Q7e2aj0sErkn2jHadmFcUU3v+bdjScls5v75VUNUBAUBoQC8SkBwcNxFMr+duOrgtWDTW9fw==</DP>
  <DQ>aU7s4+bdUTpN4zaB8PfSIlG62eZzJleWd7e79uUYTC1qJ/7CKLCSgG4uKDQeWr/nqjtJKKxFLbQZ5aP3cwUPmQ==</DQ>
  <InverseQ>mMKFUOv07t1b5qv0BnJQiEdsrN6RRzG3+0cOhky2wZ6b+KIYSFd/QJ5fKlqDkNC8LaLyxI8nnbUXZ4Fig4btYg==</InverseQ>
  <D>EifJxH7RSlATiGwSzhZ73sLdXNVlK4vLf0ke0o9Ycwa37Uy39Ghl3l4lG7nn5Y9V7BmLdHCNSFcy1HFTJ1lGH8x6mTbPG0mjJ8oxY37aoZ/1GyBT5P63YrZszlqfOmhf+Cx6hvWu2M6m6040Mw1Ls21I8mY89fB/LXiA0N1c98E=</D>
</RSAKeyValue>

 

posted @ 2017-01-04 15:44  Dale_na  阅读(1929)  评论(0编辑  收藏  举报