0

私は現在、かなり標準的な暗号化の原則に基づいた学校のプロジェクトを完成させるために取り組んでいます。必要なものの大部分は正しく機能していますが、CFB および PCBC ブロック暗号を手動で実装するときに問題が発生しました。私のソース コードは Java で書かれています。この問題には、暗号化操作またはバイト操作を実行するときに、私が説明していない何かが発生している可能性があると思います。両方の暗号で使用される暗号化は 3DES であり、個別にテストしたところ、期待どおりに機能します。現在、「testtest」(つまり 16 バイト) などの文字列が正しく暗号化/復号化されている単純なケースのみを解決しようとしています。<=8 バイトの場合、コードは期待どおりに機能します (運が良かったかどうかにかかわらず)。この時点までのコア関数の私のコードは次のとおりです。

// for now encrypting at byte block level
protected String decrypt3DES_PCBC(byte[] input) throws Exception {
    System.out.println("Length of input @derypt: " + input.length);
    Block[] output = new Block[input.length];
    int idxA = 0, idxB = 16;
    // P1
    block.setBlock(XOR(tripleDES.get3DESDecryption(Arrays.copyOfRange(
            input, idxA, idxB)), IV));
    output[0] = block;
    System.out.println("decrypt length: " + output[0].getBlock().length);
    System.out.println("Initial decoded block: "
            + new String(output[0].getBlock(), "UTF-16BE"));

    // P2
    block.setBlock(XOR(tripleDES.get3DESDecryption(Arrays.copyOfRange(
            input, idxA + 16, idxB + 16)), Arrays.copyOfRange(input, idxA,
            idxB), output[0].getBlock()));
    output[1] = block;
    System.out.println("decrypt length: " + output[1].getBlock().length);
    System.out.println("Next decoded block: "
            + new String(output[1].getBlock(), "UTF-16BE"));

    return null;
}

private byte[] XOR(byte[] pt, byte[] cText) {
    byte[] output = new byte[pt.length];
    for (int i = 0; i < output.length; i++) {
        output[i] = (byte) (cText[i] ^ pt[i]);
    }
    return output;
}

private byte[] XOR(byte[] pt_0, byte[] pt_1, byte[] ct) {
    byte[] output = new byte[pt_0.length];
    for (int i = 0; i < output.length; i++) {
        output[i] = (byte) (pt_0[i] ^ pt_1[i] ^ ct[i]);
    }
    return output;
}
4

1 に答える 1

0

2 番目のブロックの暗号文を先に進めすぎています。

TripleDES のブロック サイズは 64 ビットで、これは 8 バイトに変換されます。あなたのコードは、ブロック サイズが 16 バイト、たとえば 128 ビットであると想定しているようです。

復号化アルゴリズムの実装は、渡された配列の最初の 8 バイトのみを使用すると推測しているため、最初のブロック (バイト 0-7) を正常に復号化できます (ご指摘のとおり)。次に、インデックス + 16 にスキップします。これにより、8 ~ 15 のバイトがスキップされます。

idxB への最初の割り当てを 8 に変更してから、2 番目の setBlock 呼び出しを次のように変更してみてください。

 // P2
block.setBlock(XOR(tripleDES.get3DESDecryption(Arrays.copyOfRange(
        input, idxA + 8, idxB + 8)), Arrays.copyOfRange(input, idxA,
        idxB), output[0].getBlock()));

物事がうまくいき始めるに違いない。

于 2013-01-03T22:34:09.867 に答える