你的位置:首页 > ASP.net教程

[ASP.net教程]C#不对称加密


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

源码:http://www.jinhusns.com/Products/Download/?type=xcj

      不对称加密也叫公钥加密,这种技术使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。不对称加密产生的主要原因有两个,一是对称加密的密钥分配问题,另一个是由于对数字签名的需求。
不对称加密使用一个需要保密的私钥和一个可以对任何人公开的公钥,即使用公钥/私钥对来加密和解密数据。公钥和私钥都在数学上相关联,用公钥加 密的数据只能用私钥解密,反之,用私钥加密的数据只能用公钥解密。两个密钥对于通信会话都是惟一的。公钥加密算法也称为不对称算法,原因是需要用一个密钥 加密数据而需要用另一个密钥来解密数据
      私钥加密算法使用长度可变的缓冲区,而公钥加密算法使用固定大小的缓冲区,无法像私钥算法那样将数据链接起来成为流,因此无法使用与对称操作相同的流模型。这是编写程序时必须注意的问题。
      为什么不对称加密更不容易被攻击呢?关键在于对私钥的管理上。在对称加密中,发送方必须先将解密密钥传递给接收方,接收方才能解密。如果避免通过不安全的网络传递私钥,不就解决这个问题了吗?
      不对称加密的关键就在于此。使用不对称加密算法加密数据后,私钥不是发送方传递给接收方的,而是接收方先生成一个公钥/私钥对,在接收被加密的数据前,先 将该公钥传递给发送方;注意,从公钥推导出私钥是不可能的,所以不怕通过网络传递时被攻击者截获公钥。发送方得到此公钥后,使用此公钥加密数据,再将加密 后的数据通过网络传递给接收方;接收方收到加密后的数据后,再用私钥进行解密。由于没有传递私钥,从而保证了数据安全性。
 
.NET Framework提供以下实现不对称加密算法的类:
•DSACryptoServiceProvider 
•RSACryptoServiceProvider 

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

RSA不对称加密例子


        private void buttonOK_Click(object sender, EventArgs e)
        {
            //使用默认密钥创建RSACryptoServiceProvider对象
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            //显示包含公钥/私钥对的            richTextBoxKeys.Text = rsa.To            //将被加密的字符串转换为字节数组
            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);
            }
        }