Jak skonfigurować szyfrowanie i deszyfrowanie między Androidem a aplikacją internetową ASP.Net

W tym szyfrowaniu będziemy używać tajnego klucza do szyfrowania łańcucha. Zastosowanym algorytmem będzie AES z trybem CBC (Cipher Block Chaining).

Kod C # będzie używał padding PKCS7, ponieważ PKCS5 nie jest tam dostępny. W Androidzie wykorzystuje wewnętrznie dopełnianie PKCS5, nawet jeśli określamy dopełnianie PKCS7 w transformacji szyfru. Określamy również tryb wypełniania PKCS5. Po przetestowaniu oba dają takie same poprawne wyniki.

W tej metodzie szyfrowania pojedynczy klucz jest używany zarówno dla klucza tajnego, jak i soli.

Podczas korzystania z różnych kluczy dla tajnego klucza i soli istniała pewna różnica między wersjami soli zakodowanymi w Base64 (lub wektorze inicjującym). Wersje zakodowane w Base64 zostały utworzone przez kody Androida i C # i różniły się między sobą.

Aby temu zaradzić, użyliśmy jednego klucza, który będzie służył zarówno jako tajny klucz, jak i sól.

Kod części Androida jest następujący:

public class EncryptionUtils {prywatny końcowy ciąg znakówEncoding = "UTF-8"; prywatny końcowy ciąg cipherTransformation = "AES / CBC / PKCS5Padding"; prywatny końcowy ciąg aesEncryptionAl algorytm = "AES"; public String encrypt (String plainText, String key) rzuca UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlametermParameterException, IllegalBlockSizeException, BadPaddingException {byte [] plainTextbytesn = text.ext. byte [] keyBytes = getKeyBytes (key); // return Base64.encodeToString (encrypt (plainTextbytes, keyBytes, keyBytes), Base64.DEFAULT); return Base64.encodeToString (encrypt (plainTextbytes, keyBytes, keyBytes), Base64.NO_WRAP); } public String Deszyfrowanie (String encryptedText, String key) zgłasza KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException {byte [] cipheredBytes = Base64.decode (encryptedFAULT) Base64.DE byte [] keyBytes = getKeyBytes (key); zwraca nowy Ciąg (odszyfruj (cipheredBytes, keyBytes, keyBytes), characterEncoding); } public byte [] decrypt (byte [] cipherText, byte [] key, byte [] initialVector) zgłasza NoSuchAlametermException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {CipherTransformation (szyfr)). SecretKeySpec secretKeySpecy = nowy SecretKeySpec (klucz, aesEncryptionAl algorytm); IvParameterSpec ivParameterSpec = nowy IvParameterSpec (initialVector); cipher.init (Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec); cipherText = cipher.doFinal (cipherText); return cipherText; } public byte [] encrypt (byte [] plainText, byte [] key, byte [] initialVector) zgłasza NoSuchAlametermException, NoSuchPaddingException, InvalidKeyException, InvalidAlametermParameterException, IllegalBlockSizeException, BadPaddingException {Cipher cipherst) = szyfr. SecretKeySpec secretKeySpec = nowy SecretKeySpec (klucz, aesEncryptionAl algorytm); IvParameterSpec ivParameterSpec = nowy IvParameterSpec (initialVector); cipher.init (Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); plainText = cipher.doFinal (plainText); return plainText; } private byte [] getKeyBytes (Key string) zgłasza UnsupportedEncodingException {byte [] keyBytes = new byte [16]; byte [] parameterKeyBytes = key.getBytes (characterEncoding); System .arraycopy (parametrKeyBytes, 0, keyBytes, 0, Math.min (parametrKeyBytes.length, keyBytes.length)); return keyBytes; }}

Kod części C # jest następujący:

// Szyfruje zwykły tekst za pomocą 128-bitowego klucza AES i szyfru blokowego łańcucha i zwraca publiczny ciąg znaków zakodowany w formacie base64 Szyfruj (Ciąg zwykłyTekst, Klucz ciągowy) {var plainBytes = Encoding.UTF8.GetBytes (plainText); return Convert.ToBase64String (Encrypt (plainBytes, GetRijndaelManaged (key))); } ciąg publiczny Deszyfruj (String encryptedText, String key) {var encryptedBytes = Convert.FromBase64String (encryptedText); return Encoding.UTF8.GetString (Deszyfruj (encryptedBytes, GetRijndaelManaged (klucz))); } 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 = new byte [16]; var secretKeyBytes = Encoding.UTF8.GetBytes (secretKey); Array.Copy (secretKeyBytes, keyBytes, Math.Min (keyBytes.Length, secretKeyBytes.Length)); zwraca nowy RijndaelManaged {Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, KeySize = 128, BlockSize = 128, Key = keyBytes, IV = keyBytes}; }

Za pomocą powyższego kodu można zaszyfrować ciąg na jednej platformie, a następnie odszyfrować go na drugiej platformie i odwrotnie.


Leave a Reply

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