1

序文: これは宿題です。私はほとんどそれを終えました。私が終わらせるのを妨げているのは、この小さなピースだけです。この情報を使用して、コードを書かないでください。ただし、間違っている可能性があることに注意してください。

さて、ここに簡単なアイデアがあります。RSA を使用して、ECB モードでファイルを暗号化/復号化します。これは、ブロック サイズが 4 で文字列が「testdata」の場合、「test」がキーで暗号化されてファイルに書き込まれ、「data」がキーで暗号化されてファイルに書き込まれることを意味します。

私の実装ではブロック サイズとして 128 を使用していますが、奇妙なエラーが発生しています。

128 のブロックを暗号化し、ファイルに追加するコードは次のとおりです。

ArrayList<byte[]> bytes = new ArrayList<byte[]>();
String file = read_file(input_file);
int index = 0;
while (index<file.length()) {
    byte[] block = file.substring(index, Math.min(index+128,file.length())).getBytes();
    cipher = new BigInteger(block).modPow(public_exponent, public_modulus).toByteArray();
    bytes.add(cipher);
    append_bytes(output_file, cipher);
    index+=128;
}

暗号化は完全に機能します。暗号化が問題ではないと私が考える理由は次のとおりです。

  • ファイルに書き込まれているデータの復号化が機能する
  • すべての暗号化されたデータをリストに追加すると、ファイルの読み取りと同じデータが含まれます
  • 上記のリストから復号化すると、復号化は問題なく機能します。

しかし、それは最も奇妙な問題です。

これにより、正しい出力が生成されます。

for(int i = 0; i < bytes.size(); i++) {
    decrypted = new BigInteger(bytes.get(i)).modPow(d, modulus).toByteArray();
    System.out.print(new String(decrypted));
}

しかし、それは役に立ちません。なぜなら、暗号化した後でしか復号化できないからです。

これは毎回機能するわけではありませんが、時折機能します。

index = 0;
file = new String(read_bytes(output_file));
while(index < file.length()) {
    byte[] block = file.substring(index, Math.min(index+128,file.length())).getBytes();
    decrypted = new BigInteger(block).modPow(d, modulus).toByteArray();
    System.out.println(new String(decrypted));
    index+= 128;
}

ファイルが書き込まれたのと同じ方法でファイルを読んでいます。128 のブロックで。しかし、それを適切に読み取らず、そのため、復号化に失敗します。

なぜこれが起こっているのでしょうか?

4

1 に答える 1