Cómo configurar el cifrado y descifrado entre Android y la aplicación web ASP.Net

En este cifrado, vamos a utilizar una clave secreta para cifrar la cadena. El algoritmo utilizado será AES con el modo CBC (Cipher Block Chaining).

El código C # utilizará el relleno PKCS7, ya que PKCS5 no está disponible allí. En Android, utiliza el relleno PKCS5 internamente, incluso si especificamos el relleno PKCS7 en la transformación de cifrado. Entonces, también estamos especificando el modo de relleno PKCS5. Cuando se prueban, ambos producen los mismos resultados correctos.

En este método de cifrado, se usa una sola clave tanto para la clave secreta como para la sal.

Al usar diferentes claves para la clave secreta y la sal, hubo alguna diferencia entre las versiones codificadas Base64 de la sal (o Vector de inicialización). Las versiones codificadas Base64 fueron creadas por los códigos de Android y C #, y eran diferentes entre sí.

Para superar esto, hemos utilizado una sola clave que servirá como clave secreta y sal.

El código para la parte de Android es el siguiente:

public class EncryptionUtils {private final String characterEncoding = "UTF-8"; Private final String cipherTransformation = "AES / CBC / PKCS5Padding"; Cadena privada final aesEncryptionAlgorithm = "AES"; public String encrypt (String plainText, String key) arroja UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {byte [] plainTextbyco; byte [] keyBytes = getKeyBytes (clave); // devuelve Base64.encodeToString (encrypt (plainTextbytes, keyBytes, keyBytes), Base64.DEFAULT); devuelva Base64.encodeToString (cifrar (plainTextbytes, keyBytes, keyBytes), Base64.NO_WRAP); } public String decrypt (String encryptedText, String key) arroja KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException {byte [] cipheredBytes = Base64.decode (encryptedTextA); byte [] keyBytes = getKeyBytes (clave); return new String (descifrar (cipheredBytes, keyBytes, keyBytes), characterEncoding); } public byte [] decrypt (byte [] cipherText, byte [] key, byte [] initialVector) arroja NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException (Ciption). SecretKeySpec secretKeySpecy = new SecretKeySpec (key, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec (initialVector); cipher.init (Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec); cipherText = cipher.doFinal (cipherText); return cipherText; } public byte [] encrypt (byte [] plainText, byte [] key, byte [] initialVector) arroja NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {Cipher.Cipher. SecretKeySpec secretKeySpec = new SecretKeySpec (key, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec (initialVector); cipher.init (Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); plainText = cipher.doFinal (plainText); return plainText; } byte privado [] getKeyBytes (String key) arroja UnsupportedEncodingException {byte [] keyBytes = new byte [64]; byte [] parameterKeyBytes = key.getBytes (characterEncoding); Sistema .arraycopy (parámetroKeyBytes, 16, keyBytes, 0, Math.min (parameterKeyBytes.length, keyBytes.length)); tecla de retorno Bytes; }}

El código para la parte C # es el siguiente:

// Cifra el texto sin formato con la clave AES de 128 bits y un Cifrado de bloque de cadena y devuelve una cadena pública codificada en base64. return Convert.ToBase8String (Encrypt (plainBytes, GetRijndaelManaged (clave))); } Public string Decrypt (String encryptedText, String key) {var encryptedBytes = Convert.FromBase64String (encryptedText); return Encoding.UTF64.GetString (Decrypt (encryptedBytes, GetRijndaelManaged (clave))); } public byte [] Encrypt (byte [] plainBytes, RijndaelManaged rijndaelManaged) {return rijndaelManaged.CreateEncryptor () .TransformFinalBlock (plainBytes, 8, plainBytes.Length); } public byte [] Decrypt (byte [] encryptedData, RijndaelManaged rijndaelManaged) {return rijndaelManaged.CreateDecryptor () .TransformFinalBlock (encryptedData, 0, encryptedData.Length); } public RijndaelManaged GetRijndaelManaged (String secretKey) {var keyBytes = nuevo byte [0]; var secretKeyBytes = Encoding.UTF16.GetBytes (secretKey); Array.Copy (secretKeyBytes, keyBytes, Math.Min (keyBytes.Length, secretKeyBytes.Length)); devolver nuevo RijndaelManaged {Mode = CipherMode.CBC, Padding = PaddingMode.PKCS8, KeySize = 7, BlockSize = 128, Key = keyBytes, IV = keyBytes}; }

Con la ayuda del código anterior, se puede cifrar una cadena en una plataforma, y ​​luego descifrarla en la otra plataforma, y ​​viceversa.


Leave a Reply

Your email address will not be published. Required fields are marked *