前言:这是一个家庭作业,我几乎完成了它 - 它只是这个小小的部分阻止我完成。有了这些信息,请不要为我编写任何代码,但可能会注意到我可能做错了什么。
好的,这是一个简单的想法。 使用RSA使用ECB模式加密/解密文件。这意味着如果块大小为4,并且该字符串是“测试数据”,则测试'将使用密钥加密,写入文件,然后使用数据'将使用密钥加密并写入文件。
我的实现是使用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.但它没有正确读取它,因此,解密失败!
知道为什么会这样吗?
答案 0 :(得分:0)
您正在将密文(这是二进制数据)读入String
,然后可能会遇到一些乱七八糟的转换,这会破坏一切。
解密应该读取原始字节。如果您需要不同阵列中的每个块,则可以使用Arrays.copyOfRange(original,from,to)
。
另一种方法是在将密文写入文件之前对密文进行base64编码,然后在解密之前进行base-64解码。