Red de conocimiento informático - Material del sitio web - Cómo utilizar el método AES de CryptoJS para cifrar y descifrar

Cómo utilizar el método AES de CryptoJS para cifrar y descifrar

Primero prepare el texto sin formato y la clave secreta:

var PlaintText = 'aaaaaaaaaaaaaaaaaa'; // texto sin formato

var keyStr = 'bbbbbbbbbbbbbbbbbbbbbbbbbb' // La clave general es una cadena

Consultando la documentación del sitio web oficial, el método AES admite AES-128, AES-192 y AES-256. El método de cifrado que se utiliza para el cifrado depende del tipo de clave pasada. De lo contrario, se utilizará AES-256. utilizado para el cifrado.

CryptoJS soporta AES-128, AES-192 y AES-256. Seleccionará una variante según el tamaño de clave que ingrese. Si está utilizando una frase de contraseña, generará una clave de 256 bits.

Dado que Java proporciona una clave de 128 bits, pero como es una cadena, primero debe convertirse a 128 bits en el front-end.

Al principio pensé que usar CryptoJS.enc.Hex.parse la convertiría correctamente a una clave de 128 bits, pero este no es el caso.

Después de muchos intentos, utilice el método CryptoJS.enc.Utf8.parse para convertir la clave a 128 bits. Bueno, como dije múltiples intentos, no sé por qué, lo analizaré un poco más en profundidad más adelante.

// Las claves de tipo cadena deben analizarse usando uft8 antes de usarlas

var key = CryptoJS.enc.Utf8.parse(keyStr);

Porque el El fondo usa PKCS5Padding, pero cuando uso CryptoJS, descubrí que no existe tal compensación. Después de consultar, descubrí que PKCS5Padding y PKCS7Padding son lo mismo. Cuando los uso, el desplazamiento predeterminado se establece de acuerdo con PKCS7Padding.

// Cifrado

var encryptedData = CryptoJS.AES.encrypt(plaintText, clave, {

modo: CryptoJS.mode.ECB,

padding:

padding: CryptoJS.pad.Pkcs7Pkcs7

});

Dado que el texto cifrado generado por CryptoJS es un objeto, si es directamente convertido a La cadena es una cadena codificada en Base64 y la propiedad en encryptedData.ciphertext se convierte en una cadena para que tenga el formato requerido por el backend.

var encryptedBase64Str = encryptedData.toString();

//Salida: RJcecVhTqCHHnlibzTypzuDvG8kjWC ot8JuxWVdLgY=

console.log( encryptedBase64Str);

// Necesitas leer el texto cifrado.

toString() para obtener el mismo texto cifrado que Java

var encryptedStr = encryptedData.ciphertext .toString();

// Salida: 44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06

console log. (encryptedStr);

Dado que el texto cifrado es una cadena de 128 bits, es necesario convertirlo al formato de codificación Base64 al descifrarlo.

Luego, debe usar el método CryptoJS.enc.Hex.parse para convertirlo a hexadecimal, luego usar el método CryptoJS.enc.Base64.stringify para convertirlo en una cadena codificada en Base64 y luego se pasa al método CryptoJS.AES.decrypt para descifrarlo.

//Método CryptoJS.AES.decrypt.

//Primero debes analizar la cadena

var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr);

//Convierte el texto cifrado a Cadena Base64

// Solo se puede descifrar texto cifrado Base64.

// Solo se pueden descifrar cadenas Base64

var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);

Solo use CryptoJS entrante. La cadena Base64 del método AES.decrypt se puede descifrar.

//Decryption

var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, clave, {

modo: CryptoJS.mode.ECB,

padding.CryptoJS.pad.Pkcs7

});

Después de que CryptoJS lo descifra, sigue siendo un objeto y, para convertirlo a texto sin cifrar, debe convertirlo. a la cadena de formato Utf8.

// Después del descifrado, el texto plano debe convertirse en una cadena que se ajuste al formato Utf8

var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8)// 'aaaaaaaaaaaaaaaaaaaaa '