Comment configurer le cryptage et le décryptage entre Android et l’application Web ASP.Net ?

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

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

rembourrage

Le code C# utilisera le rembourrage PKCS7, car PKCS5 n’y est pas disponible. Dans Android, il utilise le rembourrage PKCS5 en interne, même si nous spécifions le rembourrage PKCS7 dans la transformation de chiffrement. Nous spécifions donc é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 chiffrement, une clé unique est utilisée à la fois pour la clé secrète et le sel.

méthode de chiffrement

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 encodées en Base64 du sel (ou vecteur d’initialisation). Les versions encodées en Base64 ont été créées par les codes Android et C#, et elles étaient différentes les unes des autres.

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

Le code pour la partie Android est le suivant :

public class EncryptionUtils { chaîne finale privée 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) lance UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { byte [] plainTextbytes = plainText.getBytes(characterEncoding); octet [] keyBytes = getKeyBytes(clé); // renvoie Base64.encodeToString(encrypt(plainTextbytes,keyBytes, keyBytes), Base64.DEFAULT); return Base64.encodeToString(encrypt(plainTextbytes,keyBytes, keyBytes), Base64.NO_WRAP); } chaîne publique déchiffrer (chaîne texte crypté, clé de chaîne) lance KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException { byte [] cipheredBytes = Base64.decode(encryptedText, Base64.DEFAULT); octet[] keyBytes = getKeyBytes(clé); renvoie une nouvelle chaîne (décrypter (cipheredBytes, keyBytes, keyBytes), characterEncoding); } public byte [] decrypt( byte[] cipherText, byte[] key, byte [] initialVector) lance NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = Cipher.getInstance(cipherTransformation); SecretKeySpec secretKeySpecy = new SecretKeySpec(key, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); cipher.init(Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec); cipherText = cipher.doFinal(cipherText); renvoie le texte chiffré ; } public byte[] encrypt(byte[] plainText, byte[] key, byte [] initialVector) lance NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = Cipher.getInstance(cipherTransformation); SecretKeySpec secretKeySpec = new SecretKeySpec(clé, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); plainText = cipher.doFinal(plainText); retourner plainText ; } private byte[] getKeyBytes(String key) lance UnsupportedEncodingException{ byte [] keyBytes= new byte[16] ; octet [] parameterKeyBytes= key.getBytes(characterEncoding); System .arraycopy(parameterKeyBytes, 0 , keyBytes, 0, Math.min(parameterKeyBytes.length, keyBytes.length)); retourner keyBytes ; } } Lecture recommandée : Copier dans le presse-papiers en JavaScript

Le code de la partie C# est le suivant :

// Crypte le texte en clair à l'aide d'une clé AES 128 bits et d'un chiffrement par bloc de chaîne et renvoie une chaîne encodée en base64 public string Encrypt(String plainText, String key) { var plainBytes = Encoding.UTF8.GetBytes(plainText); return Convert.ToBase64String(Encrypt(plainBytes, GetRijndaelManaged(key))); } public string Déchiffrer (chaîne texte crypté, clé de chaîne) { var octets cryptés = Convert.FromBase64String (texte crypté); return Encoding.UTF8.GetString(Decrypt(encryptedBytes, GetRijndaelManaged(key))); } public byte[] Encrypt(byte[] plainBytes, RijndaelManaged rijndaelManaged) { return rijndaelManaged.CreateEncryptor() .TransformFinalBlock(plainBytes, 0, plainBytes.Length); } public byte [] Décrypter (octet [] données cryptées, RijndaelManaged rijndaelManaged) { return rijndaelManaged.CreateDecryptor() .TransformFinalBlock (données cryptées, 0, données cryptées. Longueur); } 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 } ; }

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.

Lecture recommandée: ,warComment voir le code du fichier ‘.ctp’ aussi coloré que le fichier ‘.php’ dans NetBeans

Leave a Reply

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