security - 是否有可能在知道公钥和 "original data=>encrypted data"条目集的情况下获取 RSA 私钥?

标签 security rsa

我致力于允许插件访问不同功能集的应用程序,每个插件都提供“初始化字符串”,它设置对不同功能的访问级别。开发人员向我发送此字符串,我使用 1024 位 RSA 私钥对它们进行加密,然后将编码数据发回。启动时,我的应用程序使用内置公钥对编码数据(编码初始化字符串)进行解码,如果“解码数据!=初始化字符串”,则它将无法启动。

那么,是否可以使用“初始化字符串”=>“编码初始化字符串”(从其他插件中提取)的数据库来破解我的私钥,或者可以在合理的时间内对其进行暴力破解?

最佳答案

当您说“使用 RSA 私钥加密”时,您实际上并没有加密内容。这是一个历史性的困惑。您所做的是一个数字签名,插件会使用相应的公钥进行验证。造成困惑的原因是,在足够的情况下,RSA 签名可以被视为一种“反向加密”,私钥首先起作用。然而,它在一些细节上有所不同(例如填充和哈希函数的参与),这使得它在实现时有很大不同。

如果您正在使用正确的 RSA 数字签名方案(例如 PKCS#1 第 8 节“带附录的签名方案”中描述的方案之一),并带有通过正确实现的 key 生成算法生成足够大的 RSA key (1024 位或更多),然后攻击者没有已知的、计算上可行的方法来利用您生成的签名来伪造新的签名签名(更不用说破解 RSA 私钥)。无法证明您的签名对攻击者没有帮助,但 30 年的公共(public)研究并未发现此类漏洞。

但请注意,使用细节,特别是填充(初始部分,将待签名的数据转换为 RSA 数学核心可以处理的大数)已被证明是微妙的;许多提出的填充方法已被成功攻击。 PKCS#1 填充已经接受了相当长一段时间的审查(“v1.5”填充长达二十年),并且到目前为止已经抵制了所有此类尝试。 “ISO 9796”系列填充的表现并不好,许多变体都被破坏了。

如果您没有根据既定标准(即 PKCS#1)计算签名,那么您就是在自找麻烦。不要那样做。幸运的是,大多数 RSA 实现(在加密库和编程语言/环境中)都遵循 PKCS#1。

关于security - 是否有可能在知道公钥和 "original data=>encrypted data"条目集的情况下获取 RSA 私钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2659477/

相关文章:

encryption - Go中加密/解密的源文本、 key 大小关系

javascript - 以下 javascript 是否可以防止任意代码执行?

java - CDI和EJB,安全问题?

C#:RSA 实现不适用于大 key

java - 使用RADIUS的RSA新引脚模式服务器通信

PHP RSA-公钥base64编码

security - 使用同一文件的校验和加密文件

c# - 代码访问安全 - 基础知识和示例

java - 解密异常

c# - 使用公钥解密