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 verwendet es intern PKCS5-Padding, auch wenn wir PKCS7-Padding in der Verschlüsselungstransformation angeben. Wir spezifizieren also auch den PKCS5-Padding-Modus. Beim Testen liefern beide die gleichen korrekten Ergebnisse.
Bei diesem Verschlüsselungsverfahren wird ein einziger Schlüssel sowohl für den geheimen Schlüssel als auch für das Salz verwendet.
Bei der Verwendung unterschiedlicher Schlüssel für den geheimen Schlüssel und das Salt gab es einige Unterschiede zwischen den Base64-codierten Versionen des Salt (oder Initialisierungsvektors). Die Base64-codierten Versionen wurden von 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 Salz dient.
Der Code für den Android-Teil lautet wie folgt:
public class 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(characterEncoding); Byte [] keyBytes = getKeyBytes (Schlüssel); // Base64.encodeToString zurückgeben (encrypt (plainTextbytes, keyBytes, keyBytes), Base64.DEFAULT); return Base64.encodeToString(encrypt(plainTextbytes,keyBytes, keyBytes), Base64.NO_WRAP); } Public String decrypt (String verschlüsselter Text, Zeichenfolgenschlüssel) wirft KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException { byte [] cipheredBytes = Base64.decode (encryptedText, Base64.DEFAULT); byte[] keyBytes = getKeyBytes(key); return new String (decrypt(cipheredBytes, keyBytes, keyBytes), characterEncoding); } public byte [] decrypt( byte[] cipherText, byte[] key, byte [] initialVector) throws 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 (chiffreText); ChiffreText zurückgeben; } public byte[] encrypt(byte[] plainText, byte[] key, byte [] initialVector) löst NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = Cipher.getInstance(cipherTransformation); SecretKeySpec secretKeySpec = new SecretKeySpec(key, aesEncryptionAlgorithm); IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); cipher.init (Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); Klartext = cipher.doFinal (Klartext); Klartext zurückgeben; } privates Byte [] getKeyBytes (String-Schlüssel) wirft UnsupportedEncodingException {Byte [] keyBytes = neues Byte [16]; byte [] parameterKeyBytes = key.getBytes (characterEncoding); System .arraycopy (parameterKeyBytes, 0, keyBytes, 0, Math.min (parameterKeyBytes.length, keyBytes.length)); Schlüsselbytes zurückgeben; } } Empfohlene Lektüre: In JavaScript in die Zwischenablage kopieren
Der Code für den C#-Teil lautet wie folgt:
// Verschlüsselt Klartext mit AES 128-Bit-Schlüssel und einer Kettenblockchiffre und gibt eine base64-codierte Zeichenfolge zurück. public string Encrypt(String plainText, String key) { var plainBytes = Encoding.UTF8.GetBytes(plainText); return Convert.ToBase64String (Encrypt (plainBytes, GetRijndaelManaged (key))); } Öffentlicher String Decrypt (String Verschlüsselungstext, Zeichenfolgenschlüssel) { var Verschlüsselungsbytes = Convert.FromBase64String (Verschlüsselungstext); return Encoding.UTF8.GetString(Decrypt(encryptedBytes, GetRijndaelManaged(key))); } public byte[] Encrypt(byte[] plainBytes, RijndaelManaged rijndaelManaged) { return rijndaelManaged.CreateEncryptor() .TransformFinalBlock(plainBytes, 0, plainBytes.Length); } Öffentliches Byte [] Entschlüsseln (Byte [] verschlüsselte Daten, RijndaelManaged rijndaelManaged) {Rückkehr rijndaelManaged.CreateDecryptor () .TransformFinalBlock (verschlüsseltDaten, 0, verschlüsselteDaten.Länge); } 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 }; }
Mit Hilfe des obigen Codes kann man eine Zeichenfolge auf einer Plattform verschlüsseln und dann auf der anderen Plattform entschlüsseln und umgekehrt.
Empfohlen zu lesen: ,warSo sehen Sie den Code der ‘.ctp’-Datei so bunt wie die ‘.php’-Datei in NetBeans