由于指数大小有限,如何在C#中创建非对称密钥?
我正在创建一个使用非对称密钥加密和解密数据的小软件 问题是,我正在用C#编码,即使我使用:由于指数大小有限,如何在C#中创建非对称密钥?,c#,encryption,biginteger,C#,Encryption,Biginteger,我正在创建一个使用非对称密钥加密和解密数据的小软件 问题是,我正在用C#编码,即使我使用: BigInteger.Pow(BigIntenger myNumber, int myExponent); 指数是一个“int”,我的值对于int来说太大了 为了快速解释并确保我没有犯任何错误,您必须使用大数字,以便在没有私钥的情况下更难解密 所以我有 N=P*Q P和Q都是质数 M=(P-1)+(Q-1) C是带M的质数 然后用C×U+M×V=1来求U 公钥(N,C)。 私钥(U,N)。 例如,
BigInteger.Pow(BigIntenger myNumber, int myExponent);
指数是一个“int”,我的值对于int来说太大了
为了快速解释并确保我没有犯任何错误,您必须使用大数字,以便在没有私钥的情况下更难解密
所以我有
- N=P*Q
- P和Q都是质数
- M=(P-1)+(Q-1)
- C是带M的质数
- 然后用C×U+M×V=1来求U
所以我只能在使用小数值的情况下这样做,因为我会有一个小的U值,与“int”匹配,但它不安全,我怎么能用像大U的BigInteger而不是int来做呢?
BigInteger。BigInteger的Pow
将是一个非常复杂的数字
二进制乘法的特性是(粗略地说)将n
-位数乘以m
-位数,得到一个大约(n+m)
-位的答案
10 * 4096 = 0b1010 * 0b1_0000_0000_0000 (4 bits, 13 bits)
40960 = 0b1010_0000_0000_0000 (16 bits)
16 * 4096 = 0b1_0000 * 0b1_0000_0000_0000 (5 bits, 13 bits)
65536 = 0b1_0000_0000_0000_0000 (17 bits)
15 * 4095 = 0b1111 * 0b1111_1111_1111 (4 bits, 12 bits)
61425 = 0b1110_1111_1111_0001 (16 bits)
因为求幂是重复的乘法,乘法是重复的加法,所以我们可以看到,将1024位数字提高到512位数字的幂,将产生1024*512位(524288位,65536字节)范围内的答案
但是你接下来要做一个模运算,把它带回到1024位数字的范围。那太浪费了
谢天谢地,算法的存在是为了提高效率。非常感谢你,.NET为你写了这封信
你要找的是
valueOfB = BigInteger.ModPow(66, U, N);
你可能想看看这里:,还有另一个:@PeterB:在某个时候,必须有人在库后面编写代码,这意味着其他人不需要再做任何事情。所以我不认为答案仅仅是说不要费心去做-有很多理由想做这类事情-为了好玩,为了编写加密代码的经验。。。我已经为JPG和MP3加密/解密编写了自己的代码-我永远不会在生产代码中使用它,但这很有趣。在您对过程的描述中,您写道“那么每个数字都必须乘以指数C和模N”。但是您显示的代码将数字提高到C的幂次方-这两种代码中哪一种是正确的?如果你在乘法,那么BigInteger允许两个BigInteger相乘。谢谢你,PaulF,我不知道怎么正确地说,实际上这是“将数字提高到C的幂”,就像例子中的:)!不要使用
a^b
,而是使用(a^b)%c
:有人在上面的评论中给了我这个功能,但感谢您的解释:)!我可以把这个问题标记为已解决。