2

私は現在、セキュリティ上の理由から、同じファイルを同時に読み取り、暗号化し、暗号化しようとしています。以下に記述したコードはほぼこれを達成しますが、復号化されたファイルに追加のバイトを追加します。c.init が DECRYPT_MODE であることを除けば、復号方法はほぼ同じです。

    public static void encryptFile(String path, byte[] key) throws Exception {

    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
    SecretKeySpec k = new SecretKeySpec(key, "AES");
    c.init(Cipher.ENCRYPT_MODE, k);
    RandomAccessFile raf = new RandomAccessFile(path, "rw");

    byte[] buf = new byte[256];
    byte[] output;
    int bytesRead = 0;
    int totalBytes = 0;
    while ((bytesRead = raf.read(buf)) >= 0) {
        int len = buf.length;
        if (bytesRead < len) {
            byte[] out2 = c.doFinal(buf, 0 , bytesRead);
            raf.seek(totalBytes);
            raf.write(out2);
        } else {
        output = c.update(buf, 0, bytesRead);
        raf.seek(totalBytes);
        raf.write(output);
        }
        totalBytes += bytesRead;
        }
    raf.getFD().sync();
    raf.close();
    }

復号化された例

一部の卒業生は、英国の新しい料金システムの下で元の学生ローンの 2 倍を返済することになる可能性があると、BBC が計算した数字が示唆しています。

大手会計士によるこの数字は、学生が 3 年間のコース \ܯ]£^* z§DþþÒÐùN\ܯ]£^ *z§DþþÒÐùNree-year course re-year course のために £39,000 を借りていることを示しています。総額で最大 83,000 ポンド (現金)。

2012 年に開始予定のこの制度では、卒業生は最大 30 年間、収入の 9% を返済します。

政府は、このシステムは公正であり、2012 年から年間 9,000 ポンドまで請求することは不可能であると述べています。これは政府によって前払いされますが、学生が 21,000 ポンド以上稼ぎ始めると元が取れます。

期待どおりにデバッグして機能しますが、これらのバイト/繰り返しがどのようにここに到達するかについてはまだ混乱しています。(おそらくパディングまたは間違った doFinal) どんな提案も大歓迎です:] ありがとう!

4

2 に答える 2

1

問題は、各更新の最後の16バイトが次の呼び出しに追加されていることを考慮していないようです。raf.seekに16バイトを追加することで、データとの整合性を保ち、doFinalを正しく追加します。また、output.lengthを使用すると、ファイルポインタに正しいパラメータが付与されるようです。inとoutputのmd5sは正確なので、機能するようです。:]復号化関数はraf.setLength(totalBytes + output.length);を使用します。

    public static void encryptFile(String path, byte[] key) throws Exception {

    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
    SecretKeySpec k = new SecretKeySpec(key, "AES");
    c.init(Cipher.ENCRYPT_MODE, k);
    RandomAccessFile raf = new RandomAccessFile(path, "rw");

    byte[] buf = new byte[128];
    int bytesRead = 0;
    int totalBytes = 0;
    byte[] output;
    while ((bytesRead = raf.read(buf)) >= 0) {
        output = c.update(buf, 0, bytesRead);
        raf.seek(totalBytes);
        raf.write(output);
        totalBytes += output.length;
        raf.seek(totalBytes+16);
    }
    output = c.doFinal();
    raf.seek(totalBytes);
    raf.write(output);
    raf.getFD().sync();
    raf.close();

}
于 2011-03-17T20:01:16.060 に答える
0

元のファイルに長さがある場合、パディングのためにL暗号化されたファイルにも長さがあります。L+delta次に、インプレースで復号化すると、L正しいバイトがdelta書き出されますが、ファイルの最後にまだバイトが残っています。

while ループの後に呼び出すとraf.setLength(totalBytes)、正しい結果が得られるはずです。

于 2011-03-17T11:01:58.730 に答える