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 に答える