如何在C#中创建非对称密钥,因为指数大小有限?
我正在创建一个小软件来使用非对称密钥来加密和解密数据。如何在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);
以上是 如何在C#中创建非对称密钥,因为指数大小有限? 的全部内容, 来源链接: utcz.com/qa/262485.html