public EncryptedPacket EncryptData(byte[] original) { var sessionKey = aesEncryption.GenerateRandomNumber(32); var encryptedPacket = new EncryptedPacket() { Iv = aesEncryption.GenerateRandomNumber(16) }; encryptedPacket.EncryptedData = aesEncryption.EncryptAes(original, sessionKey, encryptedPacket.Iv); encryptedPacket.EncryptedSessionKey = asymmetricEncryption.EncryptData(sessionKey); using (var hmac = new HMACSHA256(sessionKey)) { encryptedPacket.Hmac = hmac.ComputeHash(encryptedPacket.EncryptedData); } return encryptedPacket; }
public byte[] DecryptData(EncryptedPacket encryptedPacket) { var decryptedSessionKey = asymmetricEncryption.DecryptData(encryptedPacket.EncryptedSessionKey); using (var hmac = new HMACSHA256(decryptedSessionKey)) { var hmacToCheck = hmac.ComputeHash(encryptedPacket.EncryptedData); if (!Compare(encryptedPacket.Hmac, hmacToCheck)) { throw new CryptographicException("HMAC comparison failed"); } } var decryptedData = aesEncryption.DecryptAes(encryptedPacket.EncryptedData, decryptedSessionKey, encryptedPacket.Iv); return decryptedData; }