java - 此 C OpenSSL 加密函数的 Java JCE 等价物是什么?

标签 java c encryption openssl jce

我正在编写一个最初用 C 编写的应用程序的 Java 实现。我无法修改 C 版本,并且 Java 版本必须与 C 版本共享加密数据。

这里是C加密代码的相关部分:

makekeys(password,&key1,&key2); /* turns password into two 8 byte arrays */
fill_iv(iv); /* bytes 8 bytes of randomness into iv */
des_key_sched(&key1,ks1);
des_key_sched(&key2,ks2);
des_ede2_ofb64_encrypt(hashed,ctext,hashedlen,ks1,ks2,
                       &iv,&num);

我可以看到 JCE 等价物是这样的:

SecretKey key = new SecretKeySpec(keyBytes, "DESede");
IvParameterSpec iv = new IvParameterSpec(new byte[8]);
Cipher cipher = Cipher.getInstance("DESede/?????/?????"); // transformation spec?
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] cipherTextBytes = cipher.doFinal(plaintext);

问题:

  • C 代码需要两个 key ,JCE 需要一个。我该如何调和呢?只是将两者附加到一个数组中?按什么顺序?
  • 什么转换规范(如果有的话!)等同于 OpenSSL 的 des_ede2_ofb64_encrypt?除了在 Internet 上询问陌生人之外,我如何才能找到答案? ;)

最佳答案

要回答您的最后一个问题,您可以通过阅读有关特定算法本身的文档来找到答案。 Sun 文档通常假设您已经熟悉主题。在这种情况下,你会知道:三重DES是三个独立加密的DES ECB实例依次应用;最常见的方法是称为 DES ede,这意味着第一个和第三个 DES 实例在加密方向运行,而第二个 DES 实例在解密方向运行; ede3 3 表示每个 DES 实例都是独立加密的,ede2 表示第一个和第三个实例使用相同的 key ; OFB64表示64位输出反馈模式。

您应该使用 getInstance("DESede/OFB64/NoPadding") 获得相同的结果,并将 key1 设置为 DESede key 的第一个 8 字节,将 key2 设置为第二个,将 key1 设置为第三个。

关于java - 此 C OpenSSL 加密函数的 Java JCE 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2221577/

相关文章:

java - 为什么 OptionalInt 类中没有 mapToInt() ?

c - 浮点运算 "<"、 ">"是否可交换?

c - printf 如何发出编译器警告?

git - git push 和 pulls 是否加密?

encryption - 在内存和存储受限的系统上加密和/或解密大文件 (AES),使用 "catastrophe recovery"

java - 如何创建一个简单的 OSGI 模块

java - 如何使用 JAVA 从 mySQL 数据库中提取 BLOB(从二维数组到 BLOB)

java - 从 java.lang.reflect.Method 对象获取方法引用

c - 打印 C 中结构数组中每个结构成员的函数

javascript - 我应该加密哪些数据以创建安全的 ajax 调用?