public String decipher(List <BigInteger> cipher, MHPrivateKey key) { String decrypted = ""; BigInteger temp = BigInteger.ValueOf(0); int tmp = 0; BigInteger bits = BigInteger.ValueOf(0); for (int i = 0; i < cipher.Count; i++) { temp = cipher.ElementAt(i); int bitlen = temp.BitLength; int ff = 0; while (bitlen < (int)Math.Pow(2, ff)) { ff++; } if (ff > bitlen) { bitlen = ff; } for (int j = 0; j < bitlen; j++) { if (temp.Mod(BigInteger.ValueOf(2)).CompareTo(BigInteger.ValueOf(1)) == 0) { bits = bits.Add(key.w1.Multiply(BigInteger.ValueOf((long)Math.Pow(2, j)))); } temp = temp.ShiftRight(1); } bits = bits.Mod(key.n); List <BigInteger> list = (List <BigInteger>)key.a; BigInteger temper; int k = key.a.Count - 1; while (k >= 0) { temper = list.ElementAt(k); if (bits.CompareTo(temper) > -1) { tmp += (int)Math.Pow(2, k); bits = bits.Subtract(temper); } k--; } decrypted += (binaryToChar(Convert.ToString(tmp, 2))).ToString(); bits = BigInteger.ValueOf(0); tmp = 0; } return(decrypted); }
public MHKey() { generator gen = new generator(8); BigInteger w = gen.w; e = new List <BigInteger>(); for (int i = 0; i < gen.a.Count; i++) { e.Add(w.Multiply(gen.a.ElementAt(i)).Mod(gen.n)); // w*a Mod n .. } BigInteger w1 = BigInteger.ValueOf(1); BigInteger one = BigInteger.ValueOf(2); while (one.IntValue != 1) { w1 = w1.Add(BigInteger.ValueOf(1)).Mod(gen.n); one = w.Multiply(w1).Mod(gen.n); } privateKey = new MHPrivateKey(gen.a, w.ModInverse(gen.n), gen.n); }