我尝试使用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);
答案 0 :(得分:2)
每次重新加密纯文本时,都会生成加密安全的IV(初始化向量) - 这很好,每次都应该更改值。 IV可以保持公开,并且与加密密钥无关。
然而,Des不再是一个非常安全的算法,我建议切换到Rijndael或tripple des。
答案 1 :(得分:0)
我建议您使用强对称密钥算法,例如AES(即Rijndael)。看一下.NET中的RijndaelManaged
类。相同的密钥可用于加密和解密,这就是为什么它是对称算法。密钥的安全性至关重要,因此请将其保密并妥善保存。
答案 2 :(得分:0)
与@Ross一样,加密字符串会有所不同,因为每次都应该使用新的 。
但是,您当前的代码每次都使用新的键和 IV 。如果您希望能够在另一台计算机上解密,那么您应该自己设置密钥和IV - 或者在加密时自动生成密钥和IV。
E.g。加密时
byte[] key = sa.Key;
byte[] iv = sa.IV;
ICryptoTransform ct = sa.CreateEncryptor ();
E.g。在解密时(在另一台计算机上)
ICryptoTransform ct = sa.CreateDecryptor (key, iv);
您可以使用加密数据传输IV。当然,秘密密钥应该在带外传输/共享。
答案 3 :(得分:0)
你的问题不是他的密文不同。这实际上是加密方案的一个重要特性。
你的问题要么是重复使用相同的对称算法对象而不重置其状态,或者 - 更有可能,但我无法从代码片段中看出, - 将对称算法重新集成到不同的密钥和iv。 / p>
对于decrypt,生成一个新的对称算法,然后将sa.Key和sa.IV设置为您加密的值中使用的值。重要的是,请确保您安全地存储密钥并确保您的IV是随机的(您需要将其包含在您存储的数据中)。不要硬编码IV。这完全是insecure。
顺便说一句,DES相当不安全(我可以在10年前的3天内尝试所有可能的密钥)。使用AESManaged。此外,加密很难,我不建议你自己做。如果您愿意,可以考虑查看this,它会完成您想要的大部分内容以及更多内容。