记Triple DEA加密在C#与Java之中的一些调用差异

CodeingBoy 2月 07, 2017

最近在将C#源码转换到到 Java 源码的时候,碰到一个使用 Triple DEA 加密算法的函数:
 

搜索了一下上述代码在 Java 中的对应实现,可以得到以下的 Java 代码:

这里有两个坑:

  1. C# 中的

     

    是 UTF-16LE 的编码,不注意看 IntelliSense 的话可能就以为是 UTF-8 编码了。

  2. 代码中有关密钥的是这么一行

     

    这里的 key_bytes我传入了一个 length 为 16 的 byte 数组,但是在 Java 之中我想故技重施就会提示:Invalid key length: 16 bytes,提示密钥长度不足,实际需要传入 length 为 24 的 byte[]。
    最初我使用了 0 来填充剩余的 8 个 byte,但是发现在 Java 中加密后的字符串与 C# 中的不同,但长度相同,因此可能是密钥不对。
    多番搜索后,而在StackOverflow 中的一个问题回答提到:

    DES would expect an 8 byte key (with parity). So Triple DES expects a 24 byte key (with parity). Since you only have a 16 byte key, you have to replicate some of it, to get the final key. Oftentimes the first and last 8 bytes are the same.

    于是将代码改为以下实现:
     

    问题解决!

本文采用 CC BY-NC-SA 3.0 协议进行许可,在您遵循此协议的情况下,可以自由共享与演绎本文章。
本文链接:https://blog.codeingboy.me/some-difference-about-tdea-between-csharp-and-java/

发表评论

电子邮件地址不会被公开。 必填项已用*标注