gpt4 book ai didi

java - 自编码 RSA 实现

转载 作者:行者123 更新时间:2023-12-01 04:49:52 25 4
gpt4 key购买 nike

前言:这是一项家庭作业,我快完成了——只是这一小块阻碍了我完成。有了这些信息,请不要为我编写任何代码,但可能会注意到我可能做错了什么。

好的,这是一个简单的想法。使用 RSA 以 ECB 模式加密/解密文件。这意味着如果 block 大小为 4,并且字符串为“testdata”,则“test”将使用 key 加密并写入文件,然后“data”将使用 key 加密并写入文件。

我的实现使用 128 作为 block 大小,但我遇到了一个奇怪的错误。

这是我的代码,用于加密 128 的 block 并附加到文件:

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 block 为单位。但它无法正确读取,因此解密失败!

知道为什么会发生这种情况吗?

最佳答案

您正在将密文(二进制数据)读入String,然后可能会遇到一些字符集转换,从而搞乱一切。

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

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

关于java - 自编码 RSA 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15171339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com