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吗?或者有更好的方法吗?在不同的程序中,我可以用我使用的数据来验证这一点,所以我有参考来验证它。
问题是首先得到了一个负的私有指数。根据你是如何得到这个破指数的尝试:
- 添加
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当您知道e
、d
和n
时,也可以恢复P
和Q
(以及从这些参数中恢复其余参数)。