马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

C#不对称(公钥)加密算法讲解及代码示例

[复制链接]
查看4204 | 回复1 | 2016-6-16 09:18:08 | 显示全部楼层 |阅读模式
回复是美德。

  对称加密的缺点是双方使用相同的密钥和IV进行加密、解密。由于接收方必须知道密钥和IV才能解密数据,因此发送方需要先将密钥和IV传递给接收方。这就 有一个问题,如果攻击者截获了密钥和IV,也就等于知道了如何解密数据!如何保证发送方传递给接收方的密钥和IV不被攻击者截获并破译呢?


      不对称加密也叫公钥加密,这种技术使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。不对称加密产生的主要原因有两个,一是对称加密的密钥分配问题,另一个是由于对数字签名的需求。

不对称加密使用一个需要保密的私钥和一个可以对任何人公开的公钥,即使用公钥/私钥对来加密和解密数据。公钥和私钥都在数学上相关联,用公钥加 密的数据只能用私钥解密,反之,用私钥加密的数据只能用公钥解密。两个密钥对于通信会话都是惟一的。公钥加密算法也称为不对称算法,原因是需要用一个密钥 加密数据而需要用另一个密钥来解密数据


      私钥加密算法使用长度可变的缓冲区,而公钥加密算法使用固定大小的缓冲区,无法像私钥算法那样将数据链接起来成为流,因此无法使用与对称操作相同的流模型。这是编写程序时必须注意的问题。

      为什么不对称加密更不容易被攻击呢?关键在于对私钥的管理上。在对称加密中,发送方必须先将解密密钥传递给接收方,接收方才能解密。如果避免通过不安全的网络传递私钥,不就解决这个问题了吗?

      不对称加密的关键就在于此。使用不对称加密算法加密数据后,私钥不是发送方传递给接收方的,而是接收方先生成一个公钥/私钥对,在接收被加密的数据前,先 将该公钥传递给发送方;注意,从公钥推导出私钥是不可能的,所以不怕通过网络传递时被攻击者截获公钥。发送方得到此公钥后,使用此公钥加密数据,再将加密 后的数据通过网络传递给接收方;接收方收到加密后的数据后,再用私钥进行解密。由于没有传递私钥,从而保证了数据安全性。


.NET Framework提供以下实现不对称加密算法的类:

•DSACryptoServiceProvider

•RSACryptoServiceProvider

RSACryptoServiceProvider类使用加密服务提供程序提供的RSA算法实现不对称加密和解密。加密服务提供程序 CSP(Cryptographic Service Provider)是微软在Windows操作系统中内置的加密处理模块,RSACryptoServiceProvider类已经对其提供的相关接口和 参数进行了封装,所以即使我们不知道CSP内部是如何实现的,也一样可以使用其提供的功能


[C#] 纯文本查看 复制代码
private void buttonOK_Click(object sender, EventArgs e)
 
        {
 
            //使用默认密钥创建RSACryptoServiceProvider对象
 
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
 
            //显示包含公钥/私钥对的XML表示形式,如果只显示公钥,将参数改为false即可
 
            richTextBoxKeys.Text = rsa.ToXmlString(true);//得到公钥/私钥对(实际没什么意义,一般情况下通过得到公钥发送给服务端,服务端用FromXmlString接收公钥,进行加密后传输)
 
            //将被加密的字符串转换为字节数组
 
            byte[] dataToEncrypt = Encoding.UTF8.GetBytes(textBoxInput.Text);
 
            try
 
            {
 
                //得到加密后的字节数组
 
                byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);
 
                textBoxEncrypt.Text = Encoding.UTF8.GetString(encryptedData);
 
                //得到解密后的字节数组
 
                byte[] decryptedData = rsa.Decrypt(encryptedData, false);
 
                textBoxDecrypt.Text = Encoding.UTF8.GetString(decryptedData);
 
            }
 
            catch (Exception err)
 
            {
 
                MessageBox.Show(err.Message);
 
            }
 
        }

C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
ibcadmin | 2016-6-16 09:19:24 | 显示全部楼层
1
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则