Using Public Key Methods To Encrypt Data With GPG: RSA is still the Leader

Public key encryption is just pure magic. You have one key to encrypt, and another key to decrypt. Overall, we can use it to encrypt data…

Photo by Filip Szalbot on Unsplash

Using Public Key Methods To Encrypt Data With GPG: RSA is still the Leader

Public key encryption is just pure magic. You have one key to encrypt, and another key to decrypt. Overall, we can use it to encrypt data, digitally sign data and to pass an encryption key:

For digital signatures, we can use ECDSA, EdDSA, or RSA. While encryption, we can’t use elliptic curves (unless we mix it with symmetric key methods) and use RSA encryption. In this case, we will encrypt data using 1,024-bit, 2,048-bit, and 3,072-bit RSA keys.

It was Phil Zimmerman who created the PGP (Pretty Good Privacy), and which has advanced to the GNU Privacy Guard (GPG). Overall GPG is a program that is based on OpenPGP and can generate key pairs, encrypt and decrypt data, and digitally sign files and verify digital signatures.

We can generate an RSA key pair with (and where we store the key with a given real name and an associated email address):

input_data = gpg.gen_key_input(key_type="RSA",key_usage='encrypt',
key_length=1024,passphrase=password,name_real=user,name_email=email)

With a message we can then encrypt with:

enc_data = gpg.encrypt(message,email)
print ("Encrypt:\n",str(enc_data).replace(chr(13),''))

This gives an Amor message of:

-----BEGIN PGP MESSAGE-----
hIwDJ+u76a46FlsBA/9OExTHCH9x95U2tXD51+JS4XkW4s5wKys0j+fvid4dpONN
WoUZAxXL/oVtMmiTxP4L3aSGHV3atfmXCWoCBquzKkwSSi//qiwLawC1WhdprbnV
5Eye8Lk90DyIoZ3jxxIau8iwpTW5CutUUT/wNwHDPkD22Z3z8nNVoADu6JIuttRY
AQkCEGPTdsM+DfoitwNm+jXx2hn2Tz2A9AChT3MAw3W4nkhMO/Ya66+zIk2q8iN5
pB5LrgCW8S6PeXTrzxnK7G2jRa8RxShHtjceaIQGHq//p1vqorEf/w==
=MxuG
-----END PGP MESSAGE-----

Next, we can decrypt this with:

ver = gpg.decrypt(str(enc_data),passphrase=password)
print ("Decrypted:\n",ver)

The following is the code [here]:

import gnupg
import sys
gpg = gnupg.GPG(gnupghome="c:\\gpg")
enc="rsa-1024"
password="password"
user="Fred Bloggs"
email="[email protected]"
message="Hello"

if (len(sys.argv)>1):
enc=str(sys.argv[1])
if (len(sys.argv)>2):
password=str(sys.argv[2])
if (len(sys.argv)>3):
user=str(sys.argv[3])
if (len(sys.argv)>4):
email=str(sys.argv[4])
if (len(sys.argv)>5):
message=str(sys.argv[5])


if (enc=="rsa-1024"):
input_data = gpg.gen_key_input(key_type="RSA",key_usage='encrypt',key_length=1024,passphrase=password,name_real=user,name_email=email)

elif (enc=="rsa-2048"):
input_data = gpg.gen_key_input(key_type="RSA",key_usage='encrypt',key_length=2048,passphrase=password,name_real=user,name_email=email)

elif (enc=="rsa-3072"):
input_data = gpg.gen_key_input(key_type="RSA",key_usage='encrypt',key_length=3072,passphrase=password,name_real=user,name_email=email)
else:
print ("Can't find key type")

key = gpg.gen_key(input_data)
fp = key.fingerprint


print ("Key ID: ",fp)
print ("Type: ",enc)
print ("Type: ",email)


print ("Message: ",message)
enc_data = gpg.encrypt(message,email)
print ("Encrypt:\n",str(enc_data).replace(chr(13),''))


ver = gpg.decrypt(str(enc_data),passphrase=password)
print ("Decrypted:\n",ver)




print("\n\n\n")

ascii_armored_public_keys = gpg.export_keys(fp)
print("Public key (used to encrypt):\n",ascii_armored_public_keys.replace(chr(13),''))
ascii_armored_private_keys = gpg.export_keys(fp,True,passphrase=password)
print("Private key (used to decrypt):\n",ascii_armored_private_keys.replace(chr(13),''))
print("Private key deleted: ",gpg.delete_keys(fp,True,passphrase=password))
print("Public key deleted: ",gpg.delete_keys(fp))






To encrypt with RSA-1024 [here]:

Key ID:  0E20D721C1E6BF0FD56DDE5127EBBBE9AE3A165B
Type: rsa-1024
Type: [email protected]
Message: Hello, how are you?
Encrypt:
-----BEGIN PGP MESSAGE-----
hIwDJ+u76a46FlsBA/9OExTHCH9x95U2tXD51+JS4XkW4s5wKys0j+fvid4dpONN
WoUZAxXL/oVtMmiTxP4L3aSGHV3atfmXCWoCBquzKkwSSi//qiwLawC1WhdprbnV
5Eye8Lk90DyIoZ3jxxIau8iwpTW5CutUUT/wNwHDPkD22Z3z8nNVoADu6JIuttRY
AQkCEGPTdsM+DfoitwNm+jXx2hn2Tz2A9AChT3MAw3W4nkhMO/Ya66+zIk2q8iN5
pB5LrgCW8S6PeXTrzxnK7G2jRa8RxShHtjceaIQGHq//p1vqorEf/w==
=MxuG
-----END PGP MESSAGE-----
Decrypted:
Hello, how are you?

Public key (used to encrypt):
-----BEGIN PGP PUBLIC KEY BLOCK-----
mI0EY+1HPAEEANRpYB5oxJtSQ27di1MseANxAwVWr6Xs/bpZXToFn4JoA3H1G3FN
lXoYgdQBnsC75LTXc5VFPRh9G8YyPd5O7D7LBNT8OMGjVzD2e2iICXHcEGVhc5ob
vGdUSd8/yxN0V+lmOzQ3myXWVnU3BjSMZQsXuQQM6916/pTwD9KvRme3ABEBAAG0
G0ZyZWQgQmxvZ2dzIDxmcmVkQGhvbWUuY29tPojRBBMBCAA7FiEEDiDXIcHmvw/V
bd5RJ+u76a46FlsFAmPtRzwCGw0FCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AA
CgkQJ+u76a46FluaIQP/anlKohMDU40yOezTq3lJoTvDeY1t26n/ROM2Evgb4npZ
L7dt5Xx3WlQxKi7/PwKD3FubV08bH75ZGdYZVXPZlnZ3EzS2ElbTr5AIdUeZKYX1
GRa/q380WcPwv2MQOzUKqvs8wR+uj0X5FMzIh/cTVK/KHTe3u9+R9f5XCzU1XcM=
=e5Jx
-----END PGP PUBLIC KEY BLOCK-----
Private key (used to decrypt):
-----BEGIN PGP PRIVATE KEY BLOCK-----
lQIFBGPtRzwBBADUaWAeaMSbUkNu3YtTLHgDcQMFVq+l7P26WV06BZ+CaANx9Rtx
TZV6GIHUAZ7Au+S013OVRT0YfRvGMj3eTuw+ywTU/DjBo1cw9ntoiAlx3BBlYXOa
G7xnVEnfP8sTdFfpZjs0N5sl1lZ1NwY0jGULF7kEDOvdev6U8A/Sr0ZntwARAQAB
/gcDAva74X8Cz+O8ysrWePki5iBOAruSUhM+oVxEuIjOp8Xp/tb1Uc43hapKRuBq
D/igWhFojnfnXOeHaS4WqIbO15Mt5IjGNTL77DyiDvQX4i9FseEyyS8ETJ5PnzMT
aaGdcWWxPCO6ArxXSs+zld4a1zuHvsKZbWjf7YNCnRYsoe35yvMf29og3gHX1ugS
v0RoiRWXYvexybScPGCcylcm/CVhjS4Ze+gcSAxpNDxEbQEUhWDUH7layqT1TjM3
ArHPjaEOsKKiWUI2Y7bn6gIvAmkkdENjhnR6B7IWvqV6H5aW1wLJCgI/ccm0kxvF
LWVyFZIq1Uwy/EydbWl4hdkVfyZu6wYK56ic5pihRCBJN91fQa3e0LjeYtjPXBQT
yYIFjd3GJkrR6KKV4xYvWxnOEIy+qQ+1hcbYVy3XDu+EPfn5I9Bw4x1bw/H9u7FU
fpd2TTw1+Y7Olq5gRUqAsHSKj+fp5g3RQcHc+O12jPCeAbqLCubVt7QbRnJlZCBC
bG9nZ3MgPGZyZWRAaG9tZS5jb20+iNEEEwEIADsWIQQOINchwea/D9Vt3lEn67vp
rjoWWwUCY+1HPAIbDQULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRAn67vp
rjoWW5ohA/9qeUqiEwNTjTI57NOreUmhO8N5jW3bqf9E4zYS+Bvielkvt23lfHda
VDEqLv8/AoPcW5tXTxsfvlkZ1hlVc9mWdncTNLYSVtOvkAh1R5kphfUZFr+rfzRZ
w/C/YxA7NQqq+zzBH66PRfkUzMiH9xNUr8odN7e735H1/lcLNTVdww==
=/kR2
-----END PGP PRIVATE KEY BLOCK-----
Private key deleted: ok
Public key deleted: ok

and for RSA-2048 [here]:

Key ID:  828A97B83EBD4D769C6730AE9F97A790CB68E1AD
Type: rsa-2048
Type: [email protected]
Message: Hello, how are you?
Encrypt:
-----BEGIN PGP MESSAGE-----
hQEMA5+Xp5DLaOGtAQgAlX0K/3b/+QlBDa4DFDn3LSAhM0lDJN2vHP+tch+lI9Je
mDkvJO4wdDmNHiVTXBmPYHVcGfa1dwuNu8BLpHYMuTJUlHT9OHF3nveuZstOwN7B
89dIWN2c6EOUKOY3YfFocbRrKTQeFovbgH8C/9BQb6+IAMwiTDODuS323kqxBsBG
1SwH8WLMv+euKza/2m9Kfj/5DvkqSAQ5/t1W9IdSZ/ca2lEW00ZTUiK+zqZSGNaN
/jum/426BqAcA7E2RM8gXgEzVuTVKoyhUvEcWGUeINTF8LJ1Xw3rRx+rMemD+6sD
ZGXI8y4vfVJEoqKfWcf2yMxUcTd2Dyd5shg7BfwYmNRYAQkCEFU3GdKzRDP7PEhd
MuRwfQ1OMn+rfQRCqv8FS2+ajYrIQ+bn45ySxCPjY/6CBiM7r08GIVYG1YkwPhE0
NvM1DKdVc9VCBSQtfoho9GU1obXzGspCFg==
=EtzU
-----END PGP MESSAGE-----
Decrypted:
Hello, how are you?

Public key (used to encrypt):
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBGPtR30BCACoJwAleHkqeOW46hGOZDLtJvfcT3IvBxDUO3mU5DFHhW317I9k
cgXd532sxFq9G/Fzxj+qvv+2G7fuc3uOnsS7AOR+Gfja9A+AX/2ElJUSG3nzbdqV
waA51W7xOhJnITXqFTLpKBku51siSPjdkifj6GWgJgMwnsBXpAK0sYiw20iC8vFi
qpCVE3O9gc3Aodh8vPFpohRDCFK0+rnpUtnTR6XerVEalJBi+xq9+brGdtgKeRWk
niUbNrie7FwufGL7NXgIJLDsRwjZxjJvxxeXn6CxUdjH+iEtIeWB6X/bbUmx0wKP
27L8D+KZz0s7APatWCuhdSMeAZHtABIfpGVrABEBAAG0G0ZyZWQgQmxvZ2dzIDxm
cmVkQGhvbWUuY29tPokBUQQTAQgAOxYhBIKKl7g+vU12nGcwrp+Xp5DLaOGtBQJj
7Ud9AhsNBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEJ+Xp5DLaOGt854H
/iboKDxjCPmezKao+lPpOLDa/cb5W4yYIhN3UjPEFLZlbqtXU8qBW3d59Tt7Hnsb
1lH/rx0f5jr5K2D+XMdkpAlXSSbAzTbF/A+lV6ibGcuDcOQCacHlV5ffoMOPaS07
OpNyzlFvQVUB2VmxX1xACB+lpMXWlyodsQu+QoR7HGJ0t+J39IEK58y52Z6vDUDs
ckat4qrSk/yu14rXgKHaStlEnuNUeWItpNT3YAhyPjsf6mdtAFaxGagh45rIdDUj
gnE4Stf1JAQ2r6jzI/OcCujAK2fr/fa0ZvugsSjVUYfSKPjrROY9VPO5uytJYVm+
XDvZ2uD7NKtSI9uUi3i8zYQ=
=85ko
-----END PGP PUBLIC KEY BLOCK-----
Private key (used to decrypt):
-----BEGIN PGP PRIVATE KEY BLOCK-----
lQPGBGPtR30BCACoJwAleHkqeOW46hGOZDLtJvfcT3IvBxDUO3mU5DFHhW317I9k
cgXd532sxFq9G/Fzxj+qvv+2G7fuc3uOnsS7AOR+Gfja9A+AX/2ElJUSG3nzbdqV
waA51W7xOhJnITXqFTLpKBku51siSPjdkifj6GWgJgMwnsBXpAK0sYiw20iC8vFi
qpCVE3O9gc3Aodh8vPFpohRDCFK0+rnpUtnTR6XerVEalJBi+xq9+brGdtgKeRWk
niUbNrie7FwufGL7NXgIJLDsRwjZxjJvxxeXn6CxUdjH+iEtIeWB6X/bbUmx0wKP
27L8D+KZz0s7APatWCuhdSMeAZHtABIfpGVrABEBAAH+BwMC8hJXYHnwh8XKKLeB
V/5IvvhcUQQVO+L3h8kWPWD175wKtI31TZd24jima+eQaRo1gzgh7u0Hzo2R9WKM
Vevw668XTjPsX6GmYuge4+BPhyM/HGt74nmNnTG1ug/XqPY/X1LzhVM2tUSZEhpn
jR3ZvMwjhbvxUuFtjGeP650UgWGRG59f/dKt8ZlgkGd3UcNUHKEuNdAe0MWC6Nr7
V5wBcVn/cBrizarNubSU3gPYqu8ptnJmXgYaZDLe7zLyeLrJyZXd4NzBXrtqwh+X
+9WB8Nq+DeMzHd5QSborlSmWvG8xayEs8CDqGBLg9fV/WuYBuF8rs7fDtcbzHSRs
JKwCMq4GuBWp27GlqfOgjrzw4uEiimStY92lrY3pejsUfcBUQchOwxJo20Is1hgt
+D4fr+nLTz4kFn3KAslVx5EEtn0w0ET4ApKQYcY9HxdGeRlER4n5xNrarcnHmveo
FDlQtqLkGkzYnD8lYDdOQ35Ht0ID3Sib/Auj38OwxWtulH3Kbdb1lmjmBtbJsbMf
YnnAHQ55qlvnA3hrw9TPtUmZ03NAtV3rcLYBvFUevQbZklDuorveh9edrb5U5i0c
PXnADD/TYQnAisIJHNMrkczDiIR4RnEXg58BARyaNp2fuiyrJJTGDRL+z/pt3ziC
DGphiF9tKilC8HOVuVDwbKJlTvOXrEWtkZNz1jHBz8kli+QjtVlbcc6gsKQHURNJ
L2Ip2KsJRuwMEDBFeMQiZSnmimJFggfWbMftLmIJAjbebjMNv9MiZRCFUz2Tw14U
Ss0ji40tY38ZVo9/+BR5CIsQbAgM1PtpYS+I1gcooBwJ7r76V2sgXJ1hOIGkb8cl
QhwJQHQXJKgqrHiyFK4sEBh9EbJ3PWw07eqjIUSGYrnBqbLE8iay/J1GYFjlczas
xjxMEzHeAgcntBtGcmVkIEJsb2dncyA8ZnJlZEBob21lLmNvbT6JAVEEEwEIADsW
IQSCipe4Pr1NdpxnMK6fl6eQy2jhrQUCY+1HfQIbDQULCQgHAgIiAgYVCgkICwIE
FgIDAQIeBwIXgAAKCRCfl6eQy2jhrfOeB/4m6Cg8Ywj5nsymqPpT6Tiw2v3G+VuM
mCITd1IzxBS2ZW6rV1PKgVt3efU7ex57G9ZR/68dH+Y6+Stg/lzHZKQJV0kmwM02
xfwPpVeomxnLg3DkAmnB5VeX36DDj2ktOzqTcs5Rb0FVAdlZsV9cQAgfpaTF1pcq
HbELvkKEexxidLfid/SBCufMudmerw1A7HJGreKq0pP8rteK14Ch2krZRJ7jVHli
LaTU92AIcj47H+pnbQBWsRmoIeOayHQ1I4JxOErX9SQENq+o8yPznArowCtn6/32
tGb7oLEo1VGH0ij460TmPVTzubsrSWFZvlw72drg+zSrUiPblIt4vM2E
=uKEF
-----END PGP PRIVATE KEY BLOCK-----
Private key deleted: ok
Public key deleted: ok

Conclusions

Public key encryption is cool. While we normally use symmetric key encryption to encrypt our data, public key encryption can be used to encrypt smaller amounts of data, such as for an encryption key. For this RSA comes to our rescue.