2013-03-02 68 views
1

前言:这是一项家庭作业,我几乎完成了它 - 这只是一小部分妨碍我完成。有了这些信息,请不要为我写任何代码,但可能注意我可能做错了什么。自编码RSA实施

好的,这里是一个简单的想法。 使用RSA以ECB模式加密/解密文件。这意味着如果块大小为4,并且字符串是'testdata','test'将用密钥加密,写入文件,然后'数据'将用密钥加密并写入文件。

我的实现是使用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)); 
} 

但这是没用的,因为什么是能够只加密后解密的地步。

这不起作用每一次,但它确实occassionaly工作:

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

你的问题与Python或C#没有直接关系,所以是的,标签应该被删除。我冒昧地这样做了。 – 2013-03-02 06:05:18

+0

这有太多的错误。 RSA“块”不是字节或比特对齐的,BigIntegers可以是正数也可以是负数,没有指定字符串编解码器,并且没有显示出现所述问题的I/O。噢,所谓的错误并不比“不正确阅读”更清晰。你怎么能期望得到这样的问题的任何帮助? – 2013-03-02 15:06:16

回答

0

您正在读取密文(二进制数据)到String,然后可能遇到一些charset转换,弄乱了一切。

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

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