手动实现RSA java。填充想法

时间:2014-04-05 12:45:57

标签: java encryption rsa public-key-encryption

我在java上手动实现RSA(是的,我知道不是最好的主意,但它是出于大学目的)。我的算法对于小文本工作得很好,但是当考虑大文本时算法会因为比特数优于我的密钥而中断。

我正在研究实现填充方案的可能性,以便将我的纯文本分成小文本,然后加密它们。

有关于如何填充的建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

对不起,我正在写一个包含与divanov的答案基本相同的信息的答案,但编辑添加我认为重要的所有小细节将完全重写答案。

通常,您不希望直接对数据进行非对称加密,而是使用RSA交换用于对称加密数据的对称密钥。你可以这样做(想法来自"Cryptography Engineering" by Ferguson, Kohno and Schneier,这本书我可以全心推荐):

  1. 假设l是模数n的位长,请生成l-1位长的随机数r。使用RSA公钥加密r
  2. 使用加密哈希函数从k生成对称密钥r。我建议使用sha256:k=sha256(r)
  3. 使用类似CBC的正确“模式”,使用AES256等分组密码对数据进行加密。
  4. 这个过程的优点是你根本不需要关心RSA填充(并且有很多东西可能会出错)。但是,不要在解密后检查r的结构,如果进入哈希函数,只要你可能打开你自己填充oracle攻击(类似于{{3但是,这超出了我的答案的范围。

    请注意,对于真实场景,您还必须关注this one数据。加密最常见的唯一常见用例是“静止数据”,即如果没有数据通过网络传输,您只关心数据的物理盗窃。

答案 1 :(得分:0)

当需要加密比非对称密钥更长的纯文本时,通常生成随机对称密码块密钥,例如,AES128然后它用于加密数据。在进程结束时,对称密钥使用RSA公钥加密,并与密文一起保存。

解密包括使用私有RSA密钥恢复对称密钥,然后使用前者解密长消息。

这样做的原因之一是RSA比例如AES慢得多。另一个是分组密码对消息的大小没有限制。

相关问题