public string DecryptAndVerifySignature(Message message, string senderPublicKey) { // Decrypt keys using recipient's private key byte[] key = _rsa.Decrypt(message.Key, false); byte[] iv = _rsa.Decrypt(message.IV, false); // Get sender's public key var senderRsa = new RSACryptoServiceProvider(); senderRsa.FromXmlString(senderPublicKey); // Decrypt the cipher text using symmetrical encryption var alg = new RijndaelManaged { Key = key, IV = iv }; var cryptor = new SymCrypt(alg); byte[] clearTextBytes = cryptor.Decrypt(message.Data); // Verify digital signature using the sender's public key. bool verified = verifySignature(clearTextBytes, message.Signature, senderRsa); string clearText = (new UTF8Encoding()).GetString(clearTextBytes); return verified ? clearText : null; }
public Message SignAndEncrypt(string message, string receiverPublicKey) { // convert message in bytes byte[] messageBytes = (new UTF8Encoding()).GetBytes(message); // Sign the clear text using the sender's private key byte[] signature = signMessage(messageBytes); var result = new Message { Signature = signature }; // Encrypt the clear text using symmetrical encryption var cryptor = new SymCrypt(new RijndaelManaged()); byte[] encryptedData = cryptor.Encrypt(messageBytes); result.Data = encryptedData; // Get recipient's public key var receiverRsa = new RSACryptoServiceProvider(); receiverRsa.FromXmlString(receiverPublicKey); // Encrypt the encryption keys using the receiver's public key. result.Key = receiverRsa.Encrypt(cryptor.Key, false); result.IV = receiverRsa.Encrypt(cryptor.Iv, false); return result; }