• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

如何在C#中创建非对称密钥,因为指数大小有限?

c/c++ 来源:Romain P 3次浏览

我正在创建一个小软件来使用非对称密钥来加密和解密数据。如何在C#中创建非对称密钥,因为指数大小有限?

的问题是,我在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/(协商)⇔32/⇔33

然后提高每个编号,以C的功率和模N

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

现在您的邮件已加密。

如果要解密,你必须乘以指数u各自的价值和模N

例:(valueOfB^U)%N

所以我能做到这一点只有当我使用小号码,因为我会有一个适合于“int”的小U值,但它不是安全的,我怎么能用BigInteger这样的大U来实现这一点,而不是int?


===========解决方案如下:

BigInteger.Pow BigInteger将是一个大量复杂的数字。

二进制乘法具有(粗略地说)由m比特数乘以一个n比特数产生大致(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); 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)