Comment configurer le chiffrement et le déchiffrement entre Android et l'application Web ASP.Net

Dans ce cryptage, nous allons utiliser une clé secrète pour crypter la chaîne. L'algorithme utilisé sera AES avec le mode CBC (Cipher Block Chaining).

Le code C # utilisera le remplissage PKCS7, car PKCS5 n'y est pas disponible. Dans Android, il utilise le remplissage PKCS5 en interne, même si nous spécifions le remplissage PKCS7 dans la transformation de chiffrement. Donc, nous spécifions également le mode de remplissage PKCS5. Lorsqu'ils sont testés, ils produisent tous les deux les mêmes résultats corrects.

Dans cette méthode de cryptage, une seule clé est utilisée à la fois pour la clé secrète et le sel.

Lors de l'utilisation de clés différentes pour la clé secrète et le sel, il y avait une certaine différence entre les versions codées en Base64 du sel (ou vecteur d'initialisation). Les versions encodées en Base64 ont été créées par des codes Android et C #, et elles étaient différentes les unes des autres.

Pour surmonter cela, nous avons utilisé une seule clé qui servira à la fois de clé secrète et de sel.

Le code de la partie Android est le suivant:

classe publique EncryptionUtils {private final String characterEncoding = "UTF-8"; chaîne finale privée cipherTransformation = "AES / CBC / PKCS5Padding"; chaîne finale privée aesEncryptionAlgorithm = "AES"; public String encrypt (String plainText, String key) lève UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {byte [] plainTextbyod = plainText.getEgetBet byte [] keyBytes = getKeyBytes (key); // retourne Base64.encodeToString (encrypt (plainTextbytes, keyBytes, keyBytes), Base64.DEFAULT); return Base64.encodeToString (encrypt (plainTextbytes, keyBytes, keyBytes), Base64.NO_WRAP); } public String decrypt (String encryptedText, String key) lève KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException {byte [] cipheredBytes = Base64.decode (encryptedText, Base64.DE16) byte [] keyBytes = getKeyBytes (key); retourne une nouvelle chaîne (decrypt (cipheredBytes, keyBytes, keyBytes), characterEncoding); } public byte [] decrypt (byte [] cipherText, byte [] key, byte [] initialVector) lève NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {Cipher cipherstance = Cipher cipher = Cipher SecretKeySpec secretKeySpecy = nouveau SecretKeySpec (clé, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = nouveau IvParameterSpec (initialVector); cipher.init (Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec); cipherText = cipher.doFinal (cipherText); return cipherText; } public byte [] encrypt (byte [] plainText, byte [] key, byte [] initialVector) lève NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {Cipher cipher = CipherCipherInget.Cipher SecretKeySpec secretKeySpec = nouveau SecretKeySpec (clé, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = nouveau IvParameterSpec (initialVector); cipher.init (Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); plainText = cipher.doFinal (plainText); return plainText; } octet privé [] getKeyBytes (clé de chaîne) lève UnsupportedEncodingException {octet [] keyBytes = nouvel octet [0]; byte [] parameterKeyBytes = key.getBytes (characterEncoding); System .arraycopy (parameterKeyBytes, 0, keyBytes, XNUMX, Math.min (parameterKeyBytes.length, keyBytes.length)); return keyBytes; }}

Le code de la partie C # est le suivant:

// Chiffre le texte en clair à l'aide de la clé AES 128 bits et d'un code de bloc de chaîne et renvoie une chaîne publique codée en base64 Encrypt (String plainText, String key) {var plainBytes = Encoding.UTF8.GetBytes (plainText); renvoyer Convert.ToBase64String (Encrypt (plainBytes, GetRijndaelManaged (key))); } chaîne publique Decrypt (String encryptedText, String key) {var encryptedBytes = Convert.FromBase64String (encryptedText); return Encoding.UTF8.GetString (Decrypt (encryptedBytes, GetRijndaelManaged (key))); } octet public [] Encrypt (octet [] plainBytes, RijndaelManaged rijndaelManaged) {return rijndaelManaged.CreateEncryptor () .TransformFinalBlock (plainBytes, 0, plainBytes.Length); } octet public [] Decrypt (octet [] encryptedData, RijndaelManaged rijndaelManaged) {return rijndaelManaged.CreateDecryptor () .TransformFinalBlock (encryptedData, 0, encryptedData.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)); renvoyer le nouveau RijndaelManaged {Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, KeySize = 128, BlockSize = 128, Key = keyBytes, IV = keyBytes}; }

Avec l'aide du code ci-dessus, on peut crypter une chaîne sur une plate-forme, puis la décrypter sur l'autre plate-forme, et vice-versa.


Leave a Reply

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