public bool Verify(Abonent sender, Tuple <BigInteger, BigInteger> signedMessage) { BigInteger M = signedMessage.Item1; BigInteger S = signedMessage.Item2; return(M == BigInteger.ModPow(S, sender.Exponent, sender.N)); }
public void SendKey(Abonent sender, Abonent receiver, BigInteger key) { if (!CheckCondition()) { throw new ArgumentException("p*q > p1*q1"); } sender.SendKey(receiver, key); }
public void SendKey(Abonent receiver, BigInteger key) { if (key > N) { throw new ArgumentOutOfRangeException("Key can't be greater then N"); } var k1 = BigInteger.ModPow(key, receiver.Exponent, receiver.N); var s = BigInteger.ModPow(key, this.D, this.N); var s1 = BigInteger.ModPow(s, receiver.Exponent, receiver.N); receiver.ReceivedKeyToVerify = new Tuple <BigInteger, BigInteger>(k1, s1); receiver.ReceiveKey(this); }
public void ReceiveKey(Abonent sender) { if (ReceivedKeyToVerify == null) { throw new ArgumentNullException(); } var k1 = ReceivedKeyToVerify.Item1; var s1 = ReceivedKeyToVerify.Item2; var k = BigInteger.ModPow(k1, this.D, this.N); var s = BigInteger.ModPow(s1, this.D, this.N); if (!Verify(sender, new Tuple <BigInteger, BigInteger>(k, s))) { ReceivedKeyToVerify = null; throw new ArgumentException("Wrong signification!"); } KeyFromSender = k; }
static void Main(string[] args) { Abonent a = new Abonent(bitLengthPQ: 256) { Name = "Alice" }; Console.WriteLine(a); //Abonent b = new Abonent(bitLengthPQ: 256 + 128) { Name = "Bob" }; //Console.WriteLine(b); //#region ENCRYPTION //BigInteger serverModulus = BigInteger.Parse("012F740BA9F755D9FC41C703BDB56A4333BBD63E0888C16E0AE5E6265120FEE997", NumberStyles.AllowHexSpecifier); //BigInteger serverExponent = (int)Math.Pow(2, 16) + 1; //var publicKey = new Tuple<BigInteger, BigInteger>(serverModulus, serverExponent); //var messageToEncrypt = BigInteger.Parse("0BBA67B", NumberStyles.AllowHexSpecifier); //var encryptedMessage = a.Encrypt(publicKey, messageToEncrypt); //Console.WriteLine("Encrypted for server " + encryptedMessage.ToString("X")); //#endregion //#region DECRYPTION //Console.WriteLine("Enter encrytped message from server: "); //var bytes = Console.ReadLine(); //var messageToDecrypt = BigInteger.Parse("0" + bytes, NumberStyles.AllowHexSpecifier); //var decryptedMessage = a.Decrypt(messageToDecrypt); //Console.WriteLine("Decrypted message on Abonent a " + decryptedMessage.ToString("X")); //#endregion //#region VERIFICATION //var M = BigInteger.Parse("0ffffb111", NumberStyles.AllowHexSpecifier); //var S = BigInteger.Parse("0352299B5379259F213D1025A354457D81ABAF2D6A71AE77BCD1458EC3D9323E0", NumberStyles.AllowHexSpecifier); //var signedMessage = new Tuple<BigInteger, BigInteger>(M, S); //bool verif = a.Verify(publicKey, signedMessage); //Console.WriteLine("VERIFICATION RESULT " + verif); //#endregion //#region SIGNATURE //var messageToSign = BigInteger.Parse("0FFF123B", NumberStyles.AllowHexSpecifier); //var signedMessageForServer = a.Sign(messageToSign); //Console.WriteLine("SIGNED FOR SERVER = "); //Console.WriteLine("M = " + signedMessageForServer.Item1.ToString("X")); //Console.WriteLine("S = " + signedMessageForServer.Item2.ToString("X")); //#endregion //CryptoSystem rsa = new CryptoSystem(a, b); //rsa.SendKey(a, b, 999); //Console.WriteLine(a); //Console.WriteLine(b); BigInteger serverModulus = BigInteger.Parse("09EEDBBB30810E2BD60FCBB9B37B7BCE698B8FF3AB035F912552D7E61B12B5A2D", NumberStyles.AllowHexSpecifier); BigInteger serverExponent = (int)Math.Pow(2, 16) + 1; var key = BigInteger.Parse("0FFFE", NumberStyles.AllowHexSpecifier); var publicKey = new Tuple <BigInteger, BigInteger>(serverModulus, serverExponent); var keyToSend = a.SendKey(publicKey, key); Console.WriteLine("K1 = " + keyToSend.Item1.ToString("X")); Console.WriteLine("S1 = " + keyToSend.Item2.ToString("X")); //----------------------------------------------------------- Console.WriteLine("Enter key : "); string val = Console.ReadLine(); Console.WriteLine("Enter sig: "); string val1 = Console.ReadLine(); var receivedKey = BigInteger.Parse("0" + val, NumberStyles.AllowHexSpecifier); var receivedSignature = BigInteger.Parse("0" + val1, NumberStyles.AllowHexSpecifier); var receivedFinalKey = a.ReceiveKey(publicKey, new Tuple <BigInteger, BigInteger>(receivedKey, receivedSignature)); Console.WriteLine(receivedFinalKey.ToString("X")); Console.ReadKey(); }
public CryptoSystem(Abonent a, Abonent b) { A = a; B = b; }