不对称加密和解密

本文介绍了一种使用C#实现的不对称加密方法,通过私钥加密和公钥解密的方式确保数据的安全传输。示例代码展示了如何生成密钥对、使用私钥进行数据加密并利用公钥验证加密后的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/ccdale/p/6248935.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值