当前位置: 首页 > 知识库问答 >
问题:

为什么Bouncy Castle RSAEngine.ProcessBlock方法在解密时总是返回255个字节?

黄流觞
2023-03-14

我使用RSA私钥加密一些数据。被加密的数据长度为294字节。加密函数输出512字节。我然后通过传递上述输出密文和相应的公钥来调用解密方法。我的问题是解密总是返回255字节的缓冲区,而加密函数的实际输入是294字节。这可能是什么原因?

下面是加密和解密函数的源代码。

public static byte[] RSAEncrypt(byte[] data, AsymmetricKeyParameter key)
        {
            try
            {
                RsaEngine e = new RsaEngine();
                e.Init(true, key);

                int blockSize = e.GetInputBlockSize();

                List<byte> output = new List<byte>();

                for (int chunkPosition = 0; chunkPosition < data.Length; chunkPosition += blockSize)
                {
                    int chunkSize = Math.Min(blockSize, data.Length - (chunkPosition * blockSize));
                    output.AddRange(e.ProcessBlock(data, chunkPosition, chunkSize));
                }

                return output.ToArray();
            }
            catch (Exception ex)
            {

                return null;
            }
        }


public static byte[] RSADecrypt(byte[] data, AsymmetricKeyParameter key)
        {
            try
            {
                RsaEngine e = new RsaEngine();
                e.Init(false, key);

                int blockSize = e.GetInputBlockSize();

                List<byte> output = new List<byte>();

                for (int chunkPosition = 0; chunkPosition < data.Length; chunkPosition += blockSize)
                {
                    int chunkSize = Math.Min(blockSize, data.Length - (chunkPosition * blockSize));
                    output.AddRange(e.ProcessBlock(data, chunkPosition, chunkSize));
                }

                return output.ToArray();
            }
            catch (Exception ex)
            {

                return null;
            }
        }

共有1个答案

薛保臣
2023-03-14

RSA是一种非对称加密方法,它对小于RSA密钥模数的数字进行加密(255字节表示您使用的是256*8=2048位RSA密钥/模数)

要加密大于该值的值,您需要做的是生成一个密钥,使用对称密码加密数据(AES不是一个坏的选择),并使用您的私有RSA密钥加密AES密钥(最好与一些其他随机数据一起加密)。

AES密钥的最大值为256位,它可以很好地使用RSA进行加密,并且AES没有大小限制。

 类似资料:
  • 在.NET Framework 4.5中,由Trim()方法调用的专用TrimHelper()方法使用以下条件来确定是否需要修剪字符:(由.NET Reflector反编译的代码) 我想知道为什么IsBOMWhitesspace方法总是返回false?? 这是微软计划在未来改变/扩展的吗?例如,通过检查char是否为‘u efff’并在这种情况下返回true?

  • 问题内容: 我有以下代码。应该返回表的最后一行的mysqli_insert_id()(在本例中为“ $ last_row”)始终返回0。为什么会这样呢? 问题答案: 并 没有 返回表的最后一排的ID。从文档中,它: …返回由查询产生的ID,该查询是对具有具有AUTO_INCREMENT属性的列的表进行的。如果最后一个查询不是or 语句,或者如果修改后的表没有带有属性的列,则此函数 将返回零 。 (

  • 问题内容: 我找到了JavaDoc的方法: 返回:如果此线程已被中断,则返回true;否则返回false。 否则为假。 我对这种方法的理解有误。此外,我可能会误解Thread中的“中断”概念。 欢迎任何解释!谢谢! 程式码片段: 在线程定义中: 调用: 问题答案: 引发异常后,线程不再处于中断状态。

  • 看见http://codepen.io/anon/pen/NGqPNz CSS: JS: 滚动事件在主体元素上触发。滚动条位于body元素上,而不是html或window元素上。那么,为什么要修改文档呢。身体scrollTop或$('body')。scrollTop()返回0? 有什么方法可以检测滚动条的位置,或者我卡住了,如果我想使用高度: 100%;溢出:隐藏在html元素? 谢谢

  • 问题内容: 我一直在获取要使用mysqli返回的行数方面遇到麻烦。即使确实有一些结果,我每次都会得到0。 为什么没有显示正确的数字? 问题答案: 您需要先调用num_rows查找: 请参阅文档,该文档显示在页面顶部附近(在主要说明区域中)…

  • 初学者问题,很抱歉,如果这不是一个合适的地方,请尝试学习在中逻辑是如何工作的,我无法理解这一点 我希望它会说“是的!”如果是A、A、D或D,而是z,但出于某种原因,它会说“是的!”无论第一个符号是什么,都会断开,并且只检查第二个符号是否为z。