前言:这是一项家庭作业,我几乎完成了它 - 这只是一小部分妨碍我完成。有了这些信息,请不要为我写任何代码,但可能注意我可能做错了什么。自编码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块。但它没有正确阅读,并因此,解密失败!
任何想法,为什么这可能会发生?
你的问题与Python或C#没有直接关系,所以是的,标签应该被删除。我冒昧地这样做了。 – 2013-03-02 06:05:18
这有太多的错误。 RSA“块”不是字节或比特对齐的,BigIntegers可以是正数也可以是负数,没有指定字符串编解码器,并且没有显示出现所述问题的I/O。噢,所谓的错误并不比“不正确阅读”更清晰。你怎么能期望得到这样的问题的任何帮助? – 2013-03-02 15:06:16