C# BouncyCastle RSA 加密和解密

Posted

技术标签:

【中文标题】C# BouncyCastle RSA 加密和解密【英文标题】:C# BouncyCastle RSA Encryption and Decryption 【发布时间】:2012-06-02 17:28:41 【问题描述】:

有很多关于使用 BouncyCastle 进行 RSA 加密和解密的主题,但是我遇到了一些意想不到的行为。

我正在尝试使用大小为 64 字节的私钥加密 64 字节数据块

我计算 RSA 加密如下:

public byte[] Encrypt(byte[] data, AsymmetricKeyParameter key)

    var engine = new RsaEngine();
    engine.Init(true, key);
    var blockSize = engine.GetInputBlockSize();
    return engine.ProcessBlock(data, 0, blockSize );

我使用公钥计算解密如下

public byte[] Decrypt(byte[] data, AsymmetricKeyParameter key)

    var engine = new RsaEngine();
    engine.Init(false, key);
    var blockSize = engine.GetInputBlockSize();
    return engine.ProcessBlock(data, 0, blockSize );

我发现,当我使用 64 字节私钥加密我的 64 个数据时,我得到了一个 64 字节加密数据块。

但是,当我使用 64 字节公钥解码 64 字节数组时,我得到了一个大小为 62 字节的数据块。奇怪的是 62 字节数组中包含的值等于 64 字节原始数组的值(预加密),但是解码后的数组缺少原始数据的第一个索引和最终索引。

我尝试过使用不同的键和不同的数据集,结果都是一样的。

我一定是做错了什么,但我看不到。

干杯。

【问题讨论】:

请不要输入您的代码。复制并粘贴确切的代码,因为上面的代码甚至无法编译。 这里提示一下:你认为engine.GetInputBlockSize();的值是多少?这是另一个提示。该值根据 RSA 引擎是处于加密模式还是解密模式而有所不同。 到目前为止,您这样做了吗?因为我遇到了同样的问题,可能需要你的建议:) 【参考方案1】:

你把基本概念弄错了。

    512 位 RSA 很弱,至少使用 1024 位 私钥不用于加密。它用于解密和签名。公钥用于加密和验证。 填充对于 RSA 安全至关重要。典型的填充方案需要几十个字节。 即使使用教科书 RSA,RSA 也只能处理小于模数的值。因此,512 位模数不能对任意 64 字节/512 位值进行操作。但仅限于 511 位。

您应该退后一步,描述您真正想要实现的目标,以便我们找到适合您需求的方案。只有在那之后,您才应该担心实施它。

【讨论】:

我同意你所说的: 1.) 我正在使用的接口需要使用 512 位 RSA 密钥。 2.)我正在使用的接口执行公钥解密,因此需要私钥加密。 3.) 使用的填充是在加密之前预先计算的,因为使用了自定义填充方案。

以上是关于C# BouncyCastle RSA 加密和解密的主要内容,如果未能解决你的问题,请参考以下文章

NetCore 下使用RSA加密,解密;并且前端使用jsencrypt.js实现Rsa相关方法。

.NET Core加解密实战系列之——RSA非对称加密算法

使用预先存在的 RSA SSH 密钥解密 C# 中的文本

AES GCM 加解密:PHP VS C# BouncyCastle

Java C# 加密解密类库

C#中RSA加密解密和签名与验证的实现