序文: これは宿題です。私はほとんどそれを終えました。私が終わらせるのを妨げているのは、この小さなピースだけです。この情報を使用して、コードを書かないでください。ただし、間違っている可能性があることに注意してください。
さて、ここに簡単なアイデアがあります。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 のブロックで。しかし、それを適切に読み取らず、そのため、復号化に失敗します。
なぜこれが起こっているのでしょうか?