自编码RSA实施

时间:2013-03-02 06:03:02

标签: java encryption rsa

前言:这是一个家庭作业,我几乎完成了它 - 它只是这个小小的部分阻止我完成。有了这些信息,请不要为我编写任何代码,但可能会注意到我可能做错了什么。

好的,这是一个简单的想法。 使用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.但它没有正确读取它,因此,解密失败!

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

您正在将密文(这是二进制数据)读入String,然后可能会遇到一些乱七八糟的转换,这会破坏一切。

解密应该读取原始字节。如果您需要不同阵列中的每个块,则可以使用Arrays.copyOfRange(original,from,to)

另一种方法是在将密文写入文件之前对密文进行base64编码,然后在解密之前进行base-64解码。