Como configurar a criptografia e a descriptografia entre o aplicativo da Web Android e ASP.Net?

how-to-setup-encryption-and-decryption-between-android-and-asp

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

acolchoamento

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 tanto para a chave secreta quanto para o salt.

método de criptografia

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

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

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

public class 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.getBytes(characterEncoding); byte [] keyBytes = getKeyBytes(chave); // return Base64.encodeToString(encrypt(plainTextbytes,keyBytes, keyBytes), Base64.DEFAULT); return Base64.encodeToString(encrypt(plainTextbytes,keyBytes, keyBytes), Base64.NO_WRAP); } public String decrypt(String encodingText, String key) lança KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException { byte [] cipheredBytes = Base64.decode(encryptedText, Base64.DEFAULT); byte[] keyBytes = getKeyBytes(chave); return new String (decrypt(cipheredBytes, keyBytes, keyBytes), characterEncoding); } public byte [] decrypt( byte[] cipherText, byte[] key, byte [] initialVector) lança NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = Cipher.getInstance(cipherTransformation); SecretKeySpec secretKeySpecy = new SecretKeySpec(chave, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); cipher.init(Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec); cipherText = cipher.doFinal(cipherText); return texto cifrado; } public byte[] encrypt(byte[] plainText, byte[] key, byte [] initialVector) lança NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = Cipher.getInstance(cipherTransformation); SecretKeySpec secretKeySpec = new SecretKeySpec(chave, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); plainText = cipher.doFinal(plainText); retornar texto simples; } private byte[] getKeyBytes(String key) lança UnsupportedEncodingException{ byte [] keyBytes= new byte[16]; byte [] parâmetroKeyBytes= key.getBytes(characterEncoding); System .arraycopy(parameterKeyBytes, 0 , keyBytes, 0, Math.min(parameterKeyBytes.length, keyBytes.length)); return keyBytes; } } Leitura recomendada: Copiar para a área de transferência em JavaScript

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

// Criptografa texto simples usando chave AES de 128 bits e uma cifra de bloco de cadeia e retorna uma string codificada em base64 public string Encrypt(String plainText, String key) { var plainBytes = Encoding.UTF8.GetBytes(plainText); return Convert.ToBase64String(Encrypt(plainBytes, GetRijndaelManaged(chave))); } public string Decrypt(String criptografadoTexto, String chave) { var criptografadoBytes = Convert.FromBase64String(encryptedText); return Encoding.UTF8.GetString(Decrypt(encryptedBytes, GetRijndaelManaged(chave))); } public byte[] Encrypt(byte[] plainBytes, RijndaelManaged rijndaelManaged) { return rijndaelManaged.CreateEncryptor() .TransformFinalBlock(plainBytes, 0, plainBytes.Length); } public byte[] Decrypt(byte[] dado criptografado, RijndaelManaged rijndaelManaged) { return rijndaelManaged.CreateDecryptor() .TransformFinalBlock(encryptedData, 0,cryptedData.Length); } public RijndaelManaged GetRijndaelManaged(String secretKey) { var keyBytes = new byte[16]; var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey); Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length)); return new RijndaelManaged { Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, KeySize = 128, BlockSize = 128, Key = keyBytes, IV = keyBytes }; }

Com a ajuda do código acima, pode-se criptografar uma string em uma plataforma e depois descriptografá-la na outra plataforma e vice-versa.

Recomendado Read: Como ver o código do arquivo ‘.ctp’ tão colorido quanto o arquivo ‘.php’ no NetBeans

Leave a Reply

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