2017-12-18 166 views
0

我正在创建一个小软件来使用非对称密钥来加密和解密数据。如何在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?

+0

你可能想看看这里:https://crypto.stackexchange.com/questions/43272/why-is-writing-your-own-encryption-不鼓励,另一个:https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own –

+0

@PeterB:在某些时候,有人必须写在代码库后面的代码,这意味着其他人不需要再做一次。所以我不认为答案只是说不要做这个事情 - 有很多理由想要做这种事情 - 为了好玩,为了编写加密代码的经验,......我写了我自己的JPG和MP3加密/解密代码 - 我绝对不会在生产代码中使用它,但这很有趣。 – PaulF

+0

在你写的程序的描述中_“然后每个数字都必须乘以指数C和模N”,但是你显示的代码将数字提高到C的幂 - 哪一个是正确的?如果您正在相乘,那么BigInteger允许两个BigInteger相乘。 – PaulF

回答

1

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

有人给了我这个功能在上面的评论,但谢谢你的解释:)!我可以将这个问题标记为解决。 –

相关问题