2

我正在编写一个最初用 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 代码需要两个密钥,JCE 需要一个。我该如何调和这个?只需将两者附加到一个数组中?按什么顺序?
  • 什么转换规范(如果有的话!)相当于 OpenSSL 的 des_ede2_ofb64_encrypt?除了在互联网上询问陌生人之外,我怎么知道?;)
4

1 回答 1

2

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

您应该使用 getInstance("DESede/OFB64/NoPadding") 获得相同的结果,并将 key1 设为 DESede 密钥的第 8 个字节,将 key2 设为第 2 个字节,将 key1 设为第 3 个字节。

于 2010-02-08T13:29:59.667 回答