java - 解密用RSA java加密的 “long”消息

标签 java encryption rsa encryption-asymmetric jce

您好,这是同一个问题,两年前有人问过: Java/JCE: Decrypting “long” message encrypted with RSA

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

很抱歉提出这样一个外行的问题,但我真的需要帮助。

最佳答案

如前所述,您的问题只有一个答案,那就是“否”。 RSA 加密是一种将消息加密到给定大小的算法,这取决于 key 大小;使用 1024 位 RSA key ,RSA 为 the standard描述它,最大大小是117字节,不能再多了。无法单独使用 RSA 加密更大的消息,这是一个明确的数学确定性。

如果您确实需要处理更长的消息,那么您必然必须添加其他内容。在那种情况下,请,不要尝试做任何你自己设计的花哨的事情,比如将数据非常巧妙地分成小块等等。这条路通向厄运。您可能会产生一些看起来 可以编译和运行的东西,但它在某些方面总是很弱,就像几乎所有其他自制的密码学变体一样。这是因为无法测试安全性:它不是“有效”或“无效”的情况。

非对称加密的常用路径是这样的:

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

解密以相反的顺序进行:RSA私钥用于从E恢复K,然后K用于解密< em>F 到原始消息中。 key K 永远不会存储在任何地方,并且每次都会生成一个新 key K(即使您对同一消息加密两次)。这很重要,除非您了解自己在做什么,否则不要更改它(如果您了解,那么您已经知道了)。

鉴于您对问题的陈述,您必须做一些“仅RSA”之外的事情。我上面描述的过程是关于安全方面您可以想出的最好的“其他东西”。

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

关于java - 解密用RSA java加密的 “long”消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2653591/

相关文章:

java - 使用匿名类有什么害处?

java - 如何从 Android 应用程序强制连接到特定的 GSM 网络

security - 了解 TLS/SSL 协议(protocol)

javascript - 发送问题 -> 加密 -> 使用 jQuery 和 PHP 获取

cryptography - 在 JDK 1.8 中找不到 RSA/NONE/NoPadding 提供程序

java - 将比较器从 C# 移植到 Java

c# - 没有 SslStream 的 SSL 因为我想通过 SOCKS5 代理连接

ios - 如何在 Swift for IOS 中生成 RSA 非对称 key 对?

.net - 如何使用 .NET Framework 执行 RSAES-OAEP 加密和解密?

java - 从负 Joda 时间段中删除 '-'