这是Java和Node.js中的完整示例,它们使用相同的keys / iv / plaintext并会产生相同的结果。
爪哇
import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import javax.xml.bind.DatatypeConverter;import java.nio.charset.StandardCharsets;class AES{ public AES() { } public String encrypt(String plainText, String keybase64, String ivbase64) throws Exception { byte[] plainTextArray = plainText.getBytes(StandardCharsets.UTF_8); byte[] keyArray = DatatypeConverter.parsebase64Binary(keybase64); byte[] iv = DatatypeConverter.parsebase64Binary(ivbase64); SecretKeySpec secretKey = new SecretKeySpec(keyArray, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv)); return new String(DatatypeConverter.printbase64Binary(cipher.doFinal(plainTextArray))); } public String decrypt(String messagebase64, String keybase64, String ivbase64) throws Exception { byte[] messageArray = DatatypeConverter.parsebase64Binary(messagebase64); byte[] keyArray = DatatypeConverter.parsebase64Binary(keybase64); byte[] iv = DatatypeConverter.parsebase64Binary(ivbase64); SecretKey secretKey = new SecretKeySpec(keyArray, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv)); return new String(cipher.doFinal(messageArray)); } public static void main(String[] args) { try { String plainText = "Hello world!"; String encryptionKeybase64 = "DWIzFkO22qfVMgx2fIsxOXnwz10pRuZfFJBvf4RS3eY="; String ivbase64 = "AcynMwikMkW4c7+mHtwtfw=="; AES AES = new AES(); String cipherText = AES.encrypt(plainText, encryptionKeybase64, ivbase64); String decryptedCipherText = AES.decrypt(cipherText, encryptionKeybase64, ivbase64); System.out.println("Plaintext: " + plainText); System.out.println("Ciphertext: " + cipherText); System.out.println("Decrypted text: " + decryptedCipherText); } catch (Exception e) { System.out.println(e.toString()); } }}Node.js
var crypto = require('crypto');function getAlgorithm(keybase64) { var key = Buffer.from(keybase64, 'base64'); switch (key.length) { case 16: return 'aes-128-cbc'; case 32: return 'aes-256-cbc'; } throw new Error('Invalid key length: ' + key.length);}function encrypt(plainText, keybase64, ivbase64) { const key = Buffer.from(keybase64, 'base64'); const iv = Buffer.from(ivbase64, 'base64'); const cipher = crypto.createCipheriv(getAlgorithm(keybase64), key, iv); let encrypted = cipher.update(plainText, 'utf8', 'base64') encrypted += cipher.final('base64'); return encrypted;};function decrypt (messagebase64, keybase64, ivbase64) { const key = Buffer.from(keybase64, 'base64'); const iv = Buffer.from(ivbase64, 'base64'); const decipher = crypto.createDecipheriv(getAlgorithm(keybase64), key, iv); let decrypted = decipher.update(messagebase64, 'base64'); decrypted += decipher.final(); return decrypted;}var keybase64 = "DWIzFkO22qfVMgx2fIsxOXnwz10pRuZfFJBvf4RS3eY=";var ivbase64 = 'AcynMwikMkW4c7+mHtwtfw==';var plainText = 'Why, then, ’tis none to you, for there is nothing either good or bad, but thinking makes it so';var cipherText = encrypt(plainText, keybase64, ivbase64);var decryptedCipherText = decrypt(cipherText, keybase64, ivbase64);console.log('Algorithm: ' + getAlgorithm(keybase64));console.log('Plaintext: ' + plainText);console.log('Ciphertext: ' + cipherText);console.log('Depred Ciphertext: ' + decryptedCipherText);


