2016-12-01 50 views
3

我有一個用於AES加密和解密的Java算法,必須在JavaScript中實現解密。加密JAVA到node.js

public static final String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding"; 
public static String wrap(String clearText, String key) { 
    byte[] iv = getIv(); 

    byte[] cipherText = encrypt(clearText, key, iv); 
    byte[] wrapped = new byte[iv.length + cipherText.length]; 
    System.arraycopy(iv, 0, wrapped, 0, iv.length); 
    System.arraycopy(cipherText, 0, wrapped, 16, cipherText.length); 

    return new String(Base64.encodeBase64(wrapped)); 
} 

private static byte[] encrypt(String clearText, String key, byte[] iv) { 
    try { 
     Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM); 
     AlgorithmParameters params = AlgorithmParameters.getInstance("AES"); 
     params.init(new IvParameterSpec(iv)); 
     cipher.init(Cipher.ENCRYPT_MODE, getKey(key), params); 
     return cipher.doFinal(clearText.getBytes()); 
    } catch (GeneralSecurityException e) { 
     throw new RuntimeException("Failed to encrypt.", e); 
    } 
} 

private static SecretKeySpec getKey(String key) { 
    try { 
     return new SecretKeySpec(Hex.decodeHex(key.toCharArray()), "AES"); 
    } catch (DecoderException e) { 
     throw new RuntimeException("Failed to generate a secret key spec", e); 
    } 
} 

private static byte[] getIv() { 
    byte[] iv = new byte[16]; 
    new SecureRandom().nextBytes(iv); 

    return iv; 
} 

我已經寫了JavaScript代碼,但它產生不正確的結果:

var responseBody = JSON.stringify({"key":"215467ryhfdjeu8373t4"}); 
var initializationVector = crypto.randomBytes(16); 
key = new Buffer(key.substring(0,32), 'hex'); 
var cipher = crypto.createCipheriv('aes-128-cbc', key, iv); 
var encrypted = cipher.update(new Buffer(responseBody)) +  cipher.final('hex'); 
var encoded = new Buffer(initializationVector+encrypted, 'binary'); 
return encoded; 

能否請你幫我改寫的Java包功能的JavaScript(的NodeJS)?

回答

1

問題已修復。

問題在於緩衝區的連接。運營商「+」不正確。需要使用默認方法。

Buffer.concat([initializationVector, encrypted])