RSA-使用负指数加密

本文关键字:加密 负指数 RSA- | 更新日期: 2023-09-27 18:25:45

伙计们,我正在尝试使用Public和Private指数和模数加密(实际上是签名)数据,它在C#中,我不能使用RSACryptoServiceProvider,因为它还需要素数和其他CRT东西。

所以我尝试做以下事情:

private Byte[] signData()
{
  BigInteger biPrivEx = new BigInteger(this.privEx); // Those are byte[]
  BigInteger biPubEx = new BigInteger(this.pubEx);
  BigInteger biMod = new BigInteger(this.mod);          
  BigInteger cyph = BigInteger.ModPow(new BigInteger(pkcs11), biPrivEx, biMod); // This raise exception
  return cyph.ToByteArray();;
}

但问题是我得到了Out Of Range Exception,因为我的私有指数是负数。

我做错了什么?或者可以很容易地从中恢复CRT吗?或者有更好的方法吗?在不同的程序中,我可以用我使用的数据来验证这一点,所以我有参考来验证它。

RSA-使用负指数加密

问题是首先得到了一个负的私有指数。根据你是如何得到这个破指数的尝试:

  1. 添加n
  2. 00字节插入到数组中,以使其正确解析

您还应该小心端序问题。net的BigInteger使用小端序,其他二进制格式可能使用大端序。


尝试:

BigInteger ParseBinaryLE(byte[] raw)
{
   return new BigInteger(raw.Concat(new byte[]{0}).ToArray());
}
BigInteger ParseBinaryBE(byte[] raw)
{
   return new BigInteger(raw.Reverse().Concat(new byte[]{0}).ToArray());
}

AFAIK当您知道edn时,也可以恢复PQ(以及从这些参数中恢复其余参数)。