我有一个对字符串进行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 "";
}
}如你所见,该算法有两个参数--一个“加密密钥”和一个“初始化向量”。
现在,我需要用Java语言编写一个DES加密/解密函数,与这个函数并行,这样,如果您提供相同的加密密钥和初始化向量,就可以在Java语言中解密在C#中加密的内容。(穿上Java工作服,从上一次使用Java,Googles for DES encryption in Java,到现在已经有10年了…)
找到了一种像样的Java DES加密方法here。但是-哦,天哪,事实证明这个算法坚持使用8字节的初始化向量;.NET代码使用24字节的初始化向量!
这次又是什么?为什么Java坚持使用8字节的初始向量?如何解密使用24字节初始向量加密的内容?
发布于 2011-05-19 22:26:54
您是否尝试过在Java代码中使用24字节初始化向量的前8个字节?通过搜索和查看源代码,我看到的所有东西都表明只会使用前8个字节,因为Triple DES的块大小是8个字节。我真的很惊讶.NET代码没有像this question中提到的那样引发异常,因为IV与算法的块大小不匹配。此外,有关成功使用8字节IV的示例,请参阅this question。
.NET代码中的另一个挑战是填充和密码模式使用默认值。我不知道.NET将使用什么密码模式,尽管注释here指出默认密码模式是CBC。我没有看到提到填充,但是从互操作性示例here来看,CBC和PKCS5Padding似乎可以工作。不过,我不太愿意依赖默认值来实现这样的互操作性,因为它们可能会有问题。
来自Java语言的背景,我真的不确定使用24字节IV的C#代码中发生了什么,但在我看来,由Java执行的8字节IV似乎是正确的。我总是对被证明是错误的并学习一些新的东西感兴趣。@Tim提到的Bouncycastle也实施了同样的约束,似乎.NET通常也会这样做。
发布于 2011-05-19 19:52:37
From MSDN
每当您创建某个SymmetricAlgorithm类的新实例或手动调用GenerateIV方法时,都会将IV属性自动设置为一个新的随机值。IV属性的大小必须与BlockSize属性相同。
因此,在我看来,您只需更改BlockSize属性,然后就可以将IV设置为所需的任何大小。
编辑
根据我在研究中收集的信息,DES加密算法的所有实现似乎都使用8个字节(64位,其中8位被丢弃,剩下56个字节)。TripleDES (3DES)允许24字节的密钥(或192位,其中24位被丢弃,剩下168位)。
看起来您要么需要在Java语言中使用TripleDES算法(有几个库可用,比如example、SO Question),要么需要在.NET中使用常规的DES加密算法对数据进行重新加密。
发布于 2011-05-19 20:31:49
你看过Java的Bouncy Castle库了吗?我不能从他们的(非常稀疏的)文档和示例中判断出来,但它似乎是一个被广泛使用的库,所以我希望它能如此灵活。如果你还没有的话,至少值得一看。
https://stackoverflow.com/questions/6058166
复制相似问题