C# 负指数RSA加密
伙计们,我正在尝试使用公共和私有指数和模来加密(实际签名)数据,它在C#NET中,我不能使用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);
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
字节关联到数组,以使其正确解析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());
}