AES加密C#解密Java?

3

我正在尝试在Java中解密C#加密数据,但是没有成功。我使用128位密钥和块大小,并采用PKCS7填充。以下是C#代码:

    public byte[] Encrypt(byte[] data, byte[] key)
    {
        using (var ms = new MemoryStream())
        {
            using (var aes = RijndaelManaged.Create())
            {
                aes.Key = key;
                aes.IV = key;
                var stream = new CryptoStream(ms, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write);
                stream.Write(data, 0, data.Length);
                stream.FlushFinalBlock();
                return ms.ToArray();
            }
        }
    }

以下是 Java 代码示例:

private static Key generateKey() throws Exception {

    Key key = new SecretKeySpec(Files.readAllBytes(Paths.get("D:/Temp/cr.key")), "AES");

    return key;
}

public static byte[] decrypt(byte[] encryptedData) throws Exception {
    Key key = generateKey();

    Cipher c = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");

    IvParameterSpec ivSpec = new IvParameterSpec(key.getEncoded());
    c.init(Cipher.DECRYPT_MODE, key, ivSpec);

    System.out.println(c.getBlockSize());


    c.update(encryptedData);
    byte[] decValue = c.doFinal();
    return decValue;
}

public static void main(String[] args) throws Exception {
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

    byte[] bb = decrypt(Files.readAllBytes(Paths.get("d:\\Temp\\cr~\\OEBPS\\Chapter001.html")));
           //decompressFile(bb, new File("D:\\Temp\\enc.html"));
}

有什么想法是出了什么问题吗?

谢谢

更新


对不起,我太傻了,忘记写实际的错误信息了。在这里:

Exception in thread "main" javax.crypto.BadPaddingException: pad block corrupted at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source) at javax.crypto.Cipher.doFinal(Cipher.java:1970)

谢谢


2
实际上是什么出了问题?是否抛出了异常或数据已损坏? - Fildor
@Fildor,谢谢你指出来,我已经更新了我的帖子 :) - Davita
这个问题已经解决了吗,Davida?如果我没有更直接的答案,很抱歉... - Maarten Bodewes
1个回答

1
你忽略了 Cipher.update(byte[]): byte[] 只有在完整的密文块被处理时才会返回数据。
注意:显然不是对这个问题的答案,因为异常指向另一个错误。但上述代码中仍存在一个 bug。

Java应该真正拥有一个注释来指示一个返回值不应该被忽略。如果返回值被忽略,包括大多数的不可变字符串类String的方法在内,许多方法都没有意义。 - Maarten Bodewes
抱歉问这么愚蠢的问题,但那个怎么能帮助我呢?谢谢。 - Davita
你需要将两个方法的返回值连接起来,或者使用doFinal(byte[]): byte[]代替这两个方法。现在你会失去数据... - Maarten Bodewes
哦,等等,BadPaddingException不可能是由这个引起的,我在手机上没有看到编辑。不幸的是,BadPaddingException几乎可以由任何其他原因引起,包括不正确的密钥、损坏的密文甚至错误的块密码。 - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接