1

同様の質問が寄せられていることは承知していますが、いずれの問題についても解決できません。

次の Unix コマンドで作成された暗号化ファイルがあります。

tar cf FILES | gzip | openssl enc -k PASSWORD -aes-256-cbc -e > OUTPUT.tar.gz.enc 

関連するコマンドでファイルを正常に復号化できます。

このファイルを Java プロセスで復号化する必要があります。この SO answerに示されているコードを使用しました。

私は同じEVP_BytesToKey機能を使用していますが、わずかに異なるmain 機能です。

これは、暗号化されたファイルをロードする方法です。

byte[] headerSaltAndCipherText = IOUtils.toByteArray(new
InputStreamReader(new FileInputStream(f)));

サンプル コードでは、データは base64 でエンコードされているようです。ただし、ファイルを読み取ると、そうではありません(「Salted__」ヘッダーがはっきりとわかります)

easCBC私はこの方法でオブジェクトを作成しました:

Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");

そして、関数Security.addProvider(new BouncyCastleProvider());の先頭に追加しました。main行き詰まったのでBouncyCastleを使い始めましたが、何も変わりませんでした。

私もandで試しましPKCS7PaddingNoPaddingが、運がありませんでした。

間違ったパディングが使用されているか、暗号化されたデータが適切にエンコード/ロードされていないというよくある問題。

例とまったく同じように行っていないので、答えは 2 番目の解決策だと思います。例のようにファイルをロードしようとしましたが、この例外がありjava.nio.charset.MalformedInputException: Input length = 1、とにかく JDK 1.7 の機能を使用できません。

私は何を間違っていますか?

4

1 に答える 1

0

入力ファイルが文字データ (つまり、Base64 エンコード) でない場合はInputStreamReaderFileInputStream. 入力が Base64 でエンコードされている場合は、それを文字データとして読み取り、Base64 デコーダーを使用して byte[] に変換する必要があります。

パディングの場合、OpenSSLencコマンドはブロック暗号に PKCS5PADDING を使用します。

もう 1 つの問題は、キー マテリアルと初期化ベクトルの生成方法です。これは、入力パスワードを指定して OpenSSL と同じ方法で行う必要があります。

最後に (まだこれに遭遇していないようですが)、Oracle Java Runtime Environment または JDK を使用している場合、AES256 を使用するには、JRE 用の JCE Unlimited Strength ポリシー ファイルをインストールする必要があります。

于 2013-10-10T14:31:05.920 に答える