对称加密与非对称加密

来源:互联网 发布:报表数据的重要性 编辑:程序博客网 时间:2024/06/01 09:26

(一)对称加密(Symmetric Cryptography)

对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。

对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

2000年10月2日,美国国家标准与技术研究所(NIST--American National Institute of Standards and Technology)选择了Rijndael算法作为新的高级加密标准(AES--Advanced Encryption Standard)。.NET中包含了Rijndael算法,类名叫RijndaelManaged,下面举个例子。

加密过程:

 

复制代码
        private string myData = "hello";        private string myPassword = "OpenSesame";        private byte[] cipherText;        private byte[] salt = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0 };                    private void mnuSymmetricEncryption_Click(object sender, RoutedEventArgs e)        {            var key = new Rfc2898DeriveBytes(myPassword, salt);            // Encrypt the data.            var algorithm = new RijndaelManaged();            algorithm.Key = key.GetBytes(16);            algorithm.IV = key.GetBytes(16);            var sourceBytes = new System.Text.UnicodeEncoding().GetBytes(myData);            using (var sourceStream = new MemoryStream(sourceBytes))            using (var destinationStream = new MemoryStream())            using (var crypto = new CryptoStream(sourceStream, algorithm.CreateEncryptor(), CryptoStreamMode.Read))            {                moveBytes(crypto, destinationStream);                cipherText = destinationStream.ToArray();            }            MessageBox.Show(String.Format("Data:{0}{1}Encrypted and Encoded:{2}", myData, Environment.NewLine, Convert.ToBase64String(cipherText)));        }        private void moveBytes(Stream source, Stream dest)        {            byte[] bytes = new byte[2048];            var count = source.Read(bytes, 0, bytes.Length);            while (0 != count)            {                dest.Write(bytes, 0, count);                count = source.Read(bytes, 0, bytes.Length);            }        }
复制代码

 

解密过程:

 

复制代码
        private void mnuSymmetricDecryption_Click(object sender, RoutedEventArgs e)        {            if (cipherText == null)            {                MessageBox.Show("Encrypt Data First!");                return;            }            var key = new Rfc2898DeriveBytes(myPassword, salt);            // Try to decrypt, thus showing it can be round-tripped.            var algorithm = new RijndaelManaged();            algorithm.Key = key.GetBytes(16);            algorithm.IV = key.GetBytes(16);            using (var sourceStream = new MemoryStream(cipherText))            using (var destinationStream = new MemoryStream())            using (var crypto = new CryptoStream(sourceStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read))            {                moveBytes(crypto, destinationStream);                var decryptedBytes = destinationStream.ToArray();                var decryptedMessage = new UnicodeEncoding().GetString(                decryptedBytes);                MessageBox.Show(decryptedMessage);            }        }
复制代码

 

对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

 

 

(二)非对称加密(Asymmetric Cryptography)

非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。

目前最常用的非对称加密算法是RSA算法,是Rivest, Shamir, 和Adleman于1978年发明,他们那时都是在MIT。.NET中也有RSA算法,请看下面的例子:

加密过程:

 

复制代码
        private byte[] rsaCipherText;        private void mnuAsymmetricEncryption_Click(object sender, RoutedEventArgs e)        {            var rsa = 1;            // Encrypt the data.            var cspParms = new CspParameters(rsa);            cspParms.Flags = CspProviderFlags.UseMachineKeyStore;            cspParms.KeyContainerName = "My Keys";            var algorithm = new RSACryptoServiceProvider(cspParms);            var sourceBytes = new UnicodeEncoding().GetBytes(myData);            rsaCipherText = algorithm.Encrypt(sourceBytes, true);            MessageBox.Show(String.Format("Data: {0}{1}Encrypted and Encoded: {2}",                myData, Environment.NewLine,                Convert.ToBase64String(rsaCipherText)));        }
复制代码

 

解密过程:

 

复制代码
        private void mnuAsymmetricDecryption_Click(object sender, RoutedEventArgs e)        {            if(rsaCipherText==null)            {                MessageBox.Show("Encrypt First!");                return;            }            var rsa = 1;            // decrypt the data.            var cspParms = new CspParameters(rsa);            cspParms.Flags = CspProviderFlags.UseMachineKeyStore;            cspParms.KeyContainerName = "My Keys";            var algorithm = new RSACryptoServiceProvider(cspParms);            var unencrypted = algorithm.Decrypt(rsaCipherText, true);            MessageBox.Show(new UnicodeEncoding().GetString(unencrypted));        }
复制代码

 

虽然非对称加密很安全,但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。为了解释这个过程,请看下面的例子:

(1) Alice需要在银行的网站做一笔交易,她的浏览器首先生成了一个随机数作为对称密钥。

(2) Alice的浏览器向银行的网站请求公钥。

(3) 银行将公钥发送给Alice。

(4) Alice的浏览器使用银行的公钥将自己的对称密钥加密。

(5) Alice的浏览器将加密后的对称密钥发送给银行。

(6) 银行使用私钥解密得到Alice浏览器的对称密钥。

(7) Alice与银行可以使用对称密钥来对沟通的内容进行加密与解密了。

 

image_thumb3

 

(三)总结

(1) 对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。

(2) 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。

(3) 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 超级闹钟 时间闹钟 闹钟时钟 小闹钟图片 闹钟闹钟闹钟 闹钟不响 在线闹钟 三星闹钟 买闹钟 机械闹钟 卡通闹钟 闹钟怎么用 我的闹钟 震动闹钟 家用闹钟 网页闹钟 叫醒闹钟 七彩闹钟 定闹钟 数字闹钟 提醒闹钟 时钟闹钟 老式闹钟 手环闹钟 完美闹钟 学习闹钟 圆形闹钟 新型闹钟 美容闹钟 整点闹钟 闹钟卡通 闹钟声 心动闹钟 闹钟定时 世界闹钟 公鸡闹钟 调闹钟 闹钟设计 指环闹钟 设闹钟 跳蛋闹钟