A developer needed to implement offline license key verification for a desktop application written in .NET. The license string had to work without an internet connection, contain no third-party dependencies, remain short enough for manual typing from an email, and support key rotation if the private key were ever compromised.
The first choice was Ed25519 because of its compact size, speed, and deterministic signatures. However, reflection over System.Security.Cryptography in both .NET 8.0.28 and .NET 10.0.9 showed that no Ed25519 or Curve25519 types are exposed. The only asymmetric primitives available are DSA, ECDsa, ECDiffieHellman, and RSA, together with the NIST P-256, P-384, P-521, and Brainpool named curves. Post-quantum algorithms such as ML-DSA and SLH-DSA appear only in .NET 10.
Attempts to create an Ed25519 curve with ECDsa.Create(ECCurve.CreateFromFriendlyName("Ed25519")) throw a PlatformNotSupportedException. An open GitHub issue requesting Ed25519 support has been open since 2015, with the approved API now scheduled for .NET 11.
Adding external libraries was considered next. BouncyCastle 2.6.2 adds a single 4.7 MB managed assembly, while NSec 24.4.0 brings a 92 KB wrapper plus native libsodium binaries. The latest NSec release refuses to install on .NET 8, illustrating the risk that a dependency’s platform support schedule may diverge from the application’s own lifecycle.
Benchmarks on an AMD Ryzen 7 5800H running .NET 8 Release showed the following verification times for a 39-byte payload: ECDSA P-256 at 191 µs, Ed25519 via BouncyCastle at 77 µs, and Ed25519 via NSec at 91 µs. RSA-2048 verification was fastest at 16 µs, yet its 256-byte signature expands to 571 Base32 characters—far too long for comfortable manual entry.
Encoding the 64-byte ECDSA signature plus payload in Base32 with groups of five characters separated by hyphens produces a 202-character key. This length is the shortest mathematically possible for an offline scheme that must embed both the license data and a cryptographically strong signature.
ECDSA signatures were recorded in IEEE P1363 format (r‖s) to guarantee a fixed 64-byte length; the DER format produces variable lengths between 69 and 72 bytes. The public key is stored inside the application as raw 64-byte coordinates rather than the full 91-byte SubjectPublicKeyInfo structure, reducing the embedded constant to 88 characters.
The chosen algorithm carries two acknowledged drawbacks. ECDSA signature generation depends on a high-quality random nonce; reuse or predictability can leak the private key. In addition, the same license data signed twice yields different strings, requiring the license registry to tolerate duplicates. These risks were accepted because signing occurs on a single offline machine using the operating system’s RNG, and the threat model is limited to protecting a commercial desktop application rather than high-value secrets.


