zoukankan      html  css  js  c++  java
  • 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法

          非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥。
          非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
          非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
          在非对称加密中使用的主要算法有:RSAElgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法。
           在传输过程中,即使攻击者截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。
    同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密。
     
     
      非对称加密算法与对称加密算法的区别
    首先,用于消息解密的密钥值与用于消息加密的密钥值不同;
    其次,非对称加密算法比对称加密算法慢数千倍,但在保护通信安全方面,非对称加密算法却具有对称密码难以企及的优势。
    为说明这种优势,使用对称加密算法的例子来强调:
    Alice使用密钥K 加密消息并将其发送给Bob,Bob收到加密的消息后,使用密钥K对其解密以恢复原始消息。这里存在一个问题,即Alice如何将用于加密消息的密钥值发 送给 Bob?答案是,Alice发送密钥值给Bob时必须通过独立的安全通信信道(即没人能监听到该信道中的通信)。
    这种使用独立安全信道来交换对称加密算法密钥的需求会带来更多问题:
    首先,有独立的安全信道,但是安全信道的带宽有限,不能直接用它发送原始消息。
    其次,Alice和Bob不能确定他们的密钥值可以保持多久而不泄露(即不被其他人知道)以及何时交换新的密钥值
    当然,这些问题不只Alice会遇到,Bob和其他每个人都会遇到,他们都需要交换密钥并处理这些密钥管理问题(事实上,X9.17是一项DES密钥管理ANSI标准[ANSIX9.17])。如果Alice要给数百人发送消息,那么事情将更麻烦,她必须使用不同的密钥值来加密每条消息。例如,要给
    非对称加密算法 非对称加密算法
    200个人发送通知,Alice需要加密消息200次,对每个接收方加密一次消息。显然,在这种情况下,使用对称加密算法来进行安全通信的开销相当大。
    非对称加密算法的主要优势就是使用两个而不是一个密钥值:一个密钥值用来加密消息,另一个密钥值用来解密消息。这两个密钥值在同一个过程中生成,称为密钥对。用来加密消息的密钥称为公钥,用来解密消息的密钥称为私钥。用公钥加密的消息只能用与之对应的私钥来解密,私钥除了持有者外无人知道,而公钥却可通过非安全管道来发送或在目录中发布。
    Alice需要通过电子邮件给Bob发送一个机密文档。首先,Bob使用电子邮件将自己的公钥发送给Alice。然后Alice用Bob的公钥对文档加密并通过电子邮件将加密消息发送给Bob。由于任何用Bob 的公钥加密的消息只能用Bob的私钥解密,因此即使窥探者知道Bob的公钥,消息也仍是安全的。Bob在收到加密消息后,用自己的私钥进行解密从而恢复原始文档。
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    (一)对称加密(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)
    1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”。相对于“对称加密算法”这种方法也叫做“非对称加密算法”。
    非 对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(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与银行可以使用对称密钥来对沟通的内容进行加密与解密了。

    (三)总结
    (1) 对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。
    (2) 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
    (3) 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
  • 相关阅读:
    java怎样将一组对象传入Oracle存储过程
    android webview内容压线问题解决方法
    BS和CS对比
    【OpenCV-Python】Python Extension Packages for Windows
    hdu4462 Scaring the Birds
    tomcat安全配置之证书密码加密存储
    UVA 10714 Ants 蚂蚁 贪心+模拟 水题
    一个不喜欢读书的Javaer的读书单
    二叉树可视化--Graphviz
    [置顶] mmog游戏开发之业务篇
  • 原文地址:https://www.cnblogs.com/timssd/p/5147488.html
Copyright © 2011-2022 走看看