OpenSSL DESIEDE2BCBC到java

n3h0vuf2  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(199)

关闭。这个问题需要详细或明确。它目前不接受答案。
**想改进这个问题吗?**编辑这篇文章,添加细节并澄清问题。

6小时前关门了。
改进这个问题
我被要求为C++编写一个非常古老的TCP服务器的客户端,它使用OpenSSL的DESIEDE22CBCycRyt进行加密。虽然我可以访问服务器的代码,但更改它不是一个选项。新的客户机必须用java实现,我目前一直在寻找等效的密码来加密/解密数据。除此之外,我还尝试了desede/cbc/pkcs5p通过添加前8个字节将密钥扩展到24个字节,但没有成功(服务器无法解密客户端数据,客户端无法解密服务器数据)。

//Client side
    var origin = ...; //A random 16-byte key
    var key = new byte[24];
    System.arraycopy(origin, 0, key, 0, origin.length);
    System.arraycopy(origin, 0, key, origin.length, 8);

    var desKeySpec = new DESedeKeySpec(key);
    var keyFactory = SecretKeyFactory.getInstance("DESede");
    var secretKey = keyFactory.generateSecret(desKeySpec);

    var cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey , new IvParameterSpec(new byte[8]));
    var encrypted = cipher.doFinal(details);
//Server side
    #include <openssl/des.h>

    des_cblock ivec;
    des_key_schedule ks1, ks2;
    des_cblock key1, key2;
    char *source= ...;
    char *destination = ...;
    int destinationLen = ...;
    char *key = ...; //origin key of 16 bytes

    DES_string_to_2keys(origin, &key1, &key2);
    DES_set_odd_parity(&key1);
    DES_set_odd_parity(&key2);
    DES_set_key_unchecked(&key1, &ks1);
    DES_set_key_unchecked(&key2, &ks2);

    bzero(&ivec, sizeof(ivec));

    DES_ede2_cbc_encrypt(source, destination, destinationLen, &ks1, &ks2, &ivec, DES_DECRYPT);

从<openssl/des.h>:


# define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \

        DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))

这个东西在java中可以工作吗?谢谢你的帮助

编辑:

样本键(十六进制):c9e1a0031a70614ab7267594591200be
加密数据示例(十六进制):79EA9D64D96F6BF58E08A41A1B8BDABB1CC0B4F5313 FEE5A113EC30B0EF6527B28EB2DFEAC61A5C2C31BE6BA76D6B190
预期解密数据示例(普通):0C3503432303435303631393409313632303738303332

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题