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!