【问题标题】:RSA algorithm with use of RSACryptoServiceProvider使用 RSACryptoServiceProvider 的 RSA 算法
【发布时间】:2014-12-11 03:52:58
【问题描述】:

我有点难以理解RSACryptoServiceProvider 类...我应该使用长度为256 位的消息 加密一个密钥,它也是256 位长。 的输出不应该也是 256 位长吗? 这是我的代码:

//key generation

byte[] bytes = new byte[32];
var rng = new RNGCryptoServiceProvider();
rng.GetBytes(bytes);
k2 = bytes;

//encryption function

static public byte[] Encryption(byte[] Data, RSAParameters RSAKey, bool DoOAEPPadding)
{  
    byte[] encryptedData;
    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
    {
        RSA.ImportParameters(RSAKey);
        encryptedData = RSA.Encrypt(Data, DoOAEPPadding);
    }
    return encryptedData;
}

然后最后计算

ciphertext = Encryption(k2, RSA.ExportParameters(false), false);

产生一个byte[128] 密文又名1024 位。我不应该得到大小为byte[32]的密文吗?

【问题讨论】:

  • 也许你应该在你的函数之后命名你的变量...

标签: c# encryption rsa


【解决方案1】:

您似乎使用密钥 k2 作为 RSA 加密的数据。如果你想要,那没关系,例如使用 RSA 包装 256 位 AES 密钥。但是您的 RSA 密钥是第二个参数,而不是第一个。

然后填充k2 中的数据(根据旧的 PKCS#1 v1.5 方案),之后将使用 public exponentmodulus 的 RSA 密钥。 RSA 密钥的模数决定了密钥的大小。这种模幂运算将始终产生介于 0 和模 - 1 之间的结果。但是,结果始终以字节为单位填充到密钥大小(使用称为 I2OSP 的函数)。

所以看起来你的结果是 1024 位,这意味着你的 RSA 密钥对也是 1024 位。

【讨论】:

  • 编辑了我的答案以符合问题的变化。如果有任何不清楚的地方,请大声疾呼。
  • 你有没有想过用密钥 k1 计算 k2 的 RSA,即:E_k1 (k2),使用 RSACryptoServiceProvider?
  • 什么是 k1?如果它是 RSAKey,那么您已经在这样做了。 RSA 公钥由公共指数和模数组成。它的大小绝不应该只有 32 个字节,它总是会产生一个模数大小的密文,至少比明文大 11 个字节(如果应用了填充)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2021-04-01
  • 1970-01-01
相关资源
最近更新 更多