【问题标题】:AES encryption/decryption from c# to java从 c# 到 java 的 AES 加密/解密
【发布时间】:2015-08-14 10:36:02
【问题描述】:

我在我的应用程序中使用 AES 加密/解密算法。

在服务器端,我使用 c# 来加密/解密数据。

在客户端(android)我使用 java 来解密数据。

C#加解密代码

    static readonly string PasswordHash = "52";

    static readonly string SaltKey = "dfkjsadfinewdfadsfkmeoinmsdflksdflk";

    static readonly string VIKey = "@EUBRHDFBFG8867";

public static string Encrypt(string plainText)
    {
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash,Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);

        var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding =PaddingMode.Zeros };

        var encryptor = symmetricKey.CreateEncryptor(keyBytes,Encoding.ASCII.GetBytes(VIKey));
        byte[] cipherTextBytes;

        using (var memoryStream = new MemoryStream())
        {
            using (var cryptoStream = new CryptoStream(memoryStream, encryptor,CryptoStreamMode.Write))
            {
                cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                cryptoStream.FlushFinalBlock();
                cipherTextBytes = memoryStream.ToArray();
                cryptoStream.Close();
            }
            memoryStream.Close();
        }           
       return Convert.ToBase64String(cipherTextBytes);
    }

    public static string Decrypt(string encryptedText)
    {
        byte[] cipherTextBytes = Convert.FromBase64String(encryptedText);

        byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash,Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);

        var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding =PaddingMode.None }

        var decryptor = symmetricKey.CreateDecryptor(keyBytes,Encoding.ASCII.GetBytes(VIKey));

        var memoryStream = new MemoryStream(cipherTextBytes);

        var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);

        byte[] plainTextBytes = new byte[cipherTextBytes.Length];

        int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);

        memoryStream.Close();
        cryptoStream.Close();

        return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount).TrimEnd("\0".ToCharArray());
    }

Java解密方法

public String decrypt(String dataToDecrypt) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, UnsupportedEncodingException 
{

    byte[] encryptedCombinedBytes = Base64.decodeBase64(dataToDecrypt.getBytes());

    String saltKey = "dfkjsadfinewdfadsfkmeoinmsdflksdflk";
    String password = "52";
    String IVKey = "@EUBRHDFBFG8867";

    PBKDF2Parameters p = new PBKDF2Parameters("HmacSHA256", "ASCII", saltKey.getBytes(), 8);

    byte[] mEncryptedPassword = new PBKDF2Engine(p).deriveKey(password);


    byte[] ivbytes = Arrays.copyOfRange(IVKey.getBytes(), 0, 16);

    SecretKeySpec mSecretKeySpec = new SecretKeySpec(mEncryptedPassword, "AES");

    Cipher mCipher = Cipher.getInstance("AES/CBC/NoPadding");

    mCipher.init(Cipher.DECRYPT_MODE, mSecretKeySpec, new IvParameterSpec(ivbytes));

    byte[] encryptedTextBytes = Arrays.copyOfRange(encryptedCombinedBytes, 16, encryptedCombinedBytes.length);

    byte[] decryptedTextBytes = mCipher.doFinal(encryptedTextBytes);

    return new String(decryptedTextBytes, "UTF-8");
}

C#解密方法工作正常并给出结果字符串。

我无法找出 Java 解密代码中的问题。它运行并给我一些垃圾值。

编辑

  1. 我不能在服务器端编辑任何东西。我只需要在java解密中复制解密。
  2. 我不知道passwordHash、saltKey和IVkey怎么用

【问题讨论】:

  • 您是否确保所有键值都正确等?
  • 通过网络连接使用 CBC 是完全不安全的。停止使用 TLS,可能使用自签名客户端和服务器证书 + GCM 密码套件。
  • 是的@SamiKuhmonen。如您所见,我在 C# 和 Java 方法上使用了相同的键。
  • @VinothKathir 但是你派生密钥等,有完全相同的吗?

标签: java c# android encryption aes


【解决方案1】:

首先,您已经切换了密码和盐。

其次,PBKDF2 默认使用 HMAC/SHA-1。据我所知,这也是Rfc2898DeriveBytes 的默认设置:

通过使用基于 HMACSHA1 的伪随机数生成器实现基于密码的密钥派生功能 PBKDF2。

您也不应该在未指定 Java 字符集的情况下调用 getBytes,但这对于您当前的运行时可能不是问题。


这些只是代码上的 cmets; 不要在没有完整性/真实性保护的情况下通过网络连接使用 CBC

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2019-10-27
    相关资源
    最近更新 更多