Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于指数大小有限,如何在C#中创建非对称密钥?_C#_Encryption_Biginteger - Fatal编程技术网

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

由于指数大小有限,如何在C#中创建非对称密钥?,c#,encryption,biginteger,C#,Encryption,Biginteger,我正在创建一个使用非对称密钥加密和解密数据的小软件 问题是,我正在用C#编码,即使我使用: BigInteger.Pow(BigIntenger myNumber, int myExponent); 指数是一个“int”,我的值对于int来说太大了 为了快速解释并确保我没有犯任何错误,您必须使用大数字,以便在没有私钥的情况下更难解密 所以我有 N=P*Q P和Q都是质数 M=(P-1)+(Q-1) C是带M的质数 然后用C×U+M×V=1来求U 公钥(N,C)。 私钥(U,N)。 例如,

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

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

 BigInteger.Pow(BigIntenger myNumber, int myExponent);
指数是一个“int”,我的值对于int来说太大了

为了快速解释并确保我没有犯任何错误,您必须使用大数字,以便在没有私钥的情况下更难解密

所以我有

  • N=P*Q
  • P和Q都是质数
  • M=(P-1)+(Q-1)
  • C是带M的质数
  • 然后用C×U+M×V=1来求U
公钥(N,C)。

私钥(U,N)。

例如,您希望将“你好!”加密为UTF8

你将有:

B⇔66/o⇔111/n⇔110/j⇔106/o⇔111/u⇔117/r⇔114/(电子空间)⇔32 / !⇔三十三

然后将每个数字提高到C和模N的幂

Ex:valueOfB=(66^C)%N

现在您的邮件已加密

如果你想解密它,你必须将每个值乘以指数U和模N

Ex:(b^U的值)%N


所以我只能在使用小数值的情况下这样做,因为我会有一个小的U值,与“int”匹配,但它不安全,我怎么能用像大U的BigInteger而不是int来做呢?

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位数字的范围。那太浪费了

谢天谢地,算法的存在是为了提高效率。非常感谢你,.NET为你写了这封信

你要找的是

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

你可能想看看这里:,还有另一个:@PeterB:在某个时候,必须有人在库后面编写代码,这意味着其他人不需要再做任何事情。所以我不认为答案仅仅是说不要费心去做-有很多理由想做这类事情-为了好玩,为了编写加密代码的经验。。。我已经为JPG和MP3加密/解密编写了自己的代码-我永远不会在生产代码中使用它,但这很有趣。在您对过程的描述中,您写道“那么每个数字都必须乘以指数C和模N”。但是您显示的代码将数字提高到C的幂次方-这两种代码中哪一种是正确的?如果你在乘法,那么BigInteger允许两个BigInteger相乘。谢谢你,PaulF,我不知道怎么正确地说,实际上这是“将数字提高到C的幂”,就像例子中的:)!不要使用
a^b
,而是使用
(a^b)%c
:有人在上面的评论中给了我这个功能,但感谢您的解释:)!我可以把这个问题标记为已解决。