首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java和.NET中的DES加密-为什么不同?

Java和.NET中的DES加密-为什么不同?
EN

Stack Overflow用户
提问于 2011-05-19 19:49:01
回答 3查看 3.3K关注 0票数 5

我有一个对字符串进行DES加密的.NET方法:

代码语言:javascript
复制
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字节初始向量加密的内容?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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通常也会这样做。

票数 2
EN

Stack Overflow用户

发布于 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算法(有几个库可用,比如exampleSO Question),要么需要在.NET中使用常规的DES加密算法对数据进行重新加密。

票数 2
EN

Stack Overflow用户

发布于 2011-05-19 20:31:49

你看过Java的Bouncy Castle库了吗?我不能从他们的(非常稀疏的)文档和示例中判断出来,但它似乎是一个被广泛使用的库,所以我希望它能如此灵活。如果你还没有的话,至少值得一看。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6058166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档