3

学術的な目的で、私はJavaとJava暗号を使用した小さな暗号化ベースのアプリケーションに取り組んでいます。とは言うものの、私は通常CまたはC ++(これは非常に簡単です)で作業しているので、これが明らかな問題である場合はお詫び申し上げます。したがって、私の問題は、情報を復号化したいときに発生します。問題は、暗号などの使用にそれほど関係していませんが、実際には、初期化ベクトルを適切に取得しています。今のところ、次の形式の改行/コロンで区切られたプレーンテキストファイルがあります(はい、これは安全ではありませんが、学術的な演習です-明らかに、キーファイルは現実の世界ではプレーンテキストではありません)

password:salt:<IV>

<IV>初期化ベクトルはどこにありますか。初期化ベクトルを直接バイナリ形式で書き出すことにしました。今、私はここから私の問題が始まります。データを正しく書き出すことはできますが(hexdumpを使用して確認)、プログラムに正しく読み戻されていないようです。たとえば、次のカウンター値について考えてみます。

00 18 C0 98 (decimal: 1622168)

この値は正しく書き出されます。しかし、読み込もうとすると、この値はすべて間違っています。これはの結果だと思いBufferedReader.readLine()ます。この行を読み取って別のファイルに書き出すだけで、この値は次のように変更されます。

BD EF BF BD (decimal: who cares, very wrong...)

ただし、ASCII値(パスワードとソルト)は、コロン区切り文字と同様にそのまま残ります。初期化ベクトルバイナリはすべてスクランブルされます。

私がやろうとしていることはこれです:

BufferedReader reader = new BufferedReader(new FileReader(f));
String last  = null;
String parse = null;
while((last = reader.readLine()) != null) {
    parse = last;
}
reader.close();
int offset = // A few indexOf() statements to find the positon;
byte[] iv  = parse.substring(offset).getBytes();

この時点で、iv.length > 16(128ビットAESを使用して)すでに間違っています。したがって、このASCIIとバイナリの組み合わせをどのように実現できるか完全にはわかりません(おそらく、そもそも悪い設計です)。私の問題の一部は、 Javaで、(とにかくchar != byte使用して)全行を読みたい場合、すべてをバイトとして単純に読み取ることができないということです。readLine()しかし、とにかくこの問題を回避する方法はありますか?完全な行が必要ですが、この行からバイナリも抽出したいので。

また、直接変換も試みました

for(int i = 0 ; i < 16 ; ++i)
  iv[i] = (byte)parse.charAt(offset + i);

しかし、これも機能しません。他のコード(getBytes()ベース)は私の個人用マシンで動作していましjava version "1.6.0_37"たが、デプロイメント環境はjava version "1.6.0_33"これが失敗する場所を使用しています。どんな助けでも大歓迎です。

4

1 に答える 1

10

バイナリデータの行とは何ですか?0x0Aどちらがデータでどちらが改行かをどうやって知るのですか?

ポイントは、任意のデータではなく、テキストBufferedReaderを読み取るためのものです。すべてのデータをテキストとして扱います。また、何らかのエンコーディングを使用してバイナリをテキストに変換しようとします。これにより、もちろんデータが破損します。

より良い方法は、次のいずれかです。

  • データをバイナリとして記述せず、改行またはその他の区切り文字に依存します。(例:使い続けるBufferedReader.readLine()
  • すべてのデータをバイナリとして書き込み、ファイル内に固定長の各レコードを作成するか、より複雑な区切り文字スキームを考え出します。(例:使用するだけFileInputStream.read(byte[])
于 2013-01-24T00:49:48.467 に答える