由于指数大小有限,如何在 C# 中创建非对称密钥?
How to create asymmetric keys in C# because of limited exponent size?
我正在创建一个使用非对称密钥加密和解密数据的小软件。
问题是,我正在用 C# 编码,即使我使用:
BigInteger.Pow(BigIntenger myNumber, int myExponent);
指数是 "int",我的值对于整数来说太大了。
为了快速解释并确保我没有犯任何错误,您必须使用大数字来增加没有私钥解密的难度。
所以我有
- N = P * Q
- P和Q都是素数
- M = (P-1)+(Q-1)
- C与M是质数
- 然后找到U:C×U+M×V=1
Public 键 (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
所以只有当我使用小数字时我才能这样做,因为我会有一个适合 "int" 的小 U 值,但它不安全,我怎么能用像 BigInteger 这样的大 U 和不是整数?
BigInteger.Pow
的 BigInteger 将是一个非常复杂的数字。
二进制乘法具有 属性,即(粗略地说)将 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);
我正在创建一个使用非对称密钥加密和解密数据的小软件。
问题是,我正在用 C# 编码,即使我使用:
BigInteger.Pow(BigIntenger myNumber, int myExponent);
指数是 "int",我的值对于整数来说太大了。
为了快速解释并确保我没有犯任何错误,您必须使用大数字来增加没有私钥解密的难度。
所以我有
- N = P * Q
- P和Q都是素数
- M = (P-1)+(Q-1)
- C与M是质数
- 然后找到U:C×U+M×V=1
Public 键 (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
所以只有当我使用小数字时我才能这样做,因为我会有一个适合 "int" 的小 U 值,但它不安全,我怎么能用像 BigInteger 这样的大 U 和不是整数?
BigInteger.Pow
的 BigInteger 将是一个非常复杂的数字。
二进制乘法具有 属性,即(粗略地说)将 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);