好吧我们正在尝试使用公共和私有指数和模数加密(实际签名)数据,它在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?或者有没有更好的方法怎么做? 在不同的程序中,我能够使用我正在使用的数据,所以我有参考来验证它。
答案 0 :(得分:1)
问题在于你首先得到一个负的私人指数。根据你如何得到这个破坏的指数尝试:
n
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当您知道P
,Q
和{{1}时,也可以恢复e
和d
(以及其他参数) }。