public void SignInitialize(int max, int powMin, int powMax) { Console.WriteLine("------------------------------------------------"); max = (int)Math.Pow(2, max); powMin = (int)Math.Pow(2, powMin); powMax = (int)Math.Pow(2, powMax); do { pSign = BigInt.PrimeGenerate(powMin, powMax); Console.WriteLine("P Sign: " + pSign.toString()); qSign = BigInt.PrimeGenerate(powMin, powMax); modSign = BigInt.multiply(pSign, qSign); }while ((BigInt.less(modSign, new BigInt(max.ToString()))) || (BigInt.equal(pSign, qSign))); Console.WriteLine("P Sign: " + pSign.toString()); Console.WriteLine("Q Sign: " + qSign.toString()); Console.WriteLine("mod Sign: " + modSign.toString()); ASign = Karmichael(pSign, qSign); Console.WriteLine("A Sign: " + ASign.toString()); do { do { eSign = BigInt.PrimeGenerate(0, Int32.Parse(ASign.toString())); }while ((BigInt.mod(ASign, eSign)).isZero()); BigInt temp; BigInt.ExtendedGCD(ASign, eSign, out temp, out dSign); }while (BigInt.less(dSign, new BigInt("0"))); Console.WriteLine("E Sign: " + eSign.toString()); Console.WriteLine("D Sign: " + dSign.toString()); Console.WriteLine("------------------------------------------------"); }
public RSA(int max, int powMin, int powMax) { SignInitialize(max, powMin, powMax); max = (int)Math.Pow(2, max); powMin = (int)Math.Pow(2, powMin); powMax = (int)Math.Pow(2, powMax); do { p = BigInt.PrimeGenerate(powMin, powMax); q = BigInt.PrimeGenerate(powMin, powMax); mod = BigInt.multiply(p, q); }while ((BigInt.less(mod, new BigInt(max.ToString()))) || (BigInt.equal(p, q))); Console.WriteLine("P: " + p.toString()); Console.WriteLine("Q: " + q.toString()); Console.WriteLine("mod: " + mod.toString()); A = Karmichael(p, q); Console.WriteLine("A: " + A.toString()); do { do { e = BigInt.PrimeGenerate(0, Int32.Parse(A.toString())); }while ((BigInt.mod(A, e)).isZero()); BigInt temp; BigInt.ExtendedGCD(A, e, out temp, out d); }while (BigInt.less(d, new BigInt("0"))); Console.WriteLine("E: " + e.toString()); Console.WriteLine("D: " + d.toString()); }
public BigInt ChineseTheorem(BigInt r1, BigInt r2, BigInt mod1, BigInt mod2) { // Console.WriteLine("r1:" + r1.toString()); BigInt M = BigInt.multiply(mod1, mod2); BigInt m1 = BigInt.divide(M, mod1); BigInt m2 = BigInt.divide(M, mod2); BigInt y1 = new BigInt("1"); BigInt y2 = new BigInt("1"); BigInt one = new BigInt("1"); for (BigInt i = one; BigInt.less(i, mod1); i = BigInt.add(i, one)) { if (BigInt.equal(BigInt.multiplyByMod(m1, i, mod1), one)) { y1 = i; break; } } for (BigInt i = one; BigInt.less(i, mod2); i = BigInt.add(i, one)) { if (BigInt.equal(BigInt.multiplyByMod(m2, i, mod2), one)) { y2 = i; break; } } return(BigInt.mod(BigInt.add(BigInt.multiply(m1, BigInt.multiply(r1, y1)), BigInt.multiply(m2, BigInt.multiply(r2, y2))), mod)); }
public BigInt sqrt() { if (less(this, ZERO)) { throw new ArgumentException("BigNumber must be >=0"); } int pos = (number.Length + 1) / 2; BigInt cur = new BigInt(pos, false); pos--; while (pos >= 0) { int l = 0, r = BASE; int curDigit = 0; while (l <= r) // подбираем текущую цифру { int m = (l + r) >> 1; cur.number[pos] = m; if (BigInt.lessEqualAbs(BigInt.multiply(cur, cur), this)) { curDigit = m; l = m + 1; } else { r = m - 1; } } cur.number[pos] = curDigit; pos--; } Array.Copy(cur.number, 0, this.number, 0, cur.number.Length); return(this); }
public BigInt Hash(string word, BigInt mod) { BigInt sum = new BigInt("0"); for (int i = 0; i < word.Length; i++) { sum = BigInt.add(sum, BigInt.multiply(new BigInt(((int)word[i]).ToString()), BigInt.pow(new BigInt("2"), new BigInt(i.ToString())))); } return(sum); }
public static string MillerRabin(BigInt x) { BigInt xMinusOne = subtract(x, new BigInt("1")); BigInt two = new BigInt("2"); int i = 0; BigInt m = xMinusOne; while (true) { if (BigInt.subtract(m, BigInt.multiply(two, BigInt.divide(m, two))).toString() != "0") { break; } m = divide(m, two); i++; } Random r = new Random(); BigInt a; if (xMinusOne.toString().Length >= 10) { a = new BigInt((r.Next(2, 1000000000)).ToString()); } else { a = new BigInt((r.Next(2, Int32.Parse(subtract(xMinusOne, new BigInt("1")).toString()))).ToString()); } BigInt b = powByModFast(a, m, x); BigInt one = new BigInt("1"); BigInt counter = new BigInt("0"); BigInt iBigInt = new BigInt(i.ToString()); if (equal(b, one)) { return("probably prime"); } while (less(counter, iBigInt)) { if (equal(b, xMinusOne)) { return("probably prime"); } b = powByModFast(b, two, x); counter = add(counter, one); } return("composite"); }
static void calculate() { BigInt a, b, m; int n; switch (choice) { case 1: Console.WriteLine("1 - +"); a = getNumber("First "); // BigInt.Billie(a); // Console.WriteLine((BigInt.Billie(a).toString())); b = getNumber("Second "); Console.WriteLine(a.toString() + "+" + b.toString() + "=" + BigInt.add(a, b).toString()); break; case 2: Console.WriteLine("2 - -"); a = getNumber("First "); b = getNumber("Second "); Console.WriteLine(a.toString() + "-" + b.toString() + "=" + BigInt.subtract(a, b).toString()); break; case 3: Console.WriteLine("3 - *"); a = getNumber("First "); b = getNumber("Second "); Console.WriteLine(a.toString() + "*" + b.toString() + "=" + BigInt.multiply(a, b).toString()); break; case 4: Console.WriteLine("4 - /"); a = getNumber("First "); b = getNumber("Second "); Console.WriteLine(a.toString() + "/" + b.toString() + "=" + BigInt.divide(a, b).toString()); Console.WriteLine("Ostacha: " + BigInt.subtract(a, BigInt.multiply(b, BigInt.divide(a, b))).toString()); break; case 5: Console.WriteLine("5 - ^"); a = getNumber("First "); b = getNumber("Second "); Console.WriteLine(a.toString() + "^" + b.toString() + "=" + BigInt.pow(a, b).toString()); break; case 6: Console.WriteLine("6 - [sqrt(x)]"); a = getNumber("Number >0 "); Console.WriteLine("sqrt =" + a.sqrt().toString()); break; case 7: Console.WriteLine("7 - <"); a = getNumber("First "); b = getNumber("Second "); Console.WriteLine(a.toString() + "<" + b.toString() + "=" + BigInt.less(a, b)); break; case 8: Console.WriteLine("8 - >"); a = getNumber("First "); b = getNumber("Second "); Console.WriteLine(a.toString() + ">" + b.toString() + "=" + BigInt.greater(a, b)); break; case 9: Console.WriteLine("9 - =="); a = getNumber("First "); b = getNumber("Second "); Console.WriteLine(a.toString() + "==" + b.toString() + "=" + BigInt.equal(a, b)); break; case 10: Console.WriteLine("10 - + (mod)"); a = getNumber("First "); b = getNumber("Second "); m = getNumber("mod "); Console.WriteLine(a.toString() + "+" + b.toString() + "mod" + m.toString() + "=" + BigInt.addMod(a, b, m).toString()); break; case 11: Console.WriteLine("11 - - (mod)"); a = getNumber("First "); b = getNumber("Second "); m = getNumber("mod "); Console.WriteLine(a.toString() + "-" + b.toString() + "mod" + m.toString() + "=" + BigInt.subtractMod(a, b, m).toString()); break; case 12: Console.WriteLine("12 - * (mod)"); a = getNumber("First "); b = getNumber("Second "); m = getNumber("mod "); Console.WriteLine(a.toString() + "*" + b.toString() + "mod" + m.toString() + "=" + BigInt.multiplyByMod(a, b, m).toString()); break; case 13: Console.WriteLine("13 - /(mod)"); a = getNumber("First "); b = getNumber("Second "); m = getNumber("mod "); Console.WriteLine(a.toString() + "/" + b.toString() + "mod" + m.toString() + "=" + BigInt.divideMod(a, b, m).toString()); Console.WriteLine("Ostacha: " + BigInt.subtractMod(a, BigInt.multiply(b, BigInt.divide(a, b)), m).toString()); break; case 14: Console.WriteLine("14 - ^ (mod)"); a = getNumber("First "); b = getNumber("Second "); m = getNumber("mod "); Console.WriteLine(a.toString() + "^" + b.toString() + "mod" + m.toString() + "=" + BigInt.powByMod(a, b, m).toString()); break; case 15: Console.WriteLine("15 - aiX=bi(mod pi)"); n = getUInt("Count of equations"); BigInt[] A = new BigInt[n]; BigInt[] B = new BigInt[n]; BigInt[] M = new BigInt[n]; for (int i = 0; i < n; i++) { A[i] = getNumber("A[" + i + "]"); B[i] = getNumber("B[" + i + "]"); M[i] = getNumber("P[" + i + "]"); } for (int i = 0; i < n; i++) { Console.WriteLine(A[i].toString() + "x =" + B[i].toString() + "mod" + M[i].toString()); } (BigInt, BigInt)res = BigInt.solve(A, B, M, n); Console.WriteLine("x=" + res.Item1.toString() + "mod" + res.Item2.toString()); break; case 16: Console.WriteLine("16 - ^ (mod) fast"); a = getNumber("First "); b = getNumber("Second "); m = getNumber("mod "); Console.WriteLine(a.toString() + "^" + b.toString() + "mod" + m.toString() + "=" + BigInt.powByModFast(a, b, m).toString()); break; case 17: Console.WriteLine("17 - Miller Rabin"); a = getNumber("Number "); Console.WriteLine(BigInt.MillerRabin(a)); break; case 18: //Console.WriteLine("18 - Billie"); //Console.WriteLine("Enter the word"); //string word = Console.ReadLine(); //RSA test = new RSA(8, 1, 6); //test.Encryption(word); //Console.WriteLine(test.Decryption()); break; case 19: Console.WriteLine("Enter the word"); string word = Console.ReadLine(); long ellapledTicks = DateTime.Now.Ticks; RSA test = new RSA(8, 32, 64); test.Encryption(word); ellapledTicks = DateTime.Now.Ticks - ellapledTicks; TimeSpan elapsedSpan = new TimeSpan(ellapledTicks); Console.WriteLine(test.Decryption()); Console.WriteLine("Time: " + elapsedSpan.TotalMilliseconds); break; case 20: Console.WriteLine("19 - exit"); end = true; break; } }