Cómo generar el encryption AES / CBC / PKCS5Padding en angularJs

Estoy trabajando en una function que requiere el encryption Aes (AES / CBC / PKCS5padding) del text de encryption que se enviará del cliente al server que tiene ASP.Net en el back-end.

Tengo una function de desencryption en el server de la siguiente manera:

public static string Decrypt(string inputBase64, string passphrase = null) { byte[] key, iv = new byte[0]; byte[] base64data = Convert.FromBase64String(inputBase64); byte[] passphrasedata = RawBytesFromString(passphrase); byte[] currentHash = new byte[0]; SHA256Managed hash = new SHA256Managed(); currentHash = hash.ComputeHash(passphrasedata); return DecryptStringFromBytes(base64data, currentHash, null); } static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV) { // Check arguments. if (cipherText == null || cipherText.Length <= 0) throw new ArgumentNullException("cipherText"); if (Key == null || Key.Length <= 0) throw new ArgumentNullException("Key"); //if (IV == null || IV.Length <= 0) // throw new ArgumentNullException("Key"); // Declare the string used to hold // the decrypted text. string plaintext = null; // Create an RijndaelManaged object // with the specified key and IV. using (var cipher = new RijndaelManaged()) { cipher.Key = Key; cipher.IV = new byte[16]; //cipher.Mode = CipherMode.CBC; //cipher.Padding = PaddingMode.PKCS7; // Create a decrytor to perform the stream transform. ICryptoTransform decryptor = cipher.CreateDecryptor(Key, cipher.IV); // Create the streams used for decryption. using (MemoryStream msDecrypt = new MemoryStream(cipherText)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { var bytes = default(byte[]); using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { bytes = srDecrypt.CurrentEncoding.GetBytes(srDecrypt.ReadToEnd()); // Read the decrypted bytes from the decrypting stream // and place them in a string. //aintext = srDecrypt.ReadToEnd(); } plaintext = ASCIIEncoding.UTF8.GetString(bytes, 0, bytes.Count()); } } } return plaintext; } 

Quiero implementar una alternativa de angularjs al siguiente código de Android:

 public static String Encrypt(String input, String passphrase) { if (input.equalsIgnoreCase("") || passphrase.equalsIgnoreCase("")) return ""; else { byte[] key, iv; byte[] passphrasedata = null; try { passphrasedata = passphrase.getBytes("UTF-8"); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } byte[] currentHash = new byte[0]; MessageDigest md = null; try { md = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } currentHash = md.digest(passphrasedata); iv = new byte[16]; return Base64.encodeToString(EncryptStringToBytes(input, currentHash, iv), Base64.NO_WRAP); } } static byte[] EncryptStringToBytes(String plainText, byte[] Key, byte[] IV) { if (plainText == null || plainText.length() <= 0) { Log.e("error", "plain text empty"); } if (Key == null || Key.length <= 0) { Log.e("error", "key is empty"); } if (IV == null || IV.length <= 0) { Log.e("error", "IV key empty"); } byte[] encrypted; try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec myKey = new SecretKeySpec(Key, "AES"); IvParameterSpec IVKey = new IvParameterSpec(IV); cipher.init(Cipher.ENCRYPT_MODE, myKey, IVKey); encrypted = cipher.doFinal(plainText.getBytes("UTF-8")); return encrypted; } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } 

El código de Android de arriba está funcionando bien. Quiero implementar la misma lógica de encriptación en AngularJs.

Incluí la biblioteca CryptoJS para el cálculo de encryption SHA-256 y AES. Aquí está el código que he implementado.

 var password = '12345678'; var passwordHash = CryptoJS.SHA256(password).toString(CryptoJS.enc.Latin1); var iv = CryptoJS.enc.Hex.parse('0000000000000000'); var cipher = CryptoJS.AES.encrypt(plaintext,passwordHash,{ iv: iv, mode: CryptoJS.mode.CBC, keySize: 256/32, padding: CryptoJS.pad.Pkcs7 }); cipherText = cipher.ciphertext.toString(CryptoJS.enc.Base64); 

El problema es que la cadena codificada no se puede descifrar a su forma anterior. Creo que hay una falta de coincidencia en la lógica de encriptación en el lado del cliente y la lógica de desencryption en el lado del server.

Cuando paso el encryption encryption CryptoJS a la function de desencryption de Java, muestra errores:

javax.crypto.IllegalBlockSizeException: la longitud de input debe ser múltiplo de 16 al descifrar con encryption acolchado

o algunas veces:

javax.crypto.BadPaddingException: dado que el bloque final no está correctamente rellenado

One Solution collect form web for “Cómo generar el encryption AES / CBC / PKCS5Padding en angularJs”

¡Gracias chicos!, Lo tengo trabajando con el siguiente código.

  function hash (){ return CryptoJS.SHA256(password); } var cipher = (function(plaintext, password) { passwordHash = hash(password); var iv = CryptoJS.enc.Hex.parse('0000000000000000'); var cipher = CryptoJS.AES.encrypt(plaintext, passwordHash, { iv: iv, mode: CryptoJS.mode.CBC, keySize: 256 / 32, padding: CryptoJS.pad.Pkcs7 }); return cipher; })(plaintext, password); cipherBase64 = cipher.ciphertext.toString().hex2a().base64Encode(); 
  • Javascript a equivalente fijo en java
  • Android WebView siempre devuelve null para javascript getElementById en loadUrl
  • Ejecutar la aplicación desde el browser web?
  • Comprender los prototypes de Javascript provenientes de un background de Java y C ++
  • Normalización vs Desnormalización cuando se utiliza un cliente JSON con una stack JAVA / RDBMS
  • ¿Hay un Java equivalente a Javascript con statement?
  • Manejando páginas refrescantes de selenium
  • Java Websockets + oyentes de events. ¿Es este el enfoque correcto?
  • ¿la localización de numbers no es innecesaria?
  • ¿Por qué los caracteres chinos en JSON causan un error de "mal carácter de control" con JSON.parse?
  • Problema de scripting Apache Camel
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.