RSA 在C#里简单实现
2021-09-20 04:12
标签:console dom ica 约数 view return random als except 假设Alice想要通过一个不可靠的网络接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:1.随意选择两个大的质数p和q,p不等于q,计算n=pq。2.根据欧拉函数,求得r = (p-1)(q-1)3.选择一个小于 r 的整数 e1,求得 e1 关于模 r 的模反元素,命名为e2。(模反元素存在,当且仅当e1与r互质)4.将 p 和 q 的记录销毁。(n,e1)是公钥,(n,e2)是私钥。Alice将她的公钥(n,e1)传给Bob,而将她的私钥(n,e2)藏起来。 using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int p = 3; //质数 int q = 17; //质数 if (!IsSuShu(p) || !IsSuShu(q)) { Console.WriteLine("选择的数字必须是素数"); } int n = p * q; int r = (p - 1) * (q - 1); //欧拉函数 var keyList = GetKeyList(r); var key = keyList.Where(k => k.Item1 != p && k.Item1 != q && k.Item2 != p && k.Item2 != q).LastOrDefault(); int e1 = key.Item1; //公钥 int e2 = key.Item2; //私钥 long msg = 11;// new Random().Next(1, n); //msg必须小于n double encodeMsg = RSA(n, e1, msg); double decodeMsg = RSA(n, e2, encodeMsg); Console.WriteLine("加密前:" + msg); Console.WriteLine("加密后:" + encodeMsg); Console.WriteLine("解密后:" + decodeMsg); Console.Read(); } private static List GetKeyList(int r) { var list = new List(); int e1 = r; int e2 = 0; while (true) { if (e1 0) { list.Add(new Tuple(e1, e2)); } } } e1--; } if (list.Count == 0) { throw new Exception("找不到合适的数字用来当做公钥"); } return list; } private static int GetE2(int r, int e1) { for (int e2 = r; e2 > 0; e2--) { if ((e2 * e1) % r == 1 && e2 != e1) //求e1关于r的模反元素 { return e2; } } return 0; } private static bool IsHaveGongYueShu(int r, int e1) { var rList = new List(); var e1List = new List(); for (int i = 2; i e1List.Contains(p)).Count(); if (result > 0) //两个数字是否有公约数 { return true; } else { return false; } } private static bool IsSuShu(int num) { bool bl = true; for (int i = 2; i