5

我正在尝试解密使用 .NET/C# 的 RijndaelManaged 加密的东西,使用 Java 进行解密。

C# 程序不是我的;我无法将其更改为更具互操作性。但我知道它是如何加密的:

byte[] bytes = new UnicodeEncoding().GetBytes(password); // edit: built-in is 8chars
FileStream fileStream = new FileStream(outputFile, FileMode.Create);
RijndaelManaged rijndaelManaged = new RijndaelManaged();
CryptoStream cryptoStream = new CryptoStream((Stream) fileStream,
    rijndaelManaged.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);

我不知道如何在 Java 端解密这个。我发现最接近有用的是这篇博文,但它对实际细节很清楚,我无法实现解密器。

编辑:我是个白痴,现在让它工作。

UnicodeEncoding是 UTF-16LE,而我使用的是 UTF-8。插入密码时切换到正确的编码已修复程序。

我还需要得到 BouncyCastle 并做Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");

finaledit:这是从 Java 中的 .NET 解密默认RijndaelManaged 流的代码,假设它是使用原始密码作为密钥创建的:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
String password = "kallisti"; // only 8, 12, or 16 chars will work as a key
byte[] key = password.getBytes(Charset.forName("UTF-16LE"));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"),
    new IvParameterSpec(key));
return cipher; // then use CipherInputStream(InputStream, Cipher)

请记住:如果您控制 C# 端,请不要使用未派生的密码作为您的密钥!

4

1 回答 1

3

可以使用标准的 AES 解密。Rijndel 只是 AES 的超集,它对特定选项更加宽松。有关更多详细信息,请参阅Java 中的 Rijndael 支持。

从链接问题中给出的答案:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post
byte[] iv = null ; //Ditto
byte[] plaintext = null; //Whatever you want to encrypt/decrypt
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//You can use ENCRYPT_MODE or DECRYPT_MODE
cipher.calling init(Cipher.DECRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);
于 2011-05-21T22:50:12.140 回答