关闭。这个问题需要详细或明确。它目前不接受答案。
**想改进这个问题吗?**编辑这篇文章,添加细节并澄清问题。
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
暂无答案!
目前还没有任何答案,快来回答吧!