Шифрование / дешифрование в Android Аналогично C# - PullRequest
0 голосов
/ 14 апреля 2020

Я ищу реализацию шифрования AES в Java, аналогичном тому, что я написал в C#. Вот мое шифрование AES в C#:

public class MyCrypto
    {    
        private const string AesIV = @"1234567812345678"; 
        private const string AesKey = @"4566789945667899"; 

        public MyCrypto()
        {
        }

        public String Encrypt(String txt)
        {
            return EncryptCBC(txt);
        }

        public String Decrypt(String txt)
        {
            return DecryptCBC(txt);
        }

        public static byte[] EncryptToBytesCBC(string toEncrypt)
        {
            byte[] src = Encoding.UTF8.GetBytes(toEncrypt);
            byte[] dest = new byte[src.Length];
            using (var aes = new AesCryptoServiceProvider())
            {
                aes.BlockSize = 128;
                aes.KeySize = 128;
                aes.IV = Encoding.UTF8.GetBytes(AesIV);
                aes.Key = Encoding.UTF8.GetBytes(AesKey);
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.Zeros;
                // encryption
                using (ICryptoTransform encrypt = aes.CreateEncryptor(aes.Key, aes.IV))
                {
                    return encrypt.TransformFinalBlock(src, 0, src.Length);
                }
            }
        }

        public static string EncryptCBC(string toEncrypt)
        {
            return Convert.ToBase64String(EncryptToBytesCBC(toEncrypt));
        }

        public static String DecryptToBytesCBC(byte[] toDecrypt)
        {
            byte[] src = toDecrypt;
            byte[] dest = new byte[src.Length];
            using (var aes = new AesCryptoServiceProvider())
            {
                aes.BlockSize = 128;
                aes.KeySize = 128;
                aes.IV = Encoding.UTF8.GetBytes(AesIV);
                aes.Key = Encoding.UTF8.GetBytes(AesKey);
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.Zeros;
                // decryption
                using (ICryptoTransform decrypt = aes.CreateDecryptor(aes.Key, aes.IV))
                {
                    byte[] decryptedText = decrypt.TransformFinalBlock(src, 0, src.Length);

                    return Encoding.UTF8.GetString(decryptedText);
                }
            }
        }
        public static string DecryptCBC(string toDecrypt)
        {
            return DecryptToBytesCBC(Convert.FromBase64String(toDecrypt));
        }
    }

Мой код Android / java:

public String encrypt(String value)
{
    String initVector = "1234567812345678";
    String key = "4566789945667899";
    String res = "";
    try
        {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv);

            byte[] encrypted = cipher.doFinal(value.getBytes());
            res = android.util.Base64.encodeToString(encrypted,0);
        }
    catch (Exception ex)
    {
        Crashlytics.logException(ex);
    }

    return res;
}

, но оба (C# и Java) дают мне два разных результата шифрования. Я использую мой код c# в качестве справочного, потому что этот код соответствует шифрованию нашей базы данных. Любая помощь высоко ценится. Спасибо

1 Ответ

0 голосов
/ 15 апреля 2020

Чтобы получить аналогичный результат шифрования в java с кодом C# выше, пожалуйста, измените эту строку

javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance ("AES");

к этому

javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance ("AES / CBC / ZeroBytePadding");

...