Cifrado cryptoJS AES y problemas encontrados

Primero, debe descargar el complemento cryptoJS en el proyecto

npm i crypto-js -s

Introducir

import CryptoJS from 'crypto-js'

Encapsular una función de cifrado. El cifrado AES requiere el texto original, la clave secreta y el desplazamiento que deben cifrarse con estos tres parámetros, y el modo y el relleno deben ser coherentes con el fondo. Yo uso el modo EBC y el método de relleno de Pkcs5. Hay Pkcs5 y Mire el método de llenado de Pkcs7, así que escribiré Pkcs7 para el método de llenado del siguiente código (el llenado de Pkcs5 no se proporciona directamente en el complemento), porque es el modo EBC, sin compensación

export function encrypt(data,key,iv){
    
    
    var encrypted =CryptoJS.AES.encrypt(data,key,{
    
    
    //iv:iv
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString().replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"");    //返回base64格式字符串 根据需要做字符串操作
}

Pero después de cargar a través de la interfaz, el fondo reportó tal error
Dado que el bloque final no se rellenó correctamente Después de
un análisis cuidadoso, no es difícil encontrar que la excepción fue lanzada durante el descifrado.

Dado que Java se proporciona de acuerdo con 128 bits, pero debido a que es una cadena, primero debe convertirse a 128 bits en la interfaz. Debe utilizar el método CryptoJS.enc.Utf8.parse para convertir la clave a 128 bits.

key =Crypto.enc.Utf8.parse(key)

Sin embargo, después de que la clave se convirtió a 128 bits, el fondo aún informaba el error en este momento. Así que pensé en el método de llenado. Luego utilicé el sitio web de encriptación AES en línea y descubrí que si la clave secreta es de 16 bits, la cadena encriptada regresa es igual que mi local La generada es la misma, si la clave secreta es menor a 16 bits, es diferente. A continuación, se determina que debe haber un problema con el método de llenado, entonces le pregunté a nuestros antecedentes, cuál se completa con \ x00 (supongo que es posible que el complemento se complete con \ xff, después de todo, no sé mucho al respecto), encapsulado una función de tecla de relleno

function fillKey(key, keySize) {
    
    
    keySize = keySize || 128;
    var filledKey = Buffer.alloc(keySize / 8);
    var keys = Buffer.from(key);
    if (keys.length < filledKey.length) {
    
    
        for (var i = 0; i < filledKey.length; i++) {
    
    
            if (i<keys.length){
    
    
                filledKey[i] = keys[i];
            }

        }
    }
    return filledKey;

Entonces la presentación es exitosa

Código completo

import CryptoJS from 'crypto-js'
function fillKey(key, keySize) {
    
    
    keySize = keySize || 128;
    var filledKey = Buffer.alloc(keySize / 8);
    var keys = Buffer.from(key);
    if (keys.length < filledKey.length) {
    
    
        for (var i = 0; i < filledKey.length; i++) {
    
    
            if (i<keys.length){
    
    
                filledKey[i] = keys[i];
            }

        }
    }
    console.log(filledKey)
    return filledKey;
}
export function encrypt(data,key){
    
    
    console.log("oldvalue="+key)
    console.log("newValue="+data)
    key=fillKey(key)
    key  = CryptoJS.enc.Utf8.parse(key);
    var encrypted =CryptoJS.AES.encrypt(data,key,{
    
    
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString().replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"");    //
}

Parte del valor impreso se reserva para observar el efecto.

Supongo que te gusta

Origin blog.csdn.net/weixin_38987500/article/details/113972068
Recomendado
Clasificación