【发布时间】:2011-08-28 19:50:54
【问题描述】:
我有一个对字符串进行 DES 加密的 .NET 方法:
public static string EncryptTripleDES(string value, byte[] encryptionKey, byte[] initializationVector) {
if (!value.IsNullOrEmpty()) {
TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider();
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, cryptoProvider.CreateEncryptor(encryptionKey, initializationVector), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cs);
sw.Write(value);
sw.Flush();
cs.FlushFinalBlock();
ms.Flush();
//convert back to a string
return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
} else {
return "";
}
}
如您所见,该算法采用 2 个参数 - 一个“加密密钥”和一个“初始化向量”。
现在我需要用 Java 编写一个 DES 加密/解密函数,与这个函数并行,这样,如果您提供相同的加密密钥和初始化向量,您将能够在 Java 中解密用 C# 加密的东西。 (穿上 Java 工作服,自上次使用 Java 以来大约 10 年的灰尘,谷歌在 Java 中进行 DES 加密......)
找到了一个不错的 Java DES 加密方法here。但是 - 哦,天哪,事实证明这个算法坚持使用正好 8 个字节的初始化向量; .NET 代码使用 24 字节的初始化向量!
现在呢?为什么 Java 坚持使用 8 字节的初始化向量?以及如何解密使用 24 字节初始化向量加密的内容?
【问题讨论】:
-
如果您因为需要安全性而加密此数据并且需要使用 DES 版本,我会选择 168 位的 TripleDES,而不是 56 位的标准 DES。如果您有出于任何原因需要保护的数据,标准 DES 太容易被破解。
标签: c# java encryption cryptography