C# BouncyCastle RSA 加密和解密


有很多

关于使用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字节原始数组(预加密)的值,但是解码数组缺少原始数据的第一个索引和最终索引。

我尝试使用不同的键和不同的数据集,同样的事情发生了。

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

干杯。

你弄错了基本概念。

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

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

最新更新