代码之家  ›  专栏  ›  技术社区  ›  slim

这个C OpenSSL加密函数的JavaJCE等价物是什么?

  •  2
  • slim  · 技术社区  · 15 年前

    我正在编写一个Java应用程序,最初是用C编写的。我不能修改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-u加密吗?除了在网上问陌生人,我怎么知道?;)
    1 回复  |  直到 15 年前
        1
  •  2
  •   President James K. Polk    15 年前

    在回答最后一个问题时,您可以通过阅读特定算法本身的文档来找到答案。Sun Docs通常认为您已经熟悉了主题。在这种情况下,您会知道:三重DES是三个独立键控的DES ECB实例的顺序应用;最常见的方法是所谓的DES EDE,这意味着第一个和第三个DES实例在加密方向上运行,而第二个DES实例在解密方向上运行;EDE3 3意味着EAch-des实例是独立键控的,ede2表示第一个和第三个实例使用相同的键;b64表示64位输出反馈模式。

    您应该使用getinstance(“desede/ofb64/nopadding”)获得相同的结果,并将key1设置为desede键的前8个字节,key2设置为第2个字节,key1设置为第3个字节。