1

我正在尝试将下面的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;

我无法获得相同的输出。例如,如果

密码=“密码01”

Java 代码输出 - fe0facbf8d458adaa47c5fe430cbc0ad

Nodejs 代码输出 - ae5e8238c929b5716566e97fa35efb9b

有人可以帮我解决问题吗??

4

1 回答 1

1

请注意,crypto.createCipher(algorithm, password[, options])它已被弃用,不应使用。

SecretKeySpec(..)java中以二进制密钥作为输入的地方,js中的createCipher(..)以“密码”作为输入,并且在幕后尝试使用MD5派生二进制密钥。因此,您在两个程序中使用的实际密钥最终会有所不同。js 方法还尝试从密码中派生 IV,这是不好的做法,并且与您的 java 代码不同。

在 js 中,您需要使用crypto.createCipheriv(). 当您使用它时,您还需要考虑是否需要 iv - 在 Java 和 js 中。

于 2019-10-31T12:33:20.027 回答