# Using asymmetric encryption¶

All symmetric encryption algorithm has a inevitable problem. It’s very hard to find a ONE HANDRED PERCENT SAFE WAY to send your secret key to your receiver. Asymmetric encryption doesn’t have this problem. If you don’t familiar with asymmetric encryption algorithm, you may need to figure out the basic idea of why it’s safe to use public key for encryption, and how to sign your message to avoid mid-man attack; Read this: https://en.wikipedia.org/wiki/RSA_(cryptosystem)

Now, let’s take a look at how it’s done in this example. You want to send a encrypted message to your friend Bob using a unsafe channel.

## Encrypt/Decrypt a Message¶

Generate a key pair:

For demonstration purpose, you are the A, and your friend Bob is B. First, you both need to generate a private-public key pair, and share your own public key to each other. There’s no problem if public key exposed to others:

>>> from windtalker.asymmetric import AsymmetricCipher
>>> A_pubkey, A_privkey = AsymmetricCipher.newkeys() # send A_pubkey to Bob
>>> B_pubkey, B_privkey = AsymmetricCipher.newkeys() # get B_pubkey from Bob


Encrypt and Decrypt:

This code is a view from your side:

>>> message = "Turn right at blue tree"
>>> cipherA = AsymmetricCipher(A_pubkey, A_privkey, B_pubkey)
>>> token = cipherA.encrypt_text(message)
>>> sign = cipherA.sign


And then send token and sign to your friend Bob. From Bob’s point of view, it looks like:

>>> cipherB = AsymmetricCipher(B_pubkey, B_privkey, A_pubkey)
>>> original_message = cipherB.decrypt(token, signature=sign)


## Work with files and directory¶

Asymmetric encryption algorithm works slow. A widely used solution is to encrypt your files with Symmetric Encryption, and then use asymmetric encryption to encrypt your secret key of symmetric encryption. If you really want to do it, windtalker provides a utility method encrypt_file() for that. Let’s use the old example, you want to send MyBankAccount.txt to Bob:

# for this time, you only need Bob's public key
>>> A_pubkey, A_privkey = None, None
>>> B_pubkey, B_privkey = AsymmetricCipher.newkeys()
>>> cipherA = AsymmetricCipher(A_pubkey, A_privkey, B_pubkey)
>>> cipherA.encrypt_file("MyBankAccount.txt",
"MyBankAccount-encrypted.txt", overwrite=True)

# and Bob will use his private key for decryption
>>> cipherB = AsymmetricCipher(B_pubkey, B_privkey, A_pubkey)
>>> cipherB.decrypt_file("MyBankAccount-encrypted.txt",
"MyBankAccount.txt", overwrite=True)