我正在创建一个小软件来使用非对称密钥加密和解密数据。
问题是,我在 C# 中编码,即使我使用:
BigInteger.Pow(BigIntenger myNumber, int myExponent);
指数是一个“int”,我的值对于一个 int 来说太大了。
只是为了快速解释并确保我没有犯任何错误,您必须使用大数字来使没有私钥的解密变得更加困难。
所以我有
公钥(N,C)。
私钥(U,N)。
例如你想加密:“Bonjour !” 到 UTF8。
你将会拥有 :
B⇔66 / o⇔111 / n⇔110 / j⇔106 / o⇔111 / u⇔117 / r⇔114 /(空格)⇔32 /! ⇔33
然后将每个数字提高到 C 和模 N 的幂。
例如:valueOfB = (66^C)%N。
现在您的消息已加密。
如果你想解密它,你必须将每个值乘以指数 U 和模 N。
例如:(valueOfB^U)%N
所以我只有在使用小数字时才能这样做,因为我会有一个适合“int”的小 U 值,但它不安全,我怎么能用像 BigInteger 而不是 int 这样的大 U 来做到这一点?
BigInteger.Pow
BigInteger 将是一个非常复杂的数字。
二进制乘法具有以下特性:(粗略地说)将一个n
-bit 数乘以一个m
-bit 数会产生一个近似(n+m)
-bit 的答案。
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句