如何在指数大小有限的情况下在C#中创建非对称密钥?

时间:2017-12-18 10:24:07

标签: c# encryption biginteger

我正在创建一个使用非对称密钥加密和解密数据的软件。

问题是,我在C#编码,即使我使用:

 BigInteger.Pow(BigIntenger myNumber, int myExponent);

指数是一个“int”,对于一个int,我的值是大的。

为了快速解释并确保我没有犯任何错误,你必须使用大数字来解密而不使用私钥更难解决。

所以我有

  • N = P * Q
  • P和Q都是素数。
  • M =(P-1)+(Q-1)
  • C是M
  • 的素数
  • 然后找到U:C×U + M×V = 1

公钥(N,C)。

私钥(U,N)。

例如,您想要加密:“Bonjour!”到UTF8。

你将拥有:

B⇔66/o⇔111/n⇔110/j⇔106/o⇔111/u⇔117/r⇔114/(espace)⇔32/!⇔33

然后将每个数字提升到C的幂并模N.

  

Ex:valueOfB =(66 ^ C)%N。

现在您的邮件已加密。

如果要对其进行解密,则必须将每个值乘以指数U和模N.

  

Ex :( valueOfB ^ U)%N

所以我只有在使用较小的数字时才能这样做,因为我会有一个小的U值,适合“int”,但它不安全,我怎么能用像BigInteger这样的大U而不是int呢?< / p>

1 个答案:

答案 0 :(得分:1)

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位数的领域。这非常浪费。

值得庆幸的是,存在执行高效modular exponentiation的算法。感谢你们,.NET继续为你写下这个。

您正在寻找的是

valueOfB = BigInteger.ModPow(66, U, N);