私は現在、かなり標準的な暗号化の原則に基づいた学校のプロジェクトを完成させるために取り組んでいます。必要なものの大部分は正しく機能していますが、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;
}