RSA - 带负指数的加密

时间:2012-02-24 11:56:37

标签: c# .net algorithm rsa pkcs#11

好吧我们正在尝试使用公共和私有指数和模数加密(实际签名)数据,它在C#.NET中我不能使用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?或者有没有更好的方法怎么做? 在不同的程序中,我能够使用我正在使用的数据,所以我有参考来验证它。

1 个答案:

答案 0 :(得分:1)

问题在于你首先得到一个负的私人指数。根据你如何得到这个破坏的指数尝试:

  1. 向其添加n
  2. 00字节与数组相关联,以使其正确解析。
  3. 您还应该注意字节序问题。 .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当您知道PQ和{{1}时,也可以恢复ed(以及其他参数) }。