【问题标题】:Encrypt/Decrypt in Android Similar to C#Android中的加密/解密类似于C#
【发布时间】:2020-04-14 03:03:21
【问题描述】:

我正在寻找类似于我在 C# 中编写的 Java 中的 AES 加密实现。这是我在 C# 中的 AES 加密:

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# 代码作为参考,因为此代码与我们的数据库加密一致。非常感谢任何帮助。谢谢

【问题讨论】:

  • 为什么不直接使用 JNI 并在那里使用您的 C# 代码?
  • 对于这个小东西来说太复杂了。但是没问题我已经解决了
  • 您介意发布您的答案,以便对处于类似情况的其他人有所帮助吗?

标签: c# android aes


【解决方案1】:

要在java中使用上面的C#代码获得类似的加密结果,请更改此行

javax.crypto.Cipher 密码 = javax.crypto.Cipher.getInstance("AES");

到这里

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多