所谓不对称,指的是加密使用的密钥和解密使用的密钥不是同一个。有密钥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>