我正在尝试将以下Java代码转换为nodejs。
private static String TRANS_MODE = "Blowfish";
private static String BLOWFISH_KEY = "BLOWFISH_KEY";
public static String encrypt(String password) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(BLOWFISH_KEY.getBytes("Windows-31J"),TRANS_MODE);
Cipher cipher;
cipher = Cipher.getInstance(TRANS_MODE);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] passByte;
passByte = cipher.doFinal(password.getBytes("Windows-31J"));
return new String(Hex.encodeHex(passByte));
}
这是我能弄清楚的-
const crypto = require('crypto');
function encrypt(password)
var fcKey = "BLOWFISH_KEY";
var cipher = crypto.createCipher('BF-CBC', fcKey, "");
var encrypted = cipher.update(password,'ascii','hex');
encrypted += cipher.final('hex');
return encrypted;
我无法获得相同的输出。例如,如果
password =“ password01”
Java代码输出-fe0facbf8d458adaa47c5fe430cbc0ad
Nodejs代码输出-ae5e8238c929b5716566e97fa35efb9b
有人可以帮我解决问题吗?
注意crypto.createCipher(algorithm, password[, options])
已过时,不应使用。
Java中的SecretKeySpec(..)
将二进制密钥作为输入,而js中的createCipher(..)将“密码”作为输入,并且在后台尝试使用MD5派生二进制密钥。因此,您在两个程序中使用的实际密钥最终会有所不同。 js方法也尝试从密码中获取IV,这是一种错误做法,与您的Java代码不同。
在js中,您需要改用crypto.createCipheriv()
。而且,当您使用它时,还需要考虑是否需要使用iv-在Java和js中都可以。