예제 #1
0
        public void Create_Message_Encrypt_Decrypt_Verify()
        {
            // Arrange:
            var          repository = new RequestRepository();
            var          request    = CryptoKey.CreateRequest(DateTime.Now);
            var          keys       = AsymmetricCryptoProvider.GenerateKeys();
            var          crypto     = new AsymmetricCryptoProvider();
            const string message    = "secret message";

            string encryptedPassword;
            string hash;
            string encryptedMessage = crypto.EncryptMessageWithKey(message, keys.PublicKey, out encryptedPassword,
                                                                   out hash);

            request.Messages.Add(new Message
            {
                MessageData = encryptedMessage, EncryptionKey = encryptedPassword, MessageHash = hash
            });

            // Act:
            repository.AddRequest(request);
            var retrieved        = repository.GetRequest(request.KeyToken);
            var retrievedMessage = retrieved.Messages.First();

            string messageDecryptionKey;

            var decryptedMessage = crypto.DecryptMessageWithKey(keys.PrivateKey, retrievedMessage.MessageData,
                                                                retrievedMessage.EncryptionKey,
                                                                retrievedMessage.MessageHash, out messageDecryptionKey);

            // Assert:
            Assert.AreEqual(message, decryptedMessage);
        }
예제 #2
0
        public void Message_Encrypt_Decrypt_ReturnsOriginalValue()
        {
            // Arrange
            var    crypto = new AsymmetricCryptoProvider();
            var    key    = AsymmetricCryptoProvider.GenerateKeys();
            string hash;
            string encryptedPassword;

            // Act
            var encryptedMessage = crypto.EncryptMessageWithKey(secret, key.PublicKey, out encryptedPassword, out hash);

            string messageDecryptionKey;

            var decryptedSecret = crypto.DecryptMessageWithKey(key.PrivateKey, encryptedMessage, encryptedPassword, hash, out messageDecryptionKey);

            // Assert
            Assert.AreEqual(secret, decryptedSecret);
            Assert.AreEqual(SymmetricCryptoProvider.GetSecureHashForString(secret), hash, "hashes do not match");
        }
예제 #3
0
        private static void AttachDataToKey(string token, string compressedMessage, bool isFile, string encryptionKey = null)
        {
            string hash = null;
            string encryptedPassword;

            var db      = new CryptAByteContext();
            var request = db.Keys.SingleOrDefault(key => key.KeyToken == token);

            string encryptedMessage;

            if (string.IsNullOrWhiteSpace(encryptionKey))
            {
                var crypto = new AsymmetricCryptoProvider();
                encryptedMessage = crypto.EncryptMessageWithKey(compressedMessage, request.PublicKey, out encryptedPassword,
                                                                out hash);
            }
            else
            {
                encryptedMessage  = compressedMessage;
                encryptedPassword = encryptionKey;
            }

            if (request.Messages == null)
            {
                request.Messages = new Collection <Message>();
            }

            request.Messages.Add(new Message()
            {
                MessageData   = encryptedMessage,
                EncryptionKey = encryptedPassword,
                MessageHash   = hash,
                Created       = DateTime.Now,
                IsFile        = isFile
            });

            db.SaveChanges();
        }