Come impostare la crittografia e la decrittografia tra l'applicazione Web Android e ASP.Net

In questa crittografia, useremo una chiave segreta per crittografare la stringa. L'algoritmo utilizzato sarà AES con modalità CBC (Cipher Block Chaining).

Il codice C # utilizzerà l'imbottitura PKCS7, poiché PKCS5 non è disponibile lì. In Android, utilizza il padding PKCS5 internamente, anche se si specifica il padding PKCS7 nella trasformazione di cifratura. Quindi, stiamo anche specificando la modalità di riempimento PKCS5. Quando testati, entrambi producono gli stessi risultati corretti.

In questo metodo di crittografia, viene utilizzata una sola chiave sia per la chiave segreta che per il salt.

Quando si utilizzavano chiavi diverse per la chiave segreta e salt, c'era una certa differenza tra le versioni codificate Base64 del salt (o Initialization Vector). Le versioni con codifica Base64 sono state create da codici Android e C # e differivano l'una dall'altra.

Per ovviare a questo, abbiamo usato una sola chiave che fungerà sia da chiave segreta che da sale.

Il codice per la parte Android è il seguente:

public class EncryptionUtils {private final String characterEncoding = "UTF-8"; stringa finale privata cipherTransformation = "AES / CBC / PKCS5Padding"; String finale privata aesEncryptionAlgorithm = "AES"; public String encrypt (String plainText, String key) genera UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {byte [] plainTextbytes = plainText.tes byte [] keyBytes = getKeyBytes (chiave); // return Base64.encodeToString (encrypt (plainTextbytes, keyBytes, keyBytes), Base64.DEFAULT); return Base64.encodeToString (crittografare (plainTextbytes, keyBytes, keyBytes), Base64.NO_WRAP); } public String decrypt (StringcryptedText, String key) genera KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException {byte [] cipheredBytes = Base64.decode (crittotedText); Base64.DE byte [] keyBytes = getKeyBytes (chiave); return new String (decrypt (cipheredBytes, keyBytes, keyBytes), characterEncoding); } public byte [] decrypt (byte [] cipherText, chiave byte [], byte [] initialVector) genera NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {CipherInformation = Cipher; Cipher = Cipher; Cipher; Cipher; Cipher; Cipher; Cipher; Cipher; Cipher; Cipher; Cipher; Cipher; Cipher; Cipher; Cipher SecretKeySpec secretKeySpecy = new SecretKeySpec (chiave, 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) genera NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {Cipher cipher = Cipherget Cip Cip SecretKeySpec secretKeySpec = new SecretKeySpec (chiave, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec (initialVector); cipher.init (Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); plainText = cipher.doFinal (plainText); return plainText; } private byte [] getKeyBytes (String key) genera UnsupportedEncodingException {byte [] keyBytes = new byte [16]; byte [] parameterKeyBytes = key.getBytes (characterEncoding); Sistema .arraycopy (parameterKeyBytes, 0, keyBytes, 0, Math.min (parameterKeyBytes.length, keyBytes.length)); return keyBytes; }}

Il codice per la parte C # è il seguente:

// Crittografa il testo in chiaro usando una chiave AES a 128 bit e un Chain Block Cipher e restituisce una stringa pubblica con stringa con codifica base64 Encrypt (String plainText, String key) {var plainBytes = Encoding.UTF8.GetBytes (plainText); return Convert.ToBase64String (Encrypt (plainBytes, GetRijndaelManaged (key))); } public string Decrypt (StringcryptedText, String key) {var crittotedBytes = Convert.FromBase64String (cryptedText); return Encoding.UTF8.GetString (Decrypt (crittografatoBytes, GetRijndaelManaged (chiave))); } public byte [] Encrypt (byte [] plainBytes, RijndaelManaged rijndaelManaged) {return rijndaelManaged.CreateEncryptor () .TransformFinalBlock (plainBytes, 0, plainBytes.Length); } public byte [] Decrypt (byte []cryptedData, RijndaelManaged rijndaelManaged) {return rijndaelManaged.CreateDecryptor () .TransformFinalBlock (crittografatoData, 0, crittografatoData.Lunghezza); } 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)); restituisce nuovo RijndaelManaged {Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, KeySize = 128, BlockSize = 128, Key = keyBytes, IV = keyBytes}; }

Con l'aiuto del codice precedente, è possibile crittografare una stringa su una piattaforma, quindi decodificarla sull'altra piattaforma e viceversa.


Leave a Reply

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