【问题标题】:Java AES/CBC/PKCS5Padding in C#C# 中的 Java AES/CBC/PKCS5Padding
【发布时间】:2019-11-01 01:52:57
【问题描述】:

我收到了需要转换为 C# 的 Java 加密代码。我想我已经很接近了……但我不确定如何复制 IV 计算……有什么帮助吗?

Java 代码:

    public static string getAESencodingResult(String sSrc, String encrypt_key)
    {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] raw = encrypt_key.getBytes();
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        IvParameterSpec iv = new IvParameterSpec(encrypt_key.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
        return new BASE64Encoder().encode(encrypted);
    }

C# 代码:

    static string EncryptStringToBytes(string plainText, byte[] key)
    {
        byte[] encrypted;
        using (RijndaelManaged rijAlg = new RijndaelManaged())
        {
            rijAlg.Key = key;
            // rijAlg.IV = ???
            rijAlg.GenerateIV();
            rijAlg.Padding = PaddingMode.PKCS7;
            rijAlg.Mode = CipherMode.CBC;
            ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
            using (MemoryStream msEncrypt = new MemoryStream())
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
            {

                swEncrypt.Write(plainText);
                if (plainText.Length < 16)
                {
                    for (int i = plainText.Length; i < 16; i++)
                        swEncrypt.Write((byte)0x0);
                }
                swEncrypt.Flush();
                csEncrypt.FlushFinalBlock();
                encrypted = msEncrypt.ToArray();
            }
        }
        return Convert.ToBase64String(encrypted);
    }

【问题讨论】:

  • 看起来键同时用作键和初始化向量,这不是一个好主意。有关 Key vs IV 的更多信息,请参阅here
  • 我也在想同样的事情......但是 Java 代码来自第三方,我必须让它以同样的方式工作。
  • 我在 Java 方面不是 100% 确定的,但只是将关键字节分配给 C# 中的 IV 属性,然后删除 GenerateIV() 行吗?
  • 是的...他们给我发了一些样本数据,它匹配...谢谢!...我刚刚使用 rijAlg.IV = key;...我只是认为必须有更多!
  • 好的。我现在添加了一个答案,我知道它有效! :-)

标签: java c# encryption aes


【解决方案1】:

如果我没有误解 Java 代码,您只需将键值也分配给 IV:

rijAlg.Key = key;
rijAlg.IV = key;

并删除 GenerateIV 行:

rijAlg.GenerateIV();

我了解您无法控制 Java 代码,因此您无法解决此问题,但对于未来的读者:您不应该每次加密时都使用相同的 IV。请参阅this question 了解更多信息。

【讨论】:

  • 我还必须添加:swEncrypt.Flush(); csEncrypt.FlushFinalBlock();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2021-08-13
  • 2022-12-02
  • 1970-01-01
相关资源
最近更新 更多