Using RSA keys for encryption and decryption in Erlang

14 Feb 2023 09:39 erlang cryptography

How do I encrypt (and decrypt) things in Erlang, using an RSA key?

It’s important to note that most encryption schemes use symmetric encryption, and only use asymmetric encryption for key exchange.

The way this works is that you encrypt using the recipient’s public key, and the recipient decrypts using their private key.

Generating the key pair

We’ll generate a private key:

Size = 2048,  % in bits
Exp = 65537,  % standard RSA exponent
RSAPrivateKey = public_key:generate_key({rsa, Size, Exp}).

Then we derive the public key. Senders will encrypt their messages with this, so that only we can decrypt it.

rr(public_key).   % in the REPL

#'RSAPrivateKey'{publicExponent = E, modulus = N} = RSAPrivateKey.
RSAPublicKey = #'RSAPublicKey'{modulus = N, publicExponent = E}.

Encrypting a message

Note that we use the public key.

PlainText = <<"Hello World">>.
CipherText = public_key:encrypt_public(PlainText, RSAPublicKey).

Passing no options to public_key:encrypt_public/2 uses the default [{rsa_padding, rsa_pkcs1_padding}].

The padding options used for encryption and decryption must match.

Decrypting a message

To decrypt, we use the private key.

PlainText = public_key:decrypt_private(CipherText, RSAPrivateKey).  % <<"Hello World">>