11

JavaCipherとAESを使用して暗号化/復号化を実装しています。doFinal()の呼び出しで5バイト余分に書き込まれることを除いて、すべてが正常に機能しています。したがって、5バイトが追加された正しくデコードされた文字列になります。

その理由は、16バイトのブロック全体が書き込まれているためだと思います。最後のブロックを含めて、3つの16バイトブロックが書き込まれています。入力暗号化ファイルは64バイトです。暗号化されていないテキストは43バイトである必要があります。

doFinalのドキュメントには、出力バッファーに書き込まれたバイト数を返すことができることが示されています。ただし、0、16、16、16です。あらゆる形式のdoFinalとupdateを試しましたが、動作に変化はありません。

これらのアルゴリズムのほとんどが動作する方法であるため、フルブロックを書き出すことは理にかなっています。ただし、出力データのサイズがわからない場合は、過剰なデータを防ぐにはどうすればよいですか?

おそらく私は別のアルゴリズムを使用する必要がありますか?AES256は必須ですが、別のブロックタイプまたはパディングタイプを使用すると、正しいバイト数を書き込むことができるのではないかと思います。

何かガイダンスはありますか?

(いくつかの)簡潔さのために切り取った:

decryptCipher = Cipher.getInstance("AES");
decryptCipher.init(Cipher.DECRYPT_MODE, aesKey);

復号化ルーチンのビジネス部分。

    long bytesToRead = inputFile.length();

    while ((inLen = in.read(buffer)) > 0) {
        int bytesOut = 0;
        byte[] cryptBytes = null;
        int outLen = cipher.getOutputSize(inLen);
        cryptBytes = new byte[outLen];

        if (bytesToRead <= buffer.length) {
            try {
                bytesOut = cipher.doFinal(buffer, 0, inLen, cryptBytes, 0);
            } catch (ShortBufferException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else
            try {
                bytesOut = cipher.update(buffer, 0, inLen, cryptBytes, 0);
            } catch (ShortBufferException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        out.write(cryptBytes, 0, bytesOut);
        bytesToRead -= inLen;

    }
    try {
        out.flush();
        in.close();
        out.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
4

2 に答える 2

16

Cipher.getInstance()を呼び出すときは、パディングメカニズムを指定する必要があります。明らかに、暗号化と復号化の両方の時点で同じである必要があります。例えば:

decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

パディングメカニズムがないと、復号化側は平文の終わりがどこにあるか(最後のブロック内)に関する情報を持ちません。

于 2009-08-04T07:42:48.203 に答える
1

AESはブロック暗号であり、当然、すべてのブロック暗号と同様に、ブロック全体が提供されます。

詳細については、AESに関するウィキペディアの記事を参照してください。

「正しいバイト数」を出力したいとおっしゃいました。正しいバイト数をどのように決定しましたか?

于 2009-08-04T07:34:13.680 に答える