So richten Sie die Ver- und Entschlüsselung zwischen Android und der ASP.Net-Webanwendung ein

Bei dieser Verschlüsselung verwenden wir einen geheimen Schlüssel zum Verschlüsseln der Zeichenfolge. Der verwendete Algorithmus ist AES mit CBC-Modus (Cipher Block Chaining).

Der C # -Code verwendet PKCS7-Padding, da PKCS5 dort nicht verfügbar ist. In Android wird das PKCS5-Padding intern verwendet, auch wenn das PKCS7-Padding in der Verschlüsselungstransformation angegeben wird. Daher legen wir auch den PKCS5-Füllmodus fest. Im Test liefern beide die gleichen korrekten Ergebnisse.

Bei dieser Verschlüsselungsmethode wird ein einzelner Schlüssel sowohl für den geheimen Schlüssel als auch für das Salt verwendet.

Bei der Verwendung unterschiedlicher Schlüssel für den geheimen Schlüssel und Salt gab es einige Unterschiede zwischen den Base64-codierten Versionen des Salt (oder des Initialisierungsvektors). Die Base64-codierten Versionen wurden mit Android- und C # -Codes erstellt und unterschieden sich voneinander.

Um dies zu überwinden, haben wir einen einzigen Schlüssel verwendet, der sowohl als geheimer Schlüssel als auch als Salt dient.

Der Code für den Android-Teil lautet wie folgt:

öffentliche Klasse 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) löst UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException aus {byte [] plainTextbytes = plainText.getBytes (] Byte [] keyBytes = getKeyBytes (Schlüssel); // Base64.encodeToString zurückgeben (verschlüsseln (plainTextbytes, keyBytes, keyBytes), Base64.DEFAULT); return Base64.encodeToString (verschlüsseln (plainTextbytes, keyBytes, keyBytes), Base64.NO_WRAP); } public String decrypt (String encryptedText, String key) löst KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException aus {byte [] cipheredBytes = Base64.decode (encryptedText, Base64.DE). Byte [] keyBytes = getKeyBytes (Schlüssel); return new String (entschlüsseln (cipheredBytes, keyBytes, keyBytes), characterEncoding); } public byte [] decrypt (byte [] cipherText, byte [] key, byte [] initialVector) wirft NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException SecretKeySpec secretKeySpecy = neue SecretKeySpec (Schlüssel, 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) löst NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException aus SecretKeySpec secretKeySpec = neue SecretKeySpec (Schlüssel, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec (initialVector); cipher.init (Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); plainText = cipher.doFinal (plainText); return plainText; } private byte [] getKeyBytes (String key) löst UnsupportedEncodingException aus {byte [] keyBytes = new byte [16]; byte [] parameterKeyBytes = key.getBytes (characterEncoding); Systemarraycopy (parameterKeyBytes, 0, keyBytes, 0, Math.min (parameterKeyBytes.length, keyBytes.length)); return keyBytes; }}

Der Code für den C # -Teil lautet wie folgt:

// Verschlüsselt den Klartext mit einem 128-Bit-AES-Schlüssel und einer Chain-Block-Chiffre und gibt einen base64-codierten String zurück. Public string Encrypt (String plainText, String key) {var plainBytes = Encoding.UTF8.GetBytes (plainText); return 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) {return rijndaelManaged.CreateEncryptor () .TransformFinalBlock (plainBytes, 0, plainBytes.Length); } public byte [] Decrypt (byte [] encryptedData, RijndaelManaged rijndaelManaged) {return rijndaelManaged.CreateDecryptor () .TransformFinalBlock (encryptedData, 0, encryptedData.Length); } public RijndaelManaged GetRijndaelManaged (String secretKey) {var keyBytes = neues 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}; }

Mit Hilfe des obigen Codes kann eine Zeichenfolge auf einer Plattform verschlüsselt und dann auf der anderen Plattform entschlüsselt werden und umgekehrt.


Leave a Reply

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