我放弃尝试研究有关我的问题的解决方案。我已经尽力而为,研究了这个问题,并遇到了与我的问题相同的解决方案(例如https://stackoverflow.com/a/21252990/5328303),但他正在使用aes-128-ecb。
我无法获得适用于es-192-ecb模式的解决方案。
这是node.js部分(请注意,由于这是第三方提供程序,而且我非常有限,我无法更改代码的这一部分。)
console.log(encrypt("hello world"))
function encrypt(data) {
const aesKey = '4327601417486622'
const algorithm = 'aes-192-ecb'
const cipher = crypto.createCipher(algorithm, aesKey)
const crypted = cipher.update(data, 'utf-8', "hex") + cipher.final("hex")
return crypted
}
// expected: 066c47b162cd5c464ea9805742c1af9b
这是我的Java函数:
public static String decrypt(String seed, String encrypted) throws Exception {
byte[] keyb = seed.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(keyb);
SecretKeySpec skey = new SecretKeySpec(thedigest, "AES");
Cipher dcipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, skey);
byte[] clearbyte = dcipher.doFinal(toByte(encrypted));
return new String(clearbyte);
}
如果我在节点代码上使用aes-128-ecb,则上面的Java代码效果很好,但是当我使用aes-192-ecb甚至aes-256-ecb时,它无法解码。
也许我只是不太了解openssl EVP_BytesToKey
函数,因为我读到crypto.createCipher()
在加密时使用了它。它还说它正在用MD5哈希密钥,而我目前正在用Java代码对其进行加密。
我还以为我拥有的aesKey
只有16个字节,这也许就是为什么它不能与AES-192一起使用而仅与AES-128一起使用的原因。我想了解当我仅传递16字节密钥和AES-192所需的24字节密钥时,openssl / crypto是如何做到的,因为我无法更改node.js代码。
我走对了吗?谁能指导我?
谢谢!