【问题标题】:encrypt using System.Security.Cryptography using DES class c#使用 DES 类 c# 使用 System.Security.Cryptography 进行加密
【发布时间】:2011-10-25 15:07:24
【问题描述】:

我试图用System.Security.Cryptography.DES加密一个字符串,但我发现每次运行程序时,加密的结果都会改变! 我不知道每次运行应用程序时如何获得相同的结果?是否有不变的键或其他任何添加来获得相同的结果? 我想在这段代码中输入“google”时

byte[] plaintextBytes = (new UnicodeEncoding()).GetBytes(expireddate);
            SymmetricAlgorithm sa = DES.Create();
            MemoryStream msEncrypt = new MemoryStream();
            CryptoStream csEncrypt = new CryptoStream(msEncrypt, sa.CreateEncryptor(), CryptoStreamMode.Write);
            csEncrypt.Write(plaintextBytes, 0, plaintextBytes.Length);
            csEncrypt.Close();
            byte[] encryptedTextBytes = msEncrypt.ToArray();

当我在下次打开应用程序时输入字节数组的结果时,从此代码中获取“google”?

MemoryStream msDecrypt = new MemoryStream(decodedlistbyte.ToArray());
            CryptoStream csDecrypt = new CryptoStream(msDecrypt, sa.CreateDecryptor(), CryptoStreamMode.Read);
            byte[] decryptedTextBytes = new Byte[decodedlistbyte.Count];
            csDecrypt.Read(decryptedTextBytes, 0, decodedlistbyte.Count);
            csDecrypt.Close();
            msDecrypt.Close();
            string decrypteddate = (new UnicodeEncoding()).GetString(decryptedTextBytes);

【问题讨论】:

  • 您可能每次都在更换盐。 (这是正确的做法!)
  • 但加密后我会在另一台电脑上解密,所以解密的结果一定是我在加密时输入的!!!
  • 您必须保持安全和私密的密钥,您可以以纯文本形式保存并分享的盐。
  • 顺便说一句,salt== 初始化向量。而且 Des 不是最安全的算法,最好使用三重 des 甚至更好的 Rijndael

标签: c# encryption cryptography des


【解决方案1】:

每次重新加密纯文本时,您都会生成一个加密安全的 IV(初始化向量) - 这很好,并且每次都应该更改该值。 IV 可以公开,不应与加密密钥相关。

但是,Des 不再是一种非常安全的算法,我建议切换到 Rijndael 或tripple des。

【讨论】:

  • 好吧,算法没问题,重要的是当我在另一台电脑上运行解密应用程序时,我想取回字符串,而我从加密中获得的字节数组相同
  • 不,那不是他的问题。如果他只是搞砸了 IV,那么只有他的数据的第一部分会是垃圾,回想一下 CBC 模式解密的工作原理。
【解决方案2】:

我建议您使用强大的对称密钥算法,例如 AES(即 Rijndael)。查看 .NET 中的 RijndaelManaged 类。相同的密钥可用于加密和解密,这就是它是对称算法的原因。密钥的安全性至关重要,因此请将其保密并安全存储。

【讨论】:

    【解决方案3】:

    就像@Ross 所说的加密字符串会有所不同,因为每次都应该使用一个新的 IV

    但是,您当前的代码每次都使用新的 KeyIV。如果您希望能够在另一台计算机上解密,那么您应该自己设置密钥和 IV - 或者在加密时自动生成一个。

    例如加密时

    byte[] key = sa.Key;
    byte[] iv = sa.IV;
    ICryptoTransform ct = sa.CreateEncryptor ();
    

    例如解密时(在另一台计算机上)

    ICryptoTransform ct = sa.CreateDecryptor (key, iv);
    

    您可以使用加密数据传输 IV。当然,secret 密钥应该在带外传输/共享。

    【讨论】:

      【解决方案4】:

      你的问题不在于他的密文不同。这实际上是加密方案的一个重要属性。

      您的问题是您正在重用相同的对称算法对象而不重置其状态,或者 - 更有可能,但我无法从 sn-p 判断, - 使用不同的密钥和 iv 重新集成对称算法.

      对于解密,生成一个新的对称算法,然后将 sa.Key 和 sa.IV 设置为您加密时使用的值。重要的是,确保您安全地存储密钥并确保您的 IV 是随机的(您需要将其包含在您存储的数据中)。不要对 IV 进行硬编码。那完全是insecure

      顺便说一句,DES 相当不安全(我可以在 10 年前的大约 3 天内尝试所有可能的密钥)。使用 AES 管理。此外,加密很难,我不建议你自己做。如果您确实想要,请考虑查看this,它可以满足您的大部分需求,而且还可以做更多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 2014-01-08
        • 1970-01-01
        相关资源
        最近更新 更多