您好,这是两年前问过的同一个问题:Java/JCE:解密使用 RSA 加密的“长”消息
我有一个大字节数组和 rsa 密钥对,由值 1024 启动。
使用 rsa 加密和指定密钥大小是强烈要求,我无法更改它。所以我不能使用对称加密和非对称加密对称密钥。我无法使用任何其他键。我有一个字节数组,需要返回加密的字节数组。我想知道是否有任何现成的工具可以解决这个问题?
很抱歉提出这样一个业余问题,但我真的需要帮助。
如前所述,您的问题只有一个答案,那就是“不”。 RSA 加密是一种将消息加密至给定大小的算法,该大小取决于密钥大小;使用 1024 位 RSA 密钥,并且 RSA 作为标准描述它,最大大小是117字节,没有更多。仅使用 RSA 无法加密更大的消息,这是明确的数学确定性。
如果您确实需要处理更长的消息,那么您一定必须添加其他东西。在这种情况下,请please,不要尝试做任何你自己设计的奇特的事情,比如将数据巧妙地分割成小块等。这条路通向厄运。你可能会生产出一些东西appears编译和运行,但在某种程度上总是很弱,就像几乎所有其他自制的密码学变体一样。这是因为安全性无法测试:它不是“有效”或“无效”的情况。
非对称加密的常用路径是这样的:
- 您选择适当长度的随机字节序列,例如128 位(即 16 个字节)。我们就这样称呼它吧K.
- 你加密K使用 RSA 公钥;这产生E.
- 您使用以下方式加密消息K使用对称加密算法(
"AES/CBC/PKCS5Padding"
)。由于这是一次性密钥,因此您可以使用全零 IV。这会产生一堆字节,我们称之为F.
- 加密消息是以下内容的串联E and F.
解密按相反顺序进行:使用 RSA 私钥进行恢复K from E, then K用于解密F到原始消息中。钥匙K永远不会存储在任何地方,并且新钥匙K每次都会生成(即使您对同一条消息加密两次)。这很重要,除非您了解自己在做什么(如果您了解,那么您已经知道了),否则不要更改它。
鉴于您对问题的陈述,您have做“只是 RSA”以外的事情。我上面描述的过程是关于安全方面您可以想出的最好的“其他东西”。
将一些加密元素组装到这样的协议中是一个充满陷阱的过程,因此使用已经定义的格式和支持库可能会运气更好。非对称加密的两种常见格式是CMS and OpenPGP。一个同时支持两者并具有良好声誉的图书馆是充气城堡.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)