C#BouncyCastle RSA加密和解密

时间:2012-05-28 10:25:26

标签: c# encryption rsa bouncycastle

使用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 个答案:

答案 0 :(得分:2)

你的基本概念错了。

  1. 512位RSA非常弱,使用至少1024位
  2. 私钥不用于加密。这是解密和签名。公钥用于加密和验证。
  3. 填充对RSA安全至关重要。典型的填充方案需要几十个字节。
  4. 即使使用教科书RSA,RSA也只能处理小于模数的值。因此,512位模数不能在任意64字节/ 512位值上运行。但只有511位。
  5. 您应退后一步,描述您实际想要实现的目标,以便我们找到符合您需求的方案。只有在那之后你才应该担心实施它。