Meet RNP, an RFC4880-compliant OpenPGP library written in C++.
RNP was born at Hong Kong-based Ribose and is maintained under its initiative. Originally stemmed from NetPGP, it has little in common with its ancestor now after a year of development—after a clean-up of legacy code, corrected compatibility issues with GnuPG and other implementations, improved performance and added cutting-edge features.
Feel free to use RNP in your software!
Getting started with RNP
If you’re deploying OpenPGP in a Ruby-based application, there are bindings (see RubyDoc ).
Since it’s written in C++, you can call RNP from Objective-C code, or with ctypes under Python.
rnpkeys can be installed via Homebrew or YUM,
with Debian packages coming next.
You can use the binaries similarly to GnuPG’s command-line tools
(see supported flags and use cases in RNP’s README ).
It’s a proper library, in contrast to GnuPG/GPGME . Ruby bindings are available with Python & Go bindings in the works, and you can use it wherever you can call C++ code.
It’s implemented in C++ and offers constant memory footprint with large amounts of data.
It offers comprehensive cipher support, including (uniquely) the SM algorithm family—a desirable feature if you deploy cryptography in mainland Chinese market.
Its development is active (with the help of Ribose) and focused on adding cutting-edge features.
Which algorithms does RNP support?
The following ciphers, encryption modes and hash functions are supported:
Symmetric: IDEA, Triple DES, CAST5, Blowfish, AES-128, AES-192, AES-256, Twofish, Camellia-128, Camellia-192, Camellia-256, SM4
Symmetric encryption modes: CFB, AEAD-EAX, AEAD-OCB
Hash: MD5, SHA1, RIPEMD160, SHA-256, SHA-384, SHA-512, SHA-224, SM3
Asymmetric: RSA, ElGamal, DSA, so-called DSA2 (i.e. DSA with keys larger then 1024 bits), ECDSA/ECDH (with some subset of curves which later on will be expanded), EdDSA, SM2.