C# 负指数RSA加密

C# 负指数RSA加密,c#,.net,algorithm,rsa,pkcs#11,C#,.net,Algorithm,Rsa,Pkcs#11,伙计们,我正在尝试使用公共和私有指数和模来加密(实际签名)数据,它在C#NET中,我不能使用rsacyptoserviceprovider,因为它还需要素数和其他CRT内容 所以我试着做以下几点: private Byte[] signData() { BigInteger biPrivEx = new BigInteger(this.privEx); // Those are byte[] BigInteger biPubEx = new BigInteger(this.pubEx);

伙计们,我正在尝试使用公共和私有指数和模来加密(实际签名)数据,它在C#NET中,我不能使用
rsacyptoserviceprovider
,因为它还需要素数和其他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();;
}
但问题是我得到了超出范围的异常,因为我的私有指数是负数

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

问题是,你首先得到了一个负的私有指数。根据您是如何获得此数据的,请尝试:

  • 添加
    n
  • 00
    字节关联到数组,以使其正确解析
  • 你也应该注意endianness问题。net的
    biginger
    使用小尾数,其他二进制格式可能使用大尾数


    尝试:



    如果知道
    e
    d
    n
    p

    ,也可以恢复
    p
    Q
    (以及其他参数),问题是你首先得到了一个负的私有指数。根据您是如何获得此数据的,请尝试:

  • 添加
    n
  • 00
    字节关联到数组,以使其正确解析
  • 你也应该注意endianness问题。net的
    biginger
    使用小尾数,其他二进制格式可能使用大尾数


    尝试:



    如果知道
    e
    d
    n
    p
    也可以恢复
    p
    Q
    (以及其他参数),我的输入看起来像
    Byte[]PrivateEx=StringToByteArray(“FFAABBCC
    )`(仅举个例子)我不认为它是负数,任何地方都没有减号。这可能是由BigInteger造成的吗?@Johny BigInteger假设最后一位是符号位。所以你需要追加
    00
    。你可能还需要先反转数组。我添加了两个候选函数。好吧,没有,它最终会计算,但结果仍然是错误的,不管怎样,为什么它会这样可能需要反转数组?@Johny如果二进制键是big-endian,你需要反转它,所以
    biginger
    假设little-endian读取它是正确的。我的输入看起来像
    Byte[]PrivateEx=StringToByteArray(“FFAABBCC
    )`(只是一个例子),我不认为它是负数,任何地方都没有负数。这可能是由BigInteger引起的吗?@Johny BigInteger假设最后一位是符号位。因此,您需要追加
    00
    。您可能还需要先反转阵列。我添加了两个候选函数。好的,没有,它最终计算出来了,但结果仍然是错误的,不管怎样,为什么可能需要反转数组?@Johny如果二进制键是big-endian,你需要反转它,所以
    biginger
    假设little-endian正确读取它。
    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());
    }