<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>SoftActivate Blog</title>
        <link>https://www.softactivate.com/blog/</link>
        <atom:link href="https://www.softactivate.com/blog/feed.xml" rel="self" type="application/rss+xml" />
        <description>Deep dives on software licensing, copy protection, hardware fingerprinting and license-key cryptography from the team behind the SoftActivate Licensing SDK.</description>
        <language>en</language>
        <lastBuildDate>2026-05-01T00:00:00.000Z</lastBuildDate>
        <item>
            <title>Why You Shouldn&#39;t Use Symmetric Encryption to Generate License Keys</title>
            <link>https://www.softactivate.com/blog/2026/05/symmetric-encryption-license-keys/</link>
            <guid isPermaLink="true">https://www.softactivate.com/blog/2026/05/symmetric-encryption-license-keys/</guid>
            <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
            <description><![CDATA[AES and Blowfish look tempting for short license keys, but a single reverse-engineered binary hands attackers a working keygen for every customer you ever sold to. Here is why digital signatures are the only safe choice.]]></description>
            <author>SoftActivate Technical Staff</author>
            <category>licensing</category>
            <category>cryptography</category>
            <category>software-protection</category>
            <content:encoded><![CDATA[<p>When developers first sit down to design a license-key system, the temptation
is almost universal: reach for a familiar symmetric algorithm — AES, Blowfish,
maybe DES if the codebase is old enough — encrypt a small payload, ship it as
the license key, and decrypt at the customer's machine to validate.</p>
<p>It looks elegant. It is fast. It even compiles. And it is, almost without
exception, <strong>the wrong choice</strong>. This article explains exactly why, and what
to use instead.</p>
<h2>The naïve approach</h2>
<p>The textbook version of &quot;encrypt my license key&quot; usually looks like this:</p>
<pre class="language-text"><code class="language-text">KEY        = KEY_DATA | ENCRYPTED(HASH(KEY_DATA))
ENCRYPTED  = AES-128 / Blowfish / 3DES / "rolled my own"
SECRET KEY = a constant compiled into the product binary</code></pre>
<p>To validate a key at runtime, the product:</p>
<ol>
<li>Splits the key into the data portion and the encrypted-hash portion.</li>
<li>Hashes the data portion locally.</li>
<li>Decrypts the encrypted-hash portion with the secret embedded in the binary.</li>
<li>Compares. If they match, the key is &quot;authentic&quot;.</li>
</ol>
<p>This is, structurally, a poor man's digital signature — except that the
&quot;signing key&quot; and the &quot;verification key&quot; are the same secret, and that one
secret has to live inside every copy of your product you have ever shipped.</p>
<h2>The &quot;secret in the binary&quot; fiction</h2>
<p>If you have spent any time around reverse engineering, you already know where
this is going. A symmetric key sitting inside a shipped executable is <strong>not
secret</strong>. It is, at most, lightly obscured.</p>
<p>A determined attacker with <a href="https://ghidra-sre.org/">Ghidra</a>, <a href="https://hex-rays.com/ida-pro/">IDA</a>, or <a href="https://github.com/dnSpy/dnSpy">dnSpy</a>
needs hours, not weeks, to:</p>
<ul>
<li>Identify the validation routine (it has a recognisable shape: hash, decrypt,
compare).</li>
<li>Set a breakpoint on the decryption function call.</li>
<li>Read the key out of memory or out of the static-data segment.</li>
</ul>
<p>Obfuscation, code packing, anti-debug tricks, white-box cryptography — none of
them change the fundamental problem. They raise the cost from a single
afternoon to a few afternoons. For a product worth pirating, that is not
nearly enough.</p>
<h2>The blast radius is your entire customer base</h2>
<p>The really bad part is what happens after the secret leaks. With a symmetric
scheme:</p>
<ul>
<li>The leaked key is <strong>the same key every customer's installation uses to
validate</strong>. There is no per-customer rotation possible after the fact.</li>
<li>Anyone who downloads the leaked secret can mint unlimited working license
keys instantly. Keygens appear on warez sites within days.</li>
<li>Your only remediation is to <strong>change the secret and ship a new build</strong>, and
hope every paying customer upgrades quickly. In the meantime, support is
flooded with calls from legitimate buyers whose newly-purchased keys do not
work in their old installation.</li>
</ul>
<p>The economics are brutal. One reverse-engineering session, one keygen post,
and your licensing system is permanently compromised for every version of the
product currently in the wild. A new release does not undo the damage to the
old one.</p>
<h2>And then there is the key length problem</h2>
<p>Even setting aside the security disaster, the most common symmetric algorithm
of the modern era — AES — is structurally unsuitable for short license keys.
AES has a 128-bit block size. The smallest possible AES ciphertext is 16
bytes. Add a hash payload to it and you are already at 32 bytes of binary
data, which becomes <strong>52 characters in Base32</strong> — and that is before you add
any product-side payload like edition, expiry, or seat count.</p>
<p>No customer wants to type a 52-character key from a printed invoice. No
support agent wants to read one over the phone. The block-size mismatch alone
is a usability killer.</p>
<p>Older 64-bit-block ciphers like Blowfish at least produce short enough output
to be typeable, which is why you still occasionally see them in legacy
licensing libraries. The reverse-engineering problem, of course, is identical.</p>
<h2>What you actually want</h2>
<p>The thing developers reach for symmetric encryption to do — produce a small
payload that the product can confirm was issued by you — is a textbook
description of a <strong>digital signature</strong>. The key insight is that signing and
verification can use <strong>different keys</strong>:</p>
<ul>
<li>The <strong>private key</strong> stays on your build server. It never ships. It
generates new license keys.</li>
<li>The <strong>public key</strong> ships inside every copy of your product. It can verify
signatures, but it cannot create new ones.</li>
</ul>
<p>A leaked public key is worthless to a pirate. They can use it to verify keys
to their heart's content, but they cannot mint new ones. The catastrophic
&quot;single secret protects every install&quot; failure mode of symmetric schemes
disappears completely.</p>
<p>The standard objection is signature size — a 2048-bit RSA signature is 256
bytes, which is far too large to be a typeable license key. That is true, and
it is the reason naïve developers go back to symmetric encryption in the
first place. The actual answer — short signatures with strong security — is
elliptic-curve cryptography, and we cover it in detail in the follow-up
article: <a href="/blog/2026/05/ecc-vs-rsa-license-keys/">ECC vs RSA for License Keys</a>.</p>
<h2>Bottom line</h2>
<blockquote>
<p>If your license-key system uses the same secret to issue keys and to
validate them, you are one reverse-engineering session away from shipping
a free keygen with your product.</p>
</blockquote>
<p>Use digital signatures. Keep the private key off the customer's machine. The
moment you internalise this, every other licensing decision gets easier.</p>
<p>For a deeper walkthrough of the full design space — including hardware
fingerprinting, online activation, and how to keep the resulting keys short
enough to type — see our pillar guide:
<a href="/licensekeygeneration">How To Generate License Keys Securely</a>.</p>
<p>If you would rather skip the cryptography homework and ship something that
already gets this right, the SoftActivate Licensing SDK includes the full
ECC-based key generation pipeline (with C++ and C#/.NET source code) and an
<a href="/license-designer">interactive license designer</a> you can experiment with in
your browser.</p>
]]></content:encoded>
        </item>
        <item>
            <title>On-Premises vs SaaS Licensing Servers: Which One Should You Choose?</title>
            <link>https://www.softactivate.com/blog/2026/05/on-premises-vs-saas-licensing-servers/</link>
            <guid isPermaLink="true">https://www.softactivate.com/blog/2026/05/on-premises-vs-saas-licensing-servers/</guid>
            <pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate>
            <description><![CDATA[Choosing between an on-premises and SaaS licensing server comes down to control, compliance, IT capacity, and growth plans. Here is a practical framework for software vendors deciding which model fits best.]]></description>
            <author>SoftActivate Technical Staff</author>
            <category>licensing</category>
            <category>activation</category>
            <category>software-protection</category>
            <content:encoded><![CDATA[<p>Software vendors evaluating a licensing stack often focus first on features: online activation, floating licenses, subscription renewals, offline grace periods, reseller support, hardware fingerprinting.</p>
<p>Those features matter, but the deployment model of the licensing server matters just as much. Specifically: <strong>should your licensing server run on your own infrastructure, or should it be delivered as a SaaS service?</strong></p>
<p>There is no universal winner. The right answer depends on your compliance requirements, your operational maturity, the type of customers you sell to, and how much control you want over upgrades and data residency.</p>
<p>This post lays out the trade-off clearly so you can choose a model that fits your business rather than copying whatever is fashionable.</p>
<h2>Start with the real question: who should operate the licensing infrastructure?</h2>
<p>At a high level, both models can deliver the same licensing outcomes:</p>
<ul>
<li>issue and validate license keys</li>
<li>activate machines online</li>
<li>enforce seat or device limits</li>
<li>manage subscriptions and renewals</li>
<li>expose admin tools for support and sales teams</li>
</ul>
<p>The real difference is <strong>who operates the service boundary</strong>.</p>
<p>With an <strong>on-premises licensing server</strong>, you run the server stack yourself. Your team owns deployment, patching, backups, uptime, database maintenance, monitoring, and access control.</p>
<p>With a <strong>SaaS licensing server</strong>, the vendor runs that infrastructure for you. Your team consumes the service through a browser UI and APIs, while the vendor handles hosting, upgrades, scaling, and most operational maintenance. That is the core distinction reflected in general SaaS vs on-prem guidance from AWS and others: SaaS removes most infrastructure management from the customer, while on-prem keeps that responsibility in-house.<a href="https://aws.amazon.com/compare/the-difference-between-saas-and-on-premises/">AWS</a></p>
<p>If your team frames the decision that way, the trade-offs become much easier to reason about.</p>
<h2>When on-premises is the better choice</h2>
<p>On-premises licensing infrastructure is usually the right fit when <strong>control is not a preference but a requirement</strong>.</p>
<h3>1. You have strict compliance or data-residency constraints</h3>
<p>Some vendors serve customers in defense, government, industrial control, healthcare, or other regulated environments where data location and network boundaries are heavily controlled. In those settings, even a well-run SaaS may be difficult to approve.</p>
<p>If activation logs, customer records, device fingerprints, or audit trails must stay inside a defined environment, an on-prem deployment is often the simplest path through procurement and security review.</p>
<h3>2. Your customers expect private deployment options</h3>
<p>Enterprise buyers do not all want to depend on a third-party cloud service for license enforcement. Some insist that critical operational dependencies remain within infrastructure they control, especially when software must function inside isolated or low-connectivity networks.</p>
<p>For vendors selling into those accounts, on-prem is less a technical decision than a sales-enablement decision.</p>
<h3>3. You want full control over upgrades and change windows</h3>
<p>A SaaS model usually means the platform evolves on the vendor's timetable. Even if changes are well-managed, you are still downstream of someone else's release calendar.</p>
<p>On-prem gives you tighter control over:</p>
<ul>
<li>when to roll out updates</li>
<li>when to rotate credentials or certificates</li>
<li>how to integrate with internal identity systems</li>
<li>how long to keep compatibility with legacy application versions</li>
</ul>
<p>That can matter if licensing is embedded into long-lived desktop or industrial software with conservative release cycles.</p>
<h3>4. You already have strong internal ops capability</h3>
<p>If you already operate customer-facing infrastructure reliably, adding a licensing server may not be a major burden. Teams with established DevOps, security, database, and monitoring practices can often absorb an on-prem deployment more comfortably than smaller vendors expect.</p>
<p>In that situation, the extra control may outweigh the operational cost.</p>
<h2>When SaaS is the better choice</h2>
<p>SaaS is usually the better option when <strong>speed, elasticity, and reduced operational burden</strong> matter more than absolute infrastructure control.</p>
<h3>1. You want to launch quickly</h3>
<p>A SaaS licensing server removes a long list of tasks from the critical path:</p>
<ul>
<li>provisioning servers</li>
<li>configuring backups</li>
<li>setting up monitoring</li>
<li>hardening the public surface</li>
<li>planning database maintenance</li>
<li>staffing for uptime and patch response</li>
</ul>
<p>That can cut weeks or months from an initial rollout. Broad industry guidance consistently highlights lower setup overhead and easier scaling as core SaaS advantages.<a href="https://aws.amazon.com/compare/the-difference-between-saas-and-on-premises/">AWS</a> <a href="https://www.leanix.net/en/wiki/apm/saas-vs-on-premise">LeanIX</a></p>
<h3>2. Your team is small</h3>
<p>Many software companies do not want to become infrastructure operators just to issue license keys and handle activations. If your engineering team is focused on the product itself, SaaS lets you keep that focus.</p>
<p>That is especially attractive for startups and mid-sized ISVs where one senior developer often ends up owning every &quot;temporary&quot; internal service forever.</p>
<h3>3. Your demand is uneven or growing fast</h3>
<p>Activation traffic is not always steady. A new release, a large reseller deal, or a migration campaign can create bursts of load. SaaS platforms are generally easier to scale because the underlying capacity is managed by the provider rather than procured and installed by your team.<a href="https://aws.amazon.com/compare/the-difference-between-saas-and-on-premises/">AWS</a></p>
<p>If you expect growth, seasonality, or unpredictable spikes, that elasticity has real value.</p>
<h3>4. You want the vendor to own routine maintenance</h3>
<p>A well-run SaaS licensing platform should absorb much of the repetitive operational work:</p>
<ul>
<li>applying security patches</li>
<li>managing availability and failover</li>
<li>upgrading the admin console</li>
<li>tuning performance</li>
<li>handling backups and recovery procedures</li>
</ul>
<p>That does not remove the need for vendor due diligence, but it does move a significant amount of work off your plate.</p>
<h2>The practical trade-offs, side by side</h2>
<p>Here is the simplest way to think about the decision:</p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>On-premises licensing server</th>
<th>SaaS licensing server</th>
</tr>
</thead>
<tbody>
<tr>
<td>Infrastructure control</td>
<td>Highest</td>
<td>Lower</td>
</tr>
<tr>
<td>Time to first deployment</td>
<td>Slower</td>
<td>Faster</td>
</tr>
<tr>
<td>Upfront operational effort</td>
<td>Higher</td>
<td>Lower</td>
</tr>
<tr>
<td>Ongoing maintenance burden</td>
<td>Higher</td>
<td>Lower for customer</td>
</tr>
<tr>
<td>Data residency flexibility</td>
<td>Highest</td>
<td>Depends on vendor</td>
</tr>
<tr>
<td>Scalability</td>
<td>Your responsibility</td>
<td>Usually easier</td>
</tr>
<tr>
<td>Custom internal integration</td>
<td>Often easier</td>
<td>Depends on API/extensibility</td>
</tr>
<tr>
<td>Offline or isolated-network suitability</td>
<td>Strong</td>
<td>Depends on architecture</td>
</tr>
<tr>
<td>Predictable internal change control</td>
<td>Strong</td>
<td>Shared with vendor roadmap</td>
</tr>
</tbody>
</table>
<p>That table is intentionally boring, because boring is useful here. Most bad decisions happen when teams over-romanticize one model instead of evaluating who will carry the cost.</p>
<h2>A licensing-specific lens: what matters beyond generic SaaS vs on-prem debates</h2>
<p>The licensing-server decision has a few wrinkles that do not always show up in generic software deployment comparisons.</p>
<h3>Activation reliability matters at the worst possible moment</h3>
<p>When a licensing server fails, the failure is customer-visible immediately: new activations break, seats cannot be reassigned, trials may not convert cleanly, and support starts taking calls.</p>
<p>That means your choice is not just about cost. It is about who you trust to meet the operational bar for a service tied directly to revenue recognition and customer onboarding.</p>
<h3>Offline fallback changes the equation</h3>
<p>If your product supports offline activation or over-the-phone activation, the pressure on always-on connectivity is lower. In the SoftActivate Licensing SDK, the platform supports both online activation and offline scenarios, which can reduce dependence on a constantly reachable public endpoint for some use cases.<a href="product/README.md">README</a></p>
<p>That does <strong>not</strong> eliminate the need for a server, but it can make the deployment choice less binary. Some vendors keep the main licensing workflow online while preserving offline fallback for high-friction environments.</p>
<h3>Multi-tenant and reseller models push many vendors toward SaaS</h3>
<p>If you operate across multiple brands, resellers, or customer partitions, centralized administration becomes more valuable. The current SDK notes optional multi-tenant support for SaaS providers and resellers in its server architecture, which is a strong hint about where hosted models gain leverage operationally.<a href="product/README.md">README</a></p>
<p>If your business model depends on central visibility across many tenants, SaaS often becomes more attractive.</p>
<h2>Choose on-premises if these statements sound like you</h2>
<p>On-prem is usually the better fit if most of the following are true:</p>
<ul>
<li>you sell into tightly regulated or air-gapped environments</li>
<li>you need strong control over where licensing data lives</li>
<li>your customers expect self-hosted or private deployment options</li>
<li>you already have capable internal ops and security teams</li>
<li>you need custom integration with internal identity, network, or audit systems</li>
<li>your release cadence is conservative and you want explicit change control</li>
</ul>
<p>In short: choose on-prem when <strong>control, compliance, or deployment sovereignty</strong> outweigh convenience.</p>
<h2>Choose SaaS if these statements sound like you</h2>
<p>SaaS is usually the better fit if most of the following are true:</p>
<ul>
<li>you want to launch without building operational plumbing first</li>
<li>your team is small and product-focused</li>
<li>you want the vendor to handle scaling, patching, and uptime</li>
<li>your customers are comfortable with cloud-delivered back-office services</li>
<li>you expect growth, bursty activation traffic, or multi-tenant operations</li>
<li>you value faster iteration over strict control of every infrastructure layer</li>
</ul>
<p>In short: choose SaaS when <strong>speed, leverage, and lower ops overhead</strong> outweigh the need for full infrastructure ownership.</p>
<h2>The answer for many vendors is not ideological but hybrid</h2>
<p>A lot of software vendors end up needing both.</p>
<p>They use a hosted licensing environment for most customers because it is faster to operate and easier to scale, while preserving an on-premises option for enterprise accounts with strict procurement or security constraints.</p>
<p>That hybrid path is often the most commercially realistic one:</p>
<ul>
<li>SaaS for default deployments</li>
<li>on-prem for regulated or high-control customers</li>
<li>offline activation support for edge cases and disconnected environments</li>
</ul>
<p>If you can support that without fragmenting the product, you get the sales flexibility of on-prem and the operational efficiency of SaaS.</p>
<h2>Bottom line</h2>
<p>The best choice is not &quot;modern&quot; versus &quot;traditional.&quot; It is <strong>who should own the operational risk of your licensing infrastructure</strong>.</p>
<p>Choose <strong>on-premises</strong> if your business needs maximum control, private deployment, strict data handling, or enterprise-specific integration.</p>
<p>Choose <strong>SaaS</strong> if your priority is faster rollout, easier scaling, and avoiding the long-tail cost of running infrastructure yourself.</p>
<p>And if your market spans both startups and regulated enterprises, plan for a model that can serve both.</p>
<p>For the bigger licensing design picture — including secure license-key generation, activation flows, and how client-side verification fits into the stack — start with <a href="/licensekeygeneration">How To Generate License Keys Securely</a>. For a closer look at the cryptographic side of compact, verifiable license keys, see <a href="/blog/2026/05/ecc-vs-rsa-license-keys/">ECC vs RSA for License Keys</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title>ECC vs RSA for License Keys: Why Elliptic Curves Win on Key Length</title>
            <link>https://www.softactivate.com/blog/2026/05/ecc-vs-rsa-license-keys/</link>
            <guid isPermaLink="true">https://www.softactivate.com/blog/2026/05/ecc-vs-rsa-license-keys/</guid>
            <pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
            <description><![CDATA[RSA signatures are too long to fit in a typeable license key. ECC delivers equivalent cryptographic strength in a fraction of the bytes — which is the only reason a sub-30-character secure license key is even possible.]]></description>
            <author>SoftActivate Technical Staff</author>
            <category>licensing</category>
            <category>cryptography</category>
            <category>ecc</category>
            <category>software-protection</category>
            <content:encoded><![CDATA[<p>In the <a href="/blog/2026/05/symmetric-encryption-license-keys/">previous post</a> we
established that secure license-key generation requires a <strong>digital signature
scheme</strong> — never a shared symmetric secret embedded in the product binary.</p>
<p>That settles the security question. It immediately raises a usability one:
which signature algorithm fits inside a license key short enough to type from
a printed invoice?</p>
<p>This post walks through that decision in detail, contrasting RSA and elliptic-
curve cryptography (ECC), and explains why every modern licensing SDK that
takes both security and UX seriously ends up on ECC.</p>
<h2>Recap: what we are signing, and what we are sending</h2>
<p>A license key, broken down to its essentials, is a tuple:</p>
<pre class="language-text"><code class="language-text">KEY = KEY_DATA | SIGNATURE(KEY_DATA)</code></pre>
<p>Where <code>KEY_DATA</code> carries the bits the product needs to know — edition, seat
count, expiry, customer id — and <code>SIGNATURE(KEY_DATA)</code> is what proves the
publisher generated it.</p>
<p>Both pieces have to be encoded into a typeable string, almost always
<a href="https://en.wikipedia.org/wiki/Base32">Base32</a> (5 bits per character, with confusing characters like <code>O</code>,
<code>0</code>, <code>I</code>, <code>1</code> removed). Total key length in characters is therefore
<code>ceil((data_bits + signature_bits) / 5)</code>.</p>
<p>The signature is the dominant term by far.</p>
<h2>Trying RSA first</h2>
<p>RSA is the digital-signature algorithm most developers learned in school. It
is well-understood, has excellent library support, and the security analysis
is mature. So let's see what an RSA-signed license key would actually look
like.</p>
<p>The current public recommendation for new RSA deployments is a <strong>2048-bit
modulus</strong> (1024-bit is considered broken; 3072-bit is recommended for
long-lived data). A 2048-bit RSA signature is exactly <strong>256 bytes</strong> — that
is the modulus size, by definition.</p>
<p>Encoded in Base32, 256 bytes becomes:</p>
<pre class="language-text"><code class="language-text">ceil(256 * 8 / 5) = 410 characters</code></pre>
<p>For just the signature. Add even a tiny 8-byte payload and you are at <strong>422
characters</strong>, formatted into 84 groups of 5. No human will type that. No
support agent will read it over the phone. No reseller will fit it on a
postcard.</p>
<p>You can shave a little off with truncated hashes (which weaken the scheme) or
deterministic ECDSA-on-RSA hybrids (which do not exist). The fundamental
issue is the modulus size, and it is not negotiable for security reasons.</p>
<p>This is why the few products that try to use RSA for licensing fall back to
<strong>license files</strong> instead of license keys — a binary blob you double-click,
or a multi-line Base64 dump you paste into a textbox. License files solve the
size problem, but they introduce their own usability disasters: you cannot
read them over the phone for activation; resellers cannot include them on a
sticker or printed certificate; &quot;I lost my license file&quot; becomes a daily
support ticket; and refunds spike.</p>
<h2>ECC: equivalent strength, a fraction of the bytes</h2>
<p>Elliptic-curve cryptography produces digital signatures that are
cryptographically equivalent to much larger RSA signatures. The widely-cited
<a href="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf">NIST equivalence table</a>:</p>
<table>
<thead>
<tr>
<th>Symmetric strength</th>
<th>RSA modulus</th>
<th>ECC field size</th>
</tr>
</thead>
<tbody>
<tr>
<td>80 bits</td>
<td>1024 bits</td>
<td>160 bits</td>
</tr>
<tr>
<td>112 bits</td>
<td>2048 bits</td>
<td>224 bits</td>
</tr>
<tr>
<td>128 bits</td>
<td>3072 bits</td>
<td>256 bits</td>
</tr>
<tr>
<td>192 bits</td>
<td>7680 bits</td>
<td>384 bits</td>
</tr>
</tbody>
</table>
<p>Read the third row carefully: a <strong>256-bit ECC key</strong> gives the same security
as a <strong>3072-bit RSA key</strong> — 12× smaller, with the security level current
guidance recommends for newly-deployed cryptography.</p>
<p>For signature size, the typical Schnorr-family ECC signature is roughly
<strong><code>2 × field_size</code></strong> bits. A 160-bit curve produces a ~40-byte signature.
That is <strong>64 Base32 characters</strong>. Drop in a small payload, format into groups
of 5, and you are looking at a 25-30 character key — exactly what users
expect.</p>
<h2>The Schnorr twist that keeps keys distinct</h2>
<p>There is a subtler reason ECC (specifically Schnorr-style signatures over
ECC) wins for licensing — one that is rarely discussed but matters a lot in
practice.</p>
<p>Most signature schemes are deterministic: same input, same key, same
signature. That is a problem for license keys, because two customers who
happen to buy the same product edition on the same day would receive
<strong>identical</strong> keys. To avoid this, deterministic schemes have to either:</p>
<ul>
<li>Add a random salt to the payload (which inflates the data portion), or</li>
<li>Add a customer-specific field like email or order id (which ties the key to
per-customer data and complicates reseller workflows).</li>
</ul>
<p>Schnorr signatures, by contrast, are <strong>non-deterministic by design</strong>: the
signing process picks a random nonce, and there are exponentially many valid
signatures for the same payload under the same private key. Two customers
buying identical SKUs get different keys, <em>and</em> the data portion stays
minimal.</p>
<p>This single property is the reason a SoftActivate-style key can carry only
a few bytes of payload (edition + flags) and still be unique per customer.</p>
<h2>The patent landscape (briefly)</h2>
<p>ECC has a famously thorny patent history. Most of it is now expired or never
applied to the variants used in licensing. The combination this SDK uses —
<strong>ECC over GF(2^n) with a polynomial basis representation</strong>, signed with
<strong>Schnorr</strong> (whose key patent expired in 2008) — is unencumbered by
<a href="https://en.wikipedia.org/wiki/Certicom">Certicom</a>'s historical claims.</p>
<p>Curves over prime fields (the kind used by ECDSA, EdDSA, secp256k1) are
similarly free of active patents at this point. If you are evaluating
licensing libraries, &quot;uses ECC&quot; is no longer a red flag the way it was in
the early 2000s.</p>
<h2>A worked example</h2>
<p>Here is what a real ECC-signed license key looks like, broken down:</p>
<pre class="language-text"><code class="language-text">KEY:  M9Y2P-K3HFQ-X7TBR-NCAS4-VGW8E-J5DUZ
            └─ 30 chars × 5 bits = 150 bits total
            ├─ 10 bits payload (edition, flags)
            └─ 140 bits Schnorr signature over GF(2^160)</code></pre>
<p>The customer types 30 characters. The product runs ~5 ms of ECC verification
on first launch, caches the result, and never bothers them again.
Cryptographically, an attacker would need to forge a Schnorr signature
over GF(2^160) without the private key — currently estimated at ~2^80
operations, which is computationally infeasible. The product binary contains
only the <strong>public</strong> verification key. Even a perfect reverse-engineering of
the binary yields no ability to mint new keys.</p>
<p>That is the entire point of using public-key cryptography for licensing.</p>
<h2>Bottom line</h2>
<table>
<thead>
<tr>
<th>Property</th>
<th>RSA-2048</th>
<th>ECC + Schnorr (160-bit)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Equivalent symmetric strength</td>
<td>112 bits</td>
<td>80 bits</td>
</tr>
<tr>
<td>Signature size</td>
<td>256 bytes</td>
<td>~20 bytes</td>
</tr>
<tr>
<td>Key length in Base32</td>
<td>410+ chars</td>
<td>25-30 chars</td>
</tr>
<tr>
<td>Distinct keys for same SKU</td>
<td>requires salt</td>
<td>free (Schnorr nonce)</td>
</tr>
<tr>
<td>Suitable for typeable keys</td>
<td><strong>No</strong></td>
<td><strong>Yes</strong></td>
</tr>
<tr>
<td>Suitable for license files</td>
<td>Yes (clunky UX)</td>
<td>Yes (overkill)</td>
</tr>
</tbody>
</table>
<p>If you want <strong>typeable, secure, per-customer-distinct license keys</strong>, ECC
with a Schnorr-family signature scheme is not just a good choice — it is
effectively the only viable choice. RSA is fine if you are willing to live
with license files; for everyone else, ECC wins on every axis that matters.</p>
<p>For the full design context — hardware fingerprinting, activation servers,
expiring licenses — see the pillar guide:
<a href="/licensekeygeneration">How To Generate License Keys Securely</a>.</p>
<p>The SoftActivate Licensing SDK ships an ECC-over-GF(2^n) + Schnorr
implementation with full <a href="/licensingsdk-cpp">C++</a> and
<a href="/licensingsdk-csharp">C#/.NET</a> source code, so you can read every line of
the verification routine that ends up inside your shipped binary — which is,
incidentally, exactly the level of transparency you want from anything
guarding your revenue.</p>
]]></content:encoded>
        </item>
    </channel>
</rss>
