解密用RSA java加密的"长"消息

Den*_*nis 4 java encryption rsa jce encryption-asymmetric

嗨这是同一个问题,两年前被问过: Java/JCE:解密用RSA加密的"长"消息

我有一个大字节数组和rsa密钥对,由值1024启动.使用rsa加密和密钥的指定大小是强烈要求,我无法更改它.所以我不能使用非对称加密对称密钥进行对称加密.我不能使用任何其他键.我有一个字节数组,需要返回加密的字节数组.我想知道是否有任何现成的工具,可以解决这个问题?

对不起这样一个业余的问题,但我真的需要帮助.

Tho*_*nin 12

如上所述,您的问题只有一个答案,那就是"不".RSA加密是一种算法,它对给定大小的消息进行加密,这取决于密钥大小; 使用1024位RSA密钥,RSA作为标准描述它,最大大小为117字节,不再多.单独使用RSA无法加密更大的消息,这是一个明确的数学确定性.

如果您确实需要处理更长的消息,那么您必须添加其他内容.在那种情况下,拜托,不要尝试用你自己设计的任何东西来做一些非常聪明的数据分成小块等.那条道路导致厄运.你可能会产生似乎可以编译和运行的东西,但在某种程度上它总是很弱,就像几乎所有其他自制的密码学变体一样.那是因为无法测试安全性:它不是"工作"或"不工作"的情况.

因此,非对称加密的良好路径如下:

  1. 您可以选择一些适当长度的随机字节序列,例如128位(即16字节).让我们把它ķ.
  2. 您使用RSA公钥加密K ; 这会产生ê.
  3. 您使用对称加密算法()使用K加密消息"AES/CBC/PKCS5Padding".由于这是一次性密钥,因此您可以使用全零IV.这就产生了一堆的字节,我们称之为˚F.
  4. 然后,加密的消息是EF的串联.

解密以相反的顺序进行:RSA私钥用于从E恢复K,然后K用于将F解密为原始消息.密钥K永远不会存储在任何地方,每次都会生成一个新密钥K(即使您将相同的消息加密两次).这很重要,除非你明白自己在做什么,否则不要改变它(如果你这样做,那么你就已经知道了).

鉴于你对你的问题的陈述,你必须做的不仅仅是"只是RSA".我上面描述的程序是关于你可以提出的最好的"其他东西",安全方面.

将一些加密元素组装到这样的协议中是一个充满陷阱的过程,因此使用已定义的格式和支持库可能会有更好的运气.非对称加密的两种常见格式是CMSOpenPGP.Bouncy Castle是一个既支持又享有良好声誉的图书馆.