Como configurar criptografia e descriptografia entre Android e ASP.Net Web Application

Nesta criptografia, vamos usar uma chave secreta para criptografar a string. O algoritmo usado será o AES no modo CBC (Cipher Block Chaining).

O código C # usará o preenchimento PKCS7, pois o PKCS5 não está disponível lá. No Android, ele usa o preenchimento PKCS5 internamente, mesmo se especificarmos o preenchimento PKCS7 na transformação de cifra. Portanto, também estamos especificando o modo de preenchimento PKCS5. Quando testados, ambos produzem os mesmos resultados corretos.

Nesse método de criptografia, uma única chave é usada para a chave secreta e o salt.

Ao usar chaves diferentes para a chave secreta e o salt, houve alguma diferença entre as versões codificadas em Base64 do salt (ou vetor de inicialização). As versões codificadas Base64 foram criadas pelos códigos Android e C # e eram diferentes entre si.

Para superar isso, usamos uma única chave que servirá como chave secreta e sal.

O código para a parte do Android é o seguinte:

classe pública EncryptionUtils {private final String characterEncoding = "UTF-8"; private final String cipherTransformation = "AES / CBC / PKCS5Padding"; private final String aesEncryptionAlgorithm = "AES"; public String encrypt (String plainText, String key) lança UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {byte [] plainTextbytes = plainText.desk; byte [] keyBytes = getKeyBytes (chave); // retorna Base64.encodeToString (encrypt (plainTextbytes, keyBytes, keyBytes), Base64.DEFAULT); retornar Base64.encodeToString (criptografar (plainTextbytes, keyBytes, keyBytes), Base64.NO_WRAP); } public String decrypt (String encryptedText, String key) lança KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException {byte [] cipheredBytes = Base64.decode = Base64.decode (encryptedText, Base16); byte [] keyBytes = getKeyBytes (chave); retornar novo String (descriptografar (cipheredBytes, keyBytes, keyBytes), characterEncoding); } public byte [] decrypt (byte [] cipherText, byte [] key, byte [] initialVector) lança NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {Cipher cipherInformation = Cipher; SecretKeySpec secretKeySpecy = new SecretKeySpec (chave, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec (initialVector); cipher.init (Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec); cipherText = cipher.doFinal (cipherText); retornar cipherText; } public byte [] encrypt (byte [] plainText, byte [] key, byte [] initialVector) lança NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {Cipher cipher = Cipher; cipher cipher = Cipher; SecretKeySpec secretKeySpec = new SecretKeySpec (chave, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec (initialVector); cipher.init (Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); plainText = cipher.doFinal (plainText); return plainText; } byte privado [] getKeyBytes (chave String) lança UnsupportedEncodingException {byte [] keyBytes = novo byte [0]; byte [] parameterKeyBytes = key.getBytes (characterEncoding); System .arraycopy (parameterKeyBytes, 0, keyBytes, XNUMX, Math.min (parameterKeyBytes.length, keyBytes.length)); return keyBytes; }}

O código para a parte C # é o seguinte:

// Criptografa o texto sem formatação usando a chave AES de 128 bits e uma Cadeia de Códigos de Bloco e retorna uma string pública codificada em base64 Encrypt (String plainText, String string) {var plainBytes = Encoding.UTF8.GetBytes (plainText); retornar Convert.ToBase64String (Encrypt (plainBytes, GetRijndaelManaged (key))); } public string Decrypt (String encryptedText, String key) {var encryptedBytes = Convert.FromBase64String (encryptedText); return Encoding.UTF8.GetString (Decrypt (encryptedBytes, GetRijndaelManaged (key))); } public byte [] Encrypt (byte [] plainBytes, RijndaelManaged rijndaelManaged) {retorna rijndaelManaged.CreateEncryptor () .TransformFinalBlock (plainBytes, 0, plainBytes.Length); } public byte [] Decrypt (byte [] encryptedData, RijndaelManaged rijndaelManaged) {retorna rijndaelManaged.CreateDecryptor () .TransformFinalBlock (encryptedData, 0, encryptedData.Length); } public RijndaelManaged GetRijndaelManaged (String secretKey) {var keyBytes = novo byte [16]; var secretKeyBytes = Encoding.UTF8.GetBytes (secretKey); Array.Copy (secretKeyBytes, keyBytes, Math.Min (keyBytes.Length, secretKeyBytes.Length)); retornar novo RijndaelManaged {Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, KeySize = 128, BlockSize = 128, Key = keyBytes, IV = keyBytes}; }

Com a ajuda do código acima, é possível criptografar uma string em uma plataforma e descriptografá-la na outra plataforma e vice-versa.


Leave a Reply

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