OpenSSH artwork at https://www.openbsd.org/artwork.html

OpenSSH 9.9, released on 2024-09-19, first introduced support for the new FIPS 203 Module-Lattice Key Encapsulation Mechanism (ML-KEM) post-quantum key exchange algorithm, previously known as Kyber. ML-KEM was formally standardized by NIST on 2024-08-13, and is designed to be secure against quantum attacks, making it a suitable choice for future-proofing cryptographic systems.

The OpenSSH implementation of supporting ML-KEM, specifically the mlkem768x25519-sha256 key exchange algorithm, is a hybrid approach that combines the post-quantum ML-KEM with the standard X25519 key exchange algorithm. The benefit of a hybrid approach is that in the event that, after further cryptanalysis, the ML-KEM algorithm ends up being broken, the X25519 key exchange algorithm will still provide a secure fallback. At least for now, while we don’t yet have a Cryptographically Relevant Quantum Computer (CRQC) that can break X25519. There is currently an IETF draft for Post-Quantum Traditional (PQ/T) hybrid key exchange methods based on ML-KEM and Elliptic Curve Diffie-Hellman (ECDH) algorithms (also including X25519) for use in SSH. OpenSSH’s mlkem768x25519-sha256 key exchange is exactly such an example thereof, and is being described there.

OpenSSH 10.0, released on 2025-04-09, is now using this new quantum-resistant key exchange algorithm by default. This further safe-guards against "store now, decrypt later" attacks, and I have since updated my personal OpenSSH configurations. Both mlkem768x25519-sha256 and curve25519-sha256 are now the only two key exchange algorithms I allow:

HostKeyAlgorithms ssh-ed25519
KexAlgorithms mlkem768x25519-sha256,curve25519-sha256
Ciphers chacha20-poly1305@openssh.com
MACs hmac-sha2-512-etm@openssh.com

You can inspect if your OpenSSH client supports the mlkem768x25519-sha256 key exchange algorithm by running the following command:

user $ ssh -Q KexAlgorithms
[...]
mlkem768x25519-sha256

When connecting using the -v option, you can see the key exchange algorithm being used:

user $ ssh -v user@host
[...]
debug1: kex: algorithm: mlkem768x25519-sha256
[...]

Your own use cases may vary, so you might want to adjust the above settings according to your own needs. The mlkem768x25519-sha256 key exchange algorithm is not yet widely supported by all SSH clients and servers, which is why I have kept the curve25519-sha256 key exchange algorithm as well. My SSH client on Android does not yet support this new key exchange algorithm. I wish I could continue to use ConnectBot, but it doesn’t yet use chacha20-poly1305@openssh.com (not even aes256-gcm@openssh.com) to negotiate ciphers:

jul 24 19:22:30 xxx sshd-session[410235]: Unable to negotiate with xxxx:xxxx:xxxx::xx port 45990: no matching cipher found. Their offer: aes256-ctr,aes128-ctr,blowfish-ctr,aes256-cbc,aes128-cbc,blowfish-cbc,3des-ctr,3des-cbc [preauth]

While ConnectBot still seems to be maintained, I don’t see any progress on this front.

JuiceSSH also does not support chacha20-poly1305@openssh.com for that matter (even though it does support aes256-gcm@openssh.com unlike ConnectBot):

jul 24 19:25:32 xxx sshd-session[410252]: Unable to negotiate with xxxx:xxxx:xxxx::xx port 44816: no matching cipher found. Their offer: aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-cbc [preauth]

And judging from JuiceSSH’s changelog, I don’t see this project as being actively maintained anymore since 2021. This is why I’ve (somewhat reluctantly) recently switched to Termius, which does support at least the chacha20-poly1305@openssh.com cipher (no mlkem768x25519-sha256 key exchange yet, though). Perhaps I will give Termux’s SSH client a try in the future, but seems more clunky in use than a dedicated SSH client app.

I’m also still considering using the sk-ssh-ed25519@openssh.com host key algorithm, which would allow me to use my YubiKey. Bernard Spil has written a good article on how to set that up.

Edit 20250820:

In an effort to speed-up adoption, OpenSSH 10.1 will also start throwing warnings when not using a quantum-resistant key exchange algorithm: https://www.openssh.com/pq.html