public byte[] Decrypt(String str) { ArrayList resultSet = new ArrayList(); BigInteger2[] message = splitMessage(Convert.FromBase64String(str), n, "decrypt"); GC.Collect(); for (int i = 0; i < message.Length; i++) { //message[i] = BigInteger2.NegateZeros(message[i]); BigInteger2 unitResult = BigIntegerExtensions.modPower(message[i], d, Mod); unitResult = BigInteger2.NegateZeros(unitResult); BigInteger2 result = new BigInteger2(unitResult.bitlength.Length - 3, 0); for (int x = 3, xj = 2; x < unitResult.bitlength.Length; x++, xj++) { result.bitlength[xj] = unitResult.bitlength[x]; } unitResult = result; resultSet.Add(unitResult); GC.Collect(); } //Create Full BigInteger2 containing bits from resultSet BigIntegers int bitSize = 0; foreach (BigInteger2 b in resultSet) { bitSize += (b.bitlength.Length - 2); } //MessageBox.Show("Whole decrypted Text length: " + bitSize); BigInteger2 wholeMessage = new BigInteger2(bitSize, 0); //Fill wholeMessage int curIndex = 2; foreach (BigInteger2 b in resultSet) { for (int i = 2; i < b.bitlength.Length; i++, curIndex++) { wholeMessage.bitlength[curIndex] = b.bitlength[i]; } } byte[] res = DeInject(wholeMessage); GC.Collect(); // MessageBox.Show("Decryption Completed!!!"); return(res); }
public byte[] Encrypt(String str) { BigInteger2[] message = this.splitMessage(Encoding.UTF8.GetBytes(str), this.n - 1, "encrypt"); mess = new BigInteger2[message.Length]; mess = message; //MessageBox.Show("Message Length: " + message.Length); //return data; ArrayList resultSet = new ArrayList(); GC.Collect(); //Encrypt each Message and populate resultSet for (int i = 0; i < message.Length; i++) { BigInteger2 unitResult = BigIntegerExtensions.modPower(message[i], e, Mod); unitResult = BigInteger2.NegateZeros(unitResult); if (i == 0 && unitResult.bitlength.Length - 2 < n) { //MessageBox.Show("Padding with 'a'"); int ind = n + 4 - unitResult.bitlength.Length; BigInteger2 tmp = new BigInteger2(n, 0); for (int xi = ind, xj = 2; xj < unitResult.bitlength.Length; xi++, xj++) { tmp.bitlength[xi] = unitResult.bitlength[xj]; } unitResult = tmp; //PAD Left with byte 'a' byte[] pad = ASCIIEncoding.ASCII.GetBytes("a"); BitArray padAry = new BitArray(pad); //PAD left of unitResult with padAry BigInteger2 padded = new BigInteger2(unitResult.bitlength.Length - 2 + padAry.Length, 0); int pi, pj; for (pi = 2, pj = 0; pj < padAry.Length; pi++, pj++) { padded.bitlength[pi] = padAry[pj]; } //Continue filling from unitResult for (int indi = pi, indj = 2; indi < padded.bitlength.Length; indi++, indj++) { padded.bitlength[indi] = unitResult.bitlength[indj]; } unitResult = padded; } if (i > 0 && unitResult.bitlength.Length - 2 < n) { //MessageBox.Show("Padding with zeros"); //pad result's leftside with zeros int ind = n + 4 - unitResult.bitlength.Length; BigInteger2 tmp = new BigInteger2(n, 0); for (int xi = ind, xj = 2; xj < unitResult.bitlength.Length; xi++, xj++) { tmp.bitlength[xi] = unitResult.bitlength[xj]; } unitResult = null; unitResult = tmp; } GC.Collect(); resultSet.Add(unitResult); } //Create Full BigInteger2 containing bits from resultSet BigIntegers int bitSize = 0; foreach (BigInteger2 b in resultSet) { bitSize += (b.bitlength.Length - 2); } BigInteger2 wholeMessage = new BigInteger2(bitSize, 0); //Fill wholeMessage int curIndex = 2; foreach (BigInteger2 b in resultSet) { for (int i = 2; i < b.bitlength.Length; i++, curIndex++) { wholeMessage.bitlength[curIndex] = b.bitlength[i]; } } byte[] result = BigInteger2.getKeyBytes(wholeMessage); GC.Collect(); // MessageBox.Show("Encryption Completed!!!"); return(result); }
//MillerRabinTest public static bool MillerRabinIsPrime(BigInteger2 numb) { //Use Rabin's Test suite a.modPower(d,numb)== 1 : then numb is prime else numb composite BigInteger2 n = (BigInteger2)numb.Clone(); BigInteger2 numbLess1 = n - BigInteger2.ONE(); BigInteger2[] testSuite = new BigInteger2[3]; //Fill testSuite with BigInteger2 values: //Including 5, 11, and 61 testSuite[0] = new BigInteger2(1, 0); testSuite[0].bitlength = BigInteger2.ConvertToBinary(61, 6); testSuite[1] = new BigInteger2(1, 0); testSuite[1].bitlength = BigInteger2.ConvertToBinary(31, 6); testSuite[2] = new BigInteger2(1, 0); testSuite[2].bitlength = BigInteger2.ConvertToBinary(11, 4); // Determine two.power(r) factor of q: // By: using q is least set bit referenced from zero int i = 0, j = 0; for (i = numbLess1.bitlength.Length - 1, j = 0; i >= 2; i--, j++) { if (numbLess1.bitlength[i]) { break; } } //Console.Out.WriteLine("j: {0}", j.ToString()); //Form component two.power(r) = twoPowerR BigInteger2 twoPowerS = BigInteger2.TWO().power(j); //Calculate d: BigInteger2 d = BigIntegerExtensions.DivideBy(numbLess1, twoPowerS)[0]; //Use testSuite to eliminate Composites: bool isPrime = true; foreach (BigInteger2 integer in testSuite) { bool prime = false; BigInteger2 result = BigIntegerExtensions.modPower(integer, d, numb); if (result == BigInteger2.ONE()) { prime = true; continue; } else { for (i = 0; i < j; i++) { if ((numb - result) == BigInteger2.ONE()) { prime = true; break; } result = BigIntegerExtensions.modPower(result, BigInteger2.TWO(), numb); } if (prime) { continue; } else { isPrime = false; break; } } } return(isPrime); }