2

我正在尝试将下面的java代码转换为nodejs。

public static String encrypt(String accessToken) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        String merchantKey = "11111111111111111111";
        String st = StringUtils.substring(merchantKey, 0, 16);
        System.out.println(st);
        Key secretKey = new SecretKeySpec(st.getBytes(), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedByte = cipher.doFinal(accessToken.getBytes());

        // convert the byte to hex format
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < encryptedByte.length; i++) {
            sb.append(Integer.toString((encryptedByte[i] & 0xff) + 0x100, 16).substring(1));
        }
        return sb.toString();
    }

这是我能够弄清楚的 -

function freeChargeEncryptAES(token){
    var fcKey = "11111111111111111111".substring(0, 16);
    var cipher = crypto.createCipher('aes-128-ecb', fcKey, "");
    var encrypted = cipher.update(token,'ascii','hex');
    encrypted += cipher.final('hex');
    return encrypted;
}

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

令牌 = “abcdefgh”

Java 代码输出 -bc02de7c1270a352a98faa686f155df3

Nodejs 代码输出 -eae7ec6943953aca94594641523c3c6d

我从这个答案中读到默认加密算法是不需要IV的aes-ecb 。由于密钥长度为 16,我假设aes-128-ecb(16*8 = 128) 是我应该使用的算法。

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

4

1 回答 1

0

只需要改变——

crypto.createCipher('aes-128-ecb', fcKey, "");

crypto.createCipheriv('aes-128-ecb', fcKey, "");

原因很简单 -createCipher方法将第二个参数视为Encryption Password一个Encryption Key.

我的错,即使在阅读了这个答案之后,我也使用了错误的方法(crypto.createCipher 而不是 crypto.createCipheriv)。以下是 nodejs 中的正确工作代码。这都是需要的。

function freeChargeEncryptAES(token){
    var fcKey = "11111111111111111111".substring(0, 16);
    var cipher = crypto.createCipheriv('aes-128-ecb', fcKey, "");
    var encrypted = cipher.update(token,'ascii','hex');
    encrypted += cipher.final('hex');
    return encrypted;
}
于 2016-07-13T13:42:53.873 回答