我正在尝试解密一些东西,它是使用.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端解密这个。我发现的最有用的是这篇博文 http://oogifu.blogspot.com/2009/01/aes-in-java-and-c.html,但它缺乏实际细节,我无法实现解密器。
编辑:我是个白痴,现在让它工作了。
Unicode编码 http://msdn.microsoft.com/en-us/library/system.text.unicodeencoding.aspx是UTF-16LE,而我使用的是UTF-8。插入密码时切换到正确的编码已修复该程序。
我还需要得到 BouncyCastle 并做Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
Finaledit:这是解密的代码default来自 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# 端,请不要使用未派生的密码作为密钥!