Nodejs crypto Javascript中的javax.crypto.Cipher等效代码

Nodejs crypto Javascript中的javax.crypto.Cipher等效代码,java,node.js,encryption,encryption-symmetric,javax.crypto,Java,Node.js,Encryption,Encryption Symmetric,Javax.crypto,我正在尝试将下面的java代码转换为NodeJ public static String encrypt(String accessToken) throws Exception { Cipher cipher = Cipher.getInstance("AES"); String merchantKey = "11111111111111111111"; String st = StringUtils.substring(merchantKey,

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

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();
    }
我无法获得相同的输出。例如,如果

token=“abcdefgh”

Java代码输出-bc02de7c1270a352a98faa686f155df3

节点代码输出-eae7ec6943953aca94594641523c3c6d

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

有人能帮我解决这个问题吗???

我需要改变一下-

crypto.createCipher('aes-128-ecb',fcKey,“”)

crypto.createCipheriv('aes-128-ecb',fcKey,“”)

原因很简单-
createCipher
方法将第二个参数视为
加密密码
,而它是一个
加密密钥

我的缺点是,即使在阅读之后,我也使用了错误的方法(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;
}
只是需要改变-

crypto.createCipher('aes-128-ecb',fcKey,“”)

crypto.createCipheriv('aes-128-ecb',fcKey,“”)

原因很简单-
createCipher
方法将第二个参数视为
加密密码
,而它是一个
加密密钥

我的缺点是,即使在阅读之后,我也使用了错误的方法(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;
}

永远不要使用。它是确定性的,因此在语义上不安全。您至少应该使用随机模式,如或。最好是对密文进行身份验证,这样就不可能进行类似的攻击。这可以通过像GCM或EAX这样的认证模式来实现,也可以通过一个方案来实现。IV必须是不可预测的(读:随机的)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密,所以你可以把它和密文一起发送。通常,它只是在密文前面加上前缀,然后在解密之前切掉。@ArtjomB,谢谢你提供的信息,但我的用例不同。我只想将上面的java代码转换为nodejs。java实现没有指定算法,但默认情况下Oracle java JCE提供程序使用ECB。从不使用。它是确定性的,因此在语义上不安全。您至少应该使用随机模式,如或。最好是对密文进行身份验证,这样就不可能进行类似的攻击。这可以通过像GCM或EAX这样的认证模式来实现,也可以通过一个方案来实现。IV必须是不可预测的(读:随机的)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密,所以你可以把它和密文一起发送。通常,它只是在密文前面加上前缀,然后在解密之前切掉。@ArtjomB,谢谢你提供的信息,但我的用例不同。我只想将上面的java代码转换为nodejs。java实现没有指定算法,但默认情况下Oracle java JCE提供程序使用ECB。