【问题标题】:AES Decryption - Porting code from C# to JavaAES 解密 - 将代码从 C# 移植到 Java
【发布时间】:2012-12-24 22:44:16
【问题描述】:

我正在尝试将以下代码从 C# 移植到 Java。我已经多次尝试尝试解密我的加密数据,但每次都会出现乱码。下面的代码使用了 org.bouncycastle 库,遗憾的是 C# 代码和 Java 代码之间似乎没有 1-1 映射。

我基本上知道三件事:

  • byte[] 文件 - 这包含我的加密文件。通常是相当大的字节数组。
  • byte[] padding - 每次都是 32*bytes*,似乎这的前 16 个字节被用作 IV。
  • byte[] aesKey - 每次都是 32*bytes*,我不知道 C# 代码到底是如何使用这个数组的。

原始 C# 代码

    private byte[] decryptmessage(byte[] cmessage, byte[] iVector, byte[] m_Key)
    {
        {
        //// randomly generated number acts as inetialization vector
        m_IV = new byte[16];
        Array.Copy(iVector, 0, m_IV, 0, 16);

        // GenerateAESKey();
        KeyParameter aesKeyParam = ParameterUtilities.CreateKeyParameter("AES", m_Key);
        ParametersWithIV aesIVKeyParam = new ParametersWithIV(aesKeyParam, m_IV);

        IBufferedCipher cipher = CipherUtilities.GetCipher("AES/CFB/NoPadding");
        cipher.Init(false, aesIVKeyParam);
        return cipher.DoFinal(cmessage);
        }
    }

我在 Java 中的尝试

  private static byte[] decryptMessage(byte[] file, byte[] iVector, byte[] aesKey) throws Exception {
    IvParameterSpec spec = new IvParameterSpec(Arrays.copyOfRange(iVector, 0, 16));
    SecretKeySpec key = new SecretKeySpec(Arrays.copyOfRange(aesKey, 0, 16), "AES");
    Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
    cipher.init(Cipher.DECRYPT_MODE, key, spec);
    return cipher.doFinal(file);
  }

P.S:这是解密的最后一步。在这之前,我必须从我的加密文件中取出一些初始字节集,并使用 RSA 私钥对其进行解密以获取此 AES 密钥。

如果有人有我可以阅读的链接/文档正确解释了使用 AES 加密文件的整个过程,然后在密钥上使用 RSA 并在加密文件的开头使用 iv,我将非常高兴。一直在看C#代码,想看看有图的东西。

编辑:字节而不是位。

EDIT2:将填充重命名为 iVector 以保持一致性和正确性。

【问题讨论】:

  • 也许你应该看看 bouncycastle
  • 除了 Java API 和 C# API 之外,我没有发现任何有用的东西。我环顾四周,有什么特别想让我看的吗?
  • 我猜 paddingaesKey 是 32 个字节(不是位)。还有为什么叫第二个参数padding,其实它跟padding没有关系,是初始化向量。为什么不调用与 C# 代码中相同的参数呢? (好吧,也许不是为成员变量保留的 m_Key。)
  • 你是正确的字节。定影。原始代码将其称为填充,用于解密的函数将“填充”变量重命名为 iVector。我保留了方法的原始名称。我会修复它以避免混淆。

标签: c# java encryption aes


【解决方案1】:

在 C# 代码中,您使用 256 位(32 字节)初始化密钥,从而获得 AES-256。在 Java 代码中,您只使用 128 位(16 字节)并获得 AES-128。

所以修复可能是:

SecretKeySpec key = new SecretKeySpec(aesKey, "AES");

然后您可能会发现 Java 不想使用 256 位密钥(出于法律原因)。然后你必须安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6

【讨论】:

  • 让我试试 JCE。希望解决方案就这么简单!
  • 是的!我只使用前 16 个字节,因为尝试所有 32 个字节都会给我一个密钥长度错误。这很有效,也让我对自己感觉良好。谢谢!
猜你喜欢
  • 2014-03-06
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
相关资源
最近更新 更多