我正在创建一个小软件来使用非对称密钥来加密和解密数据。如何在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?
你可能想看看这里:https://crypto.stackexchange.com/questions/43272/why-is-writing-your-own-encryption-不鼓励,另一个:https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own –
@PeterB:在某些时候,有人必须写在代码库后面的代码,这意味着其他人不需要再做一次。所以我不认为答案只是说不要做这个事情 - 有很多理由想要做这种事情 - 为了好玩,为了编写加密代码的经验,......我写了我自己的JPG和MP3加密/解密代码 - 我绝对不会在生产代码中使用它,但这很有趣。 – PaulF
在你写的程序的描述中_“然后每个数字都必须乘以指数C和模N”,但是你显示的代码将数字提高到C的幂 - 哪一个是正确的?如果您正在相乘,那么BigInteger允许两个BigInteger相乘。 – PaulF