practical pqc

posted: 2025-10-08

Post-Quantum Cryptography Practical Usage

As quantum computers progress, eventually solving the large prime number math calculations that back RSA encryption will be easy. To get out ahead of that and create newer, better cipher algorithms, there is a whole field of post-quantum cryptography (PQC). My interest is in how we, as users, can already start playing with these algorithms and build things.

Here’s my first adventure into PQC: a signed "hello world" message.

A little aside before I start: I asked ChatGPT about PQC and it assured me that GnuPG supported it and that the gpg install on my Mac was all I needed. After I disproved that, it recommended sequoia-pgp, which also does not have any PQC algorithms yet. So, I lost an hour and acquired a headache.

Create ML-DSA-65 private key

$ openssl genpkey -algorithm ML-DSA-65 -out mldsa65-private.pem

Extract public key from private key

$ openssl pkey -in mldsa65-private.pem -pubout -out mldsa65-public.pem

Author message, sign it, convert signature to base46, and copy that to clipboard (Mac OSX)

$ echo hello world > msg.txt
$ openssl pkeyutl -sign -inkey mldsa65-private.pem -in msg.txt -out message.sig
$ base64 -i message.sig | pbcopy

Here is the resulting signature

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

To verify it you'll need to first convert the signature back to binary:

$ pbpaste > message.sig.b46
$ base64 -d message.sig.b64 > message.sig

And the same with my public key

LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJSHNqQUxCZ2xnaGtnQlpRTUVBeElEZ2dlaEFBMklCN1ZYQU1EbklnK3J4Q1Zha2JCcnhSYUd6NWtqVEIwdQp6MUpGMFhtb250bWpjWlMrQVU0YWFSL0t0RForY0dYTlN0cWhWRWxGaGdka1dhUnBFbEVHcFdiS0gwVnVlV2hsCitZS3hpc0k0TUxRaWx5UytVVjAzTnF4NE56aDBJTUdlVGJ1anpQdUgrZ0IrVDArM1ZyOHhKMmFOei9kNm8zMlkKTHg1TVdZRXNCaHBENGhjazZXZWQrQ3pPdUxKN2ZjVUVJUkZKT0RtM3prazhGTStEdlBkWkZqRTBRazgwc0ZmcwpDTUtDZ0M4YkNCYUxYSjdTZE1BSW9nbmEybVgvM09oUFl3YlRRS2xkcEROUGM4NTh6V2liRkp0M1dDcktlN3RWCm84U2ZEUzczQ0NMeUtRWTY3UlNaNWhydVFjM0pTbkZQaHEzOHRDZnMzbjBGM1l3YlBwRGxCdEpxUmllSTg0OHAKWTdVZHlKa1duaE1EdEQyS0JwOTBwam1pUkV5VzJhd0JVK3JVeHZvUzU3V01PcEM3THJlRzhDRVdWT084THc3UwpkZ1ZkVE5WMU1iNHNtTDkySnpIaFlieWtWRHNrUGkrWXpoT3pqa1U4K05uSnkrbkJaQmF6UncvU2JxZFYwNGMxCi8vMG02dGx2bnJWTERWWDYvWk9kdEduZEpleHRwbTdrYTVkbFN0N2xZMmZLWDVIM3VPb3ZTeVJkRkV5N3NyQXoKSEUxV2w0OUltejZFSy8wdys2WWlpNGlvdHk0SDg4S3V2QWdXMkdqanlnRVV6UXlRMVp6L3dpcTNteHUzT05NYwplVi9qQWxBbXc5WmkzYnVwR3gxcjk4R0JZRUMrWjgvUUJCUkJYTEZKKytoUTJ3UXl2ZUREUTZrM1dOT3pJTFJkCmlrSkkzdUI0MGxDYUdNb2IvRkVaYkNLbTRYZGFXcEtKZ1ZnbzVheDhSWmFRekljWUNJeFNzRGhHdXRTbGtYUVoKYlF6MldKaHhvUndPTlJWUStOSGpENWRZS2Iyd0JKaXZHQXU1UlFQbmk3aDFvdnAxT3gwOVRpcUJJTm9RMDJvNgpCTzg1UUlEdWxzY3o2bXJEVm9lUUppbkJOVzVhTnhNSUdlaG1zUGJnWjFtZlIzcmpGejg3NUJRRkQ5dmY2ZkowClBQQy9yeDFKYjBML0tSNnNxRGswZnRqRW9Ka3N6c0hJUlpQQmx0QWhDWm5WY24vLzc3czR0bTg2dnBPWncyOXkKZTdhL3NYM1QxM1JUQTBNaWM4aXRtbUZLSy8raWw1NWt2R1A0akg0NFdRd01OKzUvYVJ6S3dyUHN0ajBVMmMyKwpyMEozeHJYdmdSZUJkb0pzM0JyeEJFc0tjeHlyMDVSam9sQkVNMXhGVWF6TFpkSTM3NktUOWd1QW5zRG5uLzZlCllQQUVQa2p6TnZzS0VYb1N3L1FPQzIxaDFPcnNHWlhZNndPbzFtdFdlNTJBYzZZcHVpTE5UUEViUE1lUXp4VVQKSUNoUkJDbE1IS3JOYkt2aUw1MkVEMlhkWHF1Q2pxNEJCdmF2L0JIRml6dzNrSHlDblFsNVJDVytFYldNd3Rlagp3VUF0dDJqZUUxMU91WS9GUjR0VVRNT1lNSEtXS1p2OGRLSjBuS2RjR2ZKRWEzOFFCb2ZsRTRaUFJ3S2twempwClpJMnExYVJPNUgraERtQkU3WnR0YVdnK0h6ZFRYc08vS0pvQkxXbEx1cGJGeFNIM3hINXlxajQzNkxtOEU5RzYKSnRXV01nWHltNmsxa1I0ZGUrRnJaaGlXdUp2ZzB3aWFkRU1zZmRqZis3bkpQSFQ2WEorV3kyUTlRY25UU1lwMQppTkZEcW5Tbll4TU5TdnRicEtWUWJyN0V6dU1hTmRYM1BYSjNUdkFYdmI3Ti9mK3hzVHJaREZvUUFhUHkvUmwrCkQ0THRqbU0zVjJ4UHpyMDVSbWpnTWRmRjdJOGlDWGNKTGVRWFFpUjkxSnpoR2FJWTJBbUdBOEtpZWdPRHFSbHkKKzNHMXhuM09HVFJjSkxMUWRCTHNnb0FEWjR0UjgxVTNWZGxtTVJPSlhxODdOY1h6RHNmL2NBaWpSQ0xBOHdUeAp4bkJoTWZwTXpycFZVZjZTSFBVZ0g0YWVBd3NsclZIdVpBMUo1SkxwS3d1VExLdEpDQldlczU0YmtObnlDMUN6CjF6ODZubEFhamx5dWZldzdqWHphdTlUalBUaTNKVGpQWGkwbDlnOXhPVnh6RXp3Qk5jOSt5NU9mY1dJUWx6WjQKUlZrZGxyekFsY3g4UkRzaTkxTzFpRFFrY2pVUXlNeUtnVmJvOVlJRVlyQWZLS1BPVnpwbDNDQWhDc2lmZmFIUgo3TTZvSjdXVmRzVjU0WFk1R0dUVkhLYXJQcVNhVXdnbERhZmpSYU9RRGdUTWl1YUQ5TnpPRmdnUVNNUkRGTnZjCjFJZU5BR3JBdzB3djdNcVVnNHZWRGhPM0RzL205UFVRVGNBa0Fxb1pEZXEyaEZQdUVtbE9YWHB0STFLUkRIVEoKQ0U1anlKVGhVaGtHSGR6cWJnSFkremZQWG9SWHhGcmtRQzBtSFo1c05PRU5KZ2ZtY2RkVXMvRE5yQ0xBN1l0VAowQzFTYm1JQ01ud1NUR1IxR2hYNTdSWDh1c1BoUklhYklnUGw2c0xieTU2MjJ1NHd5K29NSUdrUFdiL2pwR0xNCjVUNktGMFRkQy8xSnV5OStyalY3RUFCbHY5NUJ3OW5YNU5BZ1RzL2JMdXl5OVFBMktaNW9nRm5pa2Z2K05kcjcKUzNhQXJJMmUrdVV0Wi9BT3gyTWZzMHN2RjRYQ3ZaNEdMYjBZQ0lNTnBJblQ5aVF1NmVqZ0Rlbzk0TUpwYnRZaApvaDMyOS9iY2w3QklzNlJyYWlISmFmUVVMTlRCRHEvWktzWnZuK0dJUEtpRlBsc3h5UGhyRi90eHVDVm1YUWRTCmw4a0NSMXZXY2tmeGVueWk4azBMRFZZa052ajBBeEhUZ0xuR2hWZkRhUWRnbHEvNVkycFlOMzhOV1lXVExwNUsKVkxHdDlKK2Y5emRKbW5FR2lnR2l0aXJyVWhVbWFwVHJOSmdYaW9VNHhBdEF5WTZmS1BIaGUrZ08rTVo0RWJDcApQMUk3dktoVEMvWm1HSHMxVTlUSDVYa055Uks2Vzd3eWZoMWRBRUpMcVNwbU9mVGJ6eFBOYkNDL1FML0NVOWJuCkVYSlNSOWU2K29qU1F6bWs0SW9wL2pQbHJIMjV0cUY5TERhRTJ3bWxzNzhUTzJaeEx3a0xNVjliQmpxVjVTMWsKN2lGZUlEeHVrbDVodEFBRS9DVGZhSm5NeGFKVmxpL1NhRk9STmFPVitxWDd3dE53V0VOREFLWWVaOXhFWmNKaApsRjRpbCtkeStXdjE3eloyUWlMVlA4bncyVTE4OVNzdDdzaHpKZzlnbjR6MWtBeGhmYWorWXpKa0lqOGpJNE8wCkxUS21ZUEdsCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=
$ pbpaste > travis_pub_key.pem.b46
$ base64 -d travis_pub_key.pem.b64 > travis_pub_key.pem

Then finally to verify the message

$ echo "hello world" > msg.txt
$ openssl pkeyutl -verify -pubin -inkey travis_pub_key.pem -in msg.txt -sigfile message.sig
Signature Verified Successfully

Wow, you now know I wrote "hello world" and it was not faked by a quantum powered AI!

Nav

Back to gemlog list
Back to home