|
|
Publicado en 7/10/2017 17:39:00
|
|
|
|

Recientemente, hice una función de inicio de sesión después de la simulación, la contraseña de inicio de sesión está cifrada por CryptoJS aes, y luego quiero escribir el algoritmo correspondiente en C# Introducción al algoritmo de cifrado AES:
El Estándar Avanzado de Cifrado (abreviatura: AES), también conocido como cifrado de Rijndael en criptografía, es un estándar de cifrado por bloques adoptado por el gobierno federal de Estados Unidos. Este estándar se utiliza para reemplazar el DES original y ha sido analizado y ampliamente utilizado en todo el mundo. Tras un proceso de selección de cinco años, el Estándar Criptográfico Avanzado fue publicado por el Instituto Nacional de Estándares y Tecnología (NIST) en FIPS PUB 197 el 26 de noviembre de 2001, y se convirtió en un estándar válido el 26 de mayo de 2002. En 2006, el Estándar de Cifrado Avanzado se convirtió en uno de los algoritmos más populares para la criptografía de claves simétricas. El algoritmo js es el siguiente:
He buscado sitios web de cifrado AES en Internet y los resultados son diferentes a los míos, AES parece tener muchos modos, y he visto presentaciones de otras personas en Internet
Empieza preparando un texto plano y una clave: var plaintText = 'aa'; Texto plano var keyStr = 'bbbbbbbbbbbbbb'; Generalmente, la clave es una cadena Según la documentación oficial del sitio web, el método AES soporta AES-128, AES-192 y AES-256, y el método de cifrado utilizado en el proceso de cifrado depende del tipo de clave entrante, de lo contrario se cifrará según AES-256. CryptoJS es compatible con AES-128, AES-192 y AES-256. Elegirá la variante según el tamaño de la clave que pases. Si usas una frase de paso, entonces generará una clave de 256 bits. Como Java se da según 128 bits, pero al ser una cadena, debe convertirse a 128 bits en el frontend. Al principio pensé que usar CryptoJS.enc.Hex.parse lo convertiría correctamente a una clave de 128 bits. Pero por lo demás... Tras varios intentos, necesitas usar el método CryptoJS.enc.Utf8.parse para convertir la clave a 128 bits. Bueno, dado que se dice que son múltiples intentos, entonces la razón no se conoce y se estudiará más a fondo más adelante. Antes de usar la tonalidad del tipo de cuerda, necesitas analizar con uft8 antes de poder usarla var key = CryptoJS.enc.Utf8.parse(keyStr); Como el backend utiliza PKCS5Padding, pero al usar CryptoJS, se comprobó que no había ningún desplazamiento. Cifrado var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { modo: CryptoJS.mode.ECB, relleno: CryptoJS.pad.Pkcs7 }); Dado que el texto cifrado generado por CryptoJS es un objeto, si lo conviertes directamente a una cadena codificada en Base64, el atributo en encryptedData. El texto cifrado se convierte en cadena y es el formato requerido por el backend. var encryptedBase64Str = encryptedData.toString(); Salida: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(encryptedBase64Str); Necesitas leer cifradotext.toString() en encryptedData para obtener el mismo texto cifrado que Java var encryptedStr = encryptedData.ciphertext.toString(); Salida: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(Str cifrado); Dado que el texto cifrado cifrado es una cadena de 128 bits, debe convertirse a formato codificado en Base64 al descifrar. Luego tienes que usar el método CryptoJS.enc.Hex.parse para convertirlo a hexadecimal, y después usar CryptoJS.enc.Base64.stringify para convertirlo en una cadena codificada en Base64, y después puedes pasarlo al método CryptoJS.AES.decrypt para descifrarlo. Para obtener el texto cifrado del tipo de cadena, primero tienes que analizarlo con el método hexadecimal var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Convertir texto cifrado a cadenas Base64 Solo el texto cifrado tipo Base64 puede descifrarlo var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); La cadena convertida a codificación Base64 puede pasarse al método CryptoJS.AES.decrypt para la operación de descifrado. Descifrado var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { modo: CryptoJS.mode.ECB, relleno: CryptoJS.pad.Pkcs7 }); Tras el descifrado con CryptoJS, sigue siendo un objeto, y convertirlo en texto plano debe convertirse en una cadena en formato Utf8. Tras el descifrado, la cadena de texto plano debe transponerse al estilo de Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(decifradoStr); 'aa'
Aquí está el código fuente de la implementación de AES en .NET/C#:
|
Anterior:[12306] Perdón, porque manejas el pasajero demasiado a menudo, por favor inténtalo de nuevo mañanaPróximo:C# implementa el mapeo de memoria de procesos para compartir memoria de archivos
|