【问题标题】:input too large for RSA cipher with BouncyCastle使用 BouncyCastle 的 RSA 密码输入太大
【发布时间】:2013-09-26 17:47:10
【问题描述】:

我正在尝试以给定的时间间隔将 SFTP 服务写入服务器,下载目录中的所有文件,然后解密它们以进行处理。

解密方法在某一时刻有效,从那以后我没有修改过它。我仍在使用与成功运行时相同的密钥。

我正在为 BouncyCastle 使用 PGPEncrypt、PGPDecrypt 和 PGPEncryptionKeys 类,可在此处找到:https://github.com/sledwith/PGP-Decryption-With-C-Sharp

另外,我修改了如下代码:Exception on decrypting file using BouncyCastle PGP

如果你注意到了,我评论了它是如何修复我的代码和解密工作的。

现在,它不是。

有没有人知道为什么会发生这种情况,或者我该如何解决它?

【问题讨论】:

  • 如果您可以将代码的相关部分发布到此问题中会有所帮助。
  • 你搞定了吗?
  • 没有。很抱歉没有输入。因此,在我从帖子中的最后一个链接中删除修改后,我发现它适用于我的本地测试,但我仍在等待一组新的测试数据来尝试查看那里发生了什么,因为它在我尝试时有效在我的第一组测试数据上。

标签: c# rsa bouncycastle openpgp


【解决方案1】:

我猜测您正在使用 1024 位 RSA 公钥/私钥并试图用它加密 128 字节的东西?如果我是对的,请使用更大的 RSA 密钥(RSA 4096 将允许您加密最多约 500 个字节)。

我在链接的帖子中注意到您说这是零星的。一些谷歌搜索表明,如果您在要加密的字节中有前导零,它可能能够处理完整的 128 个字节。

另外 - 如果您只是使用密钥对加密“数据”,您需要确定它不会超出这些限制(RSA 2048 为 240 左右字节,而 RSA 4096 为 500 左右字节)。好的做法和未来的证明是对您的所有数据实施对称密钥加密,并仅使用 RSA 密钥来加密/解密您的密钥。

【讨论】:

  • 我不明白你关于密钥大小的说法。 1024 位 RSA 公钥可以加密长达 1024 位的数据。现在,通常使用填充,但仍然......人们可以期待 900 多位数据被加密。
  • @DuncanJones 输入错误,感谢您的更正 - 应该是字节。
  • 我很难想象 128 个 byte 对称密钥。 AES 密钥不大于 256 。三重 DES 密钥是 192 位...
  • @DuncanJones 打算完全删除对对称密钥的所有引用,我猜他正在加密 128 个字节的东西,这将解释他的错误和它的零星功能必须垫。
  • @DuncanJones 或 256+ 到 2048 RSA 密钥等。错误非常明显,我之前使用 bouncycastle 看到了确切的错误消息,当时我的一位开发人员直接使用公钥/私钥对而不是用于加密数据的对称密钥,最终有人在其中插入了 500 多个字节。
【解决方案2】:

如果你没有明确地使用 PGP 过程,你可以在这里使用我的库:

https://github.com/zenith-nz/ObscurCore

它的“横幅功能”尚未完全激活(创建一种加密档案),但它可以完成您想要的一切,它似乎 - 它使用 ECDHC 方案 UM1 进行密钥派生,并实现了一个大型各种分组和流密码。它建立在 BouncyCastle 之上。

【讨论】:

    【解决方案3】:

    我想我解决了这个问题;请尝试此代码。

    public string StringToDecrypt(string text)
    {
        byte[] toDecrypt = Convert.FromBase64String(text);
        AsymmetricCipherKeyPair keyPair;
    
        using (var reader = File.OpenText(@"Private Key File Path"))
        {
            keyPair = (AsymmetricCipherKeyPair) new PemReader(reader).ReadObject();   
        }
    
        var engine = new RsaEngine();
        engine.Init(false, keyPair.Private);
    
        return Encoding.UTF8.GetString(engine.ProcessBlock(toDecrypt, 0, toDecrypt.Length));
    }
    

    【讨论】:

    • 您好 Obaid,欢迎访问该网站。您可能希望为您的答案提供更多上下文并考虑其格式。请阅读How to Answer 并考虑在发布之前检查您的答案以检查格式是否正确。谢谢。
    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多