Hubbry Logo
Probabilistic signature schemeProbabilistic signature schemeMain
Open search
Probabilistic signature scheme
Community hub
Probabilistic signature scheme
logo
7 pages, 0 posts
0 subscribers
Be the first to start a discussion here.
Be the first to start a discussion here.
Probabilistic signature scheme
Probabilistic signature scheme
from Wikipedia

Probabilistic Signature Scheme (PSS) is a cryptographic signature scheme designed by Mihir Bellare and Phillip Rogaway.[1]

RSA-PSS is an adaptation of their work and is standardized as part of PKCS#1 v2.1. In general, RSA-PSS should be used as a replacement for RSA-PKCS#1 v1.5.

Design

[edit]

PSS was specifically developed to allow modern methods of security analysis to prove that its security directly relates to that of the RSA problem. There is no such proof for the traditional PKCS#1 v1.5 scheme.

Implementations

[edit]

References

[edit]
[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
A probabilistic signature scheme (PSS) is a type of in that incorporates randomness—typically via a salt value and hash functions—during the signing process to produce variable signatures for the same message, thereby enhancing security against certain attacks and providing provable guarantees under the model. Introduced by Mihir Bellare and Phillip Rogaway at EUROCRYPT 1996, PSS is designed as an efficient encoding method for signatures based on permutations like RSA or , where signing involves one invocation of the underlying primitive plus hashing, and verification mirrors this with comparable efficiency. The scheme's core innovation lies in its EMSA-PSS (Encoding Method for Signatures using PSS) padding, which randomizes the encoded message to ensure that forging a valid signature is as hard as inverting the RSA function, assuming ideal hash functions. The most widely adopted variant is RSASSA-PSS (RSA Signature Scheme with Appendix - Probabilistic Signature Scheme), standardized in version 2.1 by RSA Laboratories and detailed in RFC 3447. This scheme combines RSA encryption and decryption primitives (RSASP1 and RSAVP1) with the probabilistic EMSA-PSS encoding, supporting flexible parameters such as hash algorithms (e.g., SHA-256), mask generation functions (e.g., MGF1), and salt lengths to balance security and performance. Unlike deterministic RSA signatures like RSASSA-PKCS1-v1_5, which lack formal proofs and are vulnerable to padding oracle attacks, RSASSA-PSS offers a tighter security reduction, making it resistant to existential forgery under chosen-message attacks when used with appropriately strong primitives. It is recommended for new applications by standards bodies like NIST and is integrated into protocols such as TLS 1.3 (where it is mandatory for RSA signatures) and CMS for secure digital signing. PSS and its RSA instantiation have become foundational in modern due to their balance of efficiency and provable security, though they remain vulnerable to advances in that could break RSA. Ongoing research focuses on implementations in the wild, revealing occasional misconfigurations but affirming the scheme's robustness when parameters are correctly chosen.

Overview

Definition and Motivation

A probabilistic signature scheme is a type of that incorporates into the signing process, typically via random salts or nonces, to generate distinct signatures for identical messages, thereby bolstering resistance to specific cryptographic attacks. Unlike deterministic schemes, this probabilistic element ensures that the output varies with each signing operation, even for the same input, while maintaining verifiability. At its core, such a scheme comprises three s: to produce public and private key pairs, a probabilistic signing that uses to compute the signature, and a deterministic verification to check signature validity. The primary motivation for probabilistic signature schemes arose from the limitations of earlier deterministic RSA-based signatures, such as those in v1.5, which employ fixed and lack tight provable security guarantees under standard assumptions like the hardness of the . These deterministic methods have been analyzed for potential vulnerabilities in adaptive chosen-message scenarios, though practical forgery remains infeasible under standard assumptions. By introducing , probabilistic schemes render signatures non-malleable, thwarting such attacks and providing security reductions that are asymptotically tight to the underlying , often RSA. In contrast to deterministic schemes, where signing the same message invariably yields the identical signature—potentially exposing risks like replay attacks or easier in multi-user environments—probabilistic approaches mitigate these issues by ensuring signature uniqueness per signing instance. This design not only enhances overall robustness but also aligns with modern standards recommending probabilistic methods for critical applications.

Historical Development

The probabilistic signature scheme (PSS) was introduced by Mihir Bellare and Phillip Rogaway in their 1996 EUROCRYPT paper, "The Exact Security of Digital Signatures: How to Sign with RSA and ," as a response to vulnerabilities in earlier RSA-based signature schemes and to provide provable security in the model. This work built on their prior development of (OAEP) from 1994, adapting similar probabilistic padding techniques to signatures to achieve tight security bounds against existential forgery under chosen-message attacks. PSS was formalized as RSASSA-PSS in PKCS #1 version 2.0, released by RSA Laboratories in 1998, which integrated it into standardized RSA cryptography specifications alongside OAEP for encryption. By the early 2000s, IETF efforts advanced its adoption, with PKCS #1 version 2.1 published as RFC 3447 in 2003, refining parameters and aligning with emerging standards. Further evolution included its specification for use in the (CMS) via RFC 4056 in 2005, enabling broader deployment in secure email and document signing protocols. PKCS #1 version 2.2, issued in 2016, incorporated errata and updated supported hash functions (e.g., adding SHA-2 variants) to address implementation inconsistencies and enhance compatibility with FIPS standards. Key milestones include the 1996 proposal establishing provable security foundations, early IETF solidifying its role in protocols, and the 2020s shift toward —yet PSS remains the dominant scheme for RSA-based signatures in legacy and hybrid systems.

Technical Description

Core Components

Probabilistic signature schemes, such as the Probabilistic Signature Scheme (PSS), fundamentally rely on a permutation as their core cryptographic primitive, most commonly the RSA function, which is based on using a exponent ee and a large composite modulus n=pqn = pq where pp and qq are large primes. This structure allows efficient computation in one direction ( or signing with the key) while assuming the computational hardness of inverting the function without the private key, providing the foundational security assumption for the scheme. Additionally, the scheme incorporates cryptographic hash functions, such as SHA-256, to digest input messages and generate masks, ensuring and one-way properties essential for secure encoding. Key parameters in a probabilistic signature scheme include the RSA key pair: a public key consisting of the modulus nn and exponent ee, and a private key dd such that ed1(modϕ(n))ed \equiv 1 \pmod{\phi(n)}, where ϕ\phi is . The scheme also specifies a salt of length sLensLen, a parameter typically equal to the hash output length hLenhLen (e.g., 20 bytes for , 32 bytes for SHA-256) to achieve optimal security as recommended in the standard, which introduces randomness during signing. Furthermore, it employs families HH for general hashing (e.g., producing message digests) and GG for mask generation, often implemented as the Mask Generation Function 1 (MGF1) derived from HH, allowing flexibility while maintaining provable security properties. In message encoding, the input message mm is first hashed using HH to produce a fixed-length digest, which is then probabilistically padded by incorporating the salt and additional before applying the , ensuring that signatures for the same vary to thwart certain attacks. The scheme's hinges on the presumed difficulty of inverting the RSA under chosen-ciphertext attacks, a hardness assumption formalized in the original PSS design. In the standardized RSASSA-PSS variant, the scheme operates as a "signature with appendix," requiring the verifier to process both the and the full original during validation, rather than recovering the from the alone.

Signing and Verification Algorithms

In probabilistic signature schemes such as RSASSA-PSS, key generation follows the standard RSA procedure. Two large distinct primes pp and qq are selected such that n=pqn = p \cdot q, where nn is the modulus. A public exponent ee is chosen such that 1<e<ϕ(n)1 < e < \phi(n) and gcd(e,ϕ(n))=1\gcd(e, \phi(n)) = 1, with ϕ(n)=(p1)(q1)\phi(n) = (p-1)(q-1). The private exponent dd is then computed as de1(modϕ(n))d \equiv e^{-1} \pmod{\phi(n)}. The public key consists of (n,e)(n, e), while the private key is (n,d)(n, d) or an equivalent representation such as (p,q,dp,dq,qInv)(p, q, d_p, d_q, q_{\text{Inv}}) for efficiency, where dp=dmod(p1)d_p = d \mod (p-1), dq=dmod(q1)d_q = d \mod (q-1), and qInvq1(modp)q_{\text{Inv}} \equiv q^{-1} \pmod{p}. The signing algorithm, RSASSA-PSS-SIGN, takes as input a message MM (an octet string), the private key KK, a hash function HashHash with output length hLenhLen octets, a mask generation function MGFMGF, and a salt length sLensLen. First, the message MM is hashed to produce mHash=Hash(M)mHash = Hash(M). A random salt of length sLensLen octets is generated. An auxiliary string M=08mHashsaltM' = 0^{8} || mHash || salt is formed, where 080^{8} denotes eight zero octets, and then H=Hash(M)H = Hash(M') is computed. The padding string DBDB is constructed as a string of emLensLenhLen2emLen - sLen - hLen - 2 zero octets followed by the octet 0x010x01 and then the salt, where emLen=emBits/8emLen = \lceil emBits / 8 \rceil and emBitsemBits is the bit length of nn minus 1. A mask dbMask=MGF(H,emLenhLen1)dbMask = MGF(H, emLen - hLen - 1) is generated, and the masked data block is maskedDB=DBdbMaskmaskedDB = DB \oplus dbMask. The leftmost 8emLenemBits8emLen - emBits bits of maskedDBmaskedDB are set to zero. The encoded message is then EM=maskedDBH0xBCEM = maskedDB || H || 0xBC. This EMEM is converted to an integer m=OS2IP(EM)m = OS2IP(EM), and the signature is computed as s=RSASP1(K,m)s = RSASP1(K, m), where RSASP1 performs the RSA computation using the private key (typically mdmodnm^d \mod n or using the Chinese Remainder Theorem for efficiency). Finally, the signature S=I2OSP(s,k)S = I2OSP(s, k) is output, where kk is the octet length of nn. If the message is too long or encoding fails, an error is returned. For pseudocode representation, the core signing process can be outlined as follows:

RSASSA-PSS-SIGN(K, M, Hash, MGF, sLen): mHash = Hash(M) if bit length of M > emBits - 8hLen - 8sLen - 9: return "message too long" salt = random octet string of length sLen M' = 0^8 || mHash || salt H = Hash(M') DB = 0^(emLen - sLen - hLen - 2) || 0x01 || salt dbMask = MGF(H, emLen - hLen - 1) maskedDB = DB XOR dbMask set leftmost 8emLen - emBits bits of maskedDB to 0 EM = maskedDB || H || 0xBC m = OS2IP(EM) s = RSASP1(K, m) S = I2OSP(s, k) return S

RSASSA-PSS-SIGN(K, M, Hash, MGF, sLen): mHash = Hash(M) if bit length of M > emBits - 8hLen - 8sLen - 9: return "message too long" salt = random octet string of length sLen M' = 0^8 || mHash || salt H = Hash(M') DB = 0^(emLen - sLen - hLen - 2) || 0x01 || salt dbMask = MGF(H, emLen - hLen - 1) maskedDB = DB XOR dbMask set leftmost 8emLen - emBits bits of maskedDB to 0 EM = maskedDB || H || 0xBC m = OS2IP(EM) s = RSASP1(K, m) S = I2OSP(s, k) return S

This process incorporates probabilistic elements through the random salt and ensures the encoded fits within the modulus size. The verification , RSASSA-PSS-VERIFY, takes as input the public key (n,e)(n, e), MM, signature SS of length kk octets, and the same parameters HashHash, MGFMGF, and sLensLen. First, if the length of SS is not kk, it outputs "invalid signature". The signature is converted to an s=OS2IP(S)s = OS2IP(S), and the encoded is recovered as m=RSAVP1((n,e),s)m = RSAVP1((n, e), s), which computes m=semodnm = s^e \mod n. Then, EM=I2OSP(m,emLen)EM = I2OSP(m, emLen). The verification checks the structure and consistency of EMEM against MM. Specifically, mHash=Hash(M)mHash = Hash(M) is computed. If emLen<hLen+sLen+2emLen < hLen + sLen + 2 or the rightmost octet of EMEM is not 0xBC0xBC, it outputs "invalid signature". EMEM is split into maskedDBmaskedDB (first emLenhLen1emLen - hLen - 1 octets) and HH (next hLenhLen octets). If the leftmost 8emLenemBits8emLen - emBits bits of maskedDBmaskedDB are not all zero, it outputs "invalid signature". The mask is recomputed as dbMask=MGF(H,emLenhLen1)dbMask = MGF(H, emLen - hLen - 1), and DB=maskedDBdbMaskDB = maskedDB \oplus dbMask. The leftmost 8emLenemBits8emLen - emBits bits of DBDB are set to zero. If the leftmost emLensLenhLen2emLen - sLen - hLen - 2 octets of DBDB are not all zero or the octet at position emLensLenhLen1emLen - sLen - hLen - 1 is not 0x010x01, it outputs "invalid signature". The salt is extracted as the last sLensLen octets of DBDB. Then, M=08mHashsaltM' = 0^8 || mHash || salt and H=Hash(M)H' = Hash(M') are computed. If H=HH = H', the signature is valid; otherwise, invalid. The structure, including the probabilistic salt and masking, is verified here but detailed separately. For pseudocode representation, the core verification process is:

RSASSA-PSS-VERIFY((n, e), M, S, Hash, MGF, sLen): if length of S ≠ k: return "invalid signature" s = OS2IP(S) m = RSAVP1((n, e), s) EM = I2OSP(m, emLen) mHash = Hash(M) if emLen < hLen + sLen + 2 or EM[emLen] ≠ 0xBC: return "invalid signature" maskedDB = EM[1..emLen - hLen - 1] H = EM[emLen - hLen .. emLen - 1] if leftmost 8emLen - emBits bits of maskedDB ≠ 0: return "invalid signature" dbMask = MGF(H, emLen - hLen - 1) DB = maskedDB XOR dbMask set leftmost 8emLen - emBits bits of DB to 0 if DB[1 .. emLen - sLen - hLen - 2] ≠ all zeros or DB[emLen - sLen - hLen - 1] ≠ 0x01: return "invalid signature" salt = DB[emLen - sLen - hLen .. emLen - hLen - 1] M' = 0^8 || mHash || salt H' = Hash(M') if H' = H: return "valid signature" else: return "invalid signature"

RSASSA-PSS-VERIFY((n, e), M, S, Hash, MGF, sLen): if length of S ≠ k: return "invalid signature" s = OS2IP(S) m = RSAVP1((n, e), s) EM = I2OSP(m, emLen) mHash = Hash(M) if emLen < hLen + sLen + 2 or EM[emLen] ≠ 0xBC: return "invalid signature" maskedDB = EM[1..emLen - hLen - 1] H = EM[emLen - hLen .. emLen - 1] if leftmost 8emLen - emBits bits of maskedDB ≠ 0: return "invalid signature" dbMask = MGF(H, emLen - hLen - 1) DB = maskedDB XOR dbMask set leftmost 8emLen - emBits bits of DB to 0 if DB[1 .. emLen - sLen - hLen - 2] ≠ all zeros or DB[emLen - sLen - hLen - 1] ≠ 0x01: return "invalid signature" salt = DB[emLen - sLen - hLen .. emLen - hLen - 1] M' = 0^8 || mHash || salt H' = Hash(M') if H' = H: return "valid signature" else: return "invalid signature"

This algorithm ensures that only signatures generated with the corresponding private key and matching the are accepted, leveraging the probabilistic for .

Padding Mechanism

The mechanism in the Probabilistic Signature Scheme (PSS) employs a randomized encoding process, known as EMSA-PSS, to prepare the for RSA signing while incorporating to thwart existential forgery attacks under chosen- scenarios. This mechanism produces an encoded EM of fixed length emLen octets, where emLen equals the octet length of the RSA modulus n (typically emLen = \lceil k / 8 \rceil, with k denoting the bit length of n). The structure ensures the padded output is indistinguishable from random, leveraging a and a mask generation function (MGF) for . The construction begins with computing mHash = Hash(m), where Hash is a producing hLen octets of output. A random salt, an octet string of length sLen, is generated; sLen ranges typically from 0 to hLen, but hLen is recommended to achieve the tightest security bounds in the proof. The value M' is formed as the of eight zero octets || mHash || salt, and H = Hash(M') is computed. The data block DB follows as PS || 0x01 || salt, where PS consists of emLen - sLen - hLen - 2 zero octets. A mask dbMask = MGF(H, emLen - hLen - 1) is then derived using the MGF (e.g., MGF1, an iterated hash-based function), and maskedDB = DB \oplus dbMask is calculated, with the leftmost bits of maskedDB padded to zero if emLen does not divide evenly by the requirement. Finally, the encoded message is EM=maskedDB  H  0xbc\text{EM} = \text{maskedDB} \ || \ H \ || \ 0\text{xbc} where 0xbc serves as a fixed trailer octet (the DER encoding of the value 188, signaling the end of the structure). This yields EM of exactly emLen octets. The salt introduces essential randomness, ensuring distinct signatures for identical messages and randomizing the input to the final hash H, which enhances resistance to adaptive attacks. The MGF generates a pseudorandom mask via iterative hashing (e.g., applying Hash repeatedly with counter suffixes), XORing it across the DB to obscure the positions of the fixed 0x01, salt, and PS, thereby distributing randomness throughout most of EM while preserving verifiability via the unmasked H and trailer. This design, formalized in PKCS#1 standards, originates from the provably secure PSS encoding by Bellare and Rogaway, adapted for practical deployment with explicit padding parameters.

Security Properties

Provable Security Model

The security of the probabilistic signature scheme (PSS) is formally analyzed within the , where hash functions such as HH and the mask generation function (MGF) are idealized as mapping inputs to uniformly random outputs. This model facilitates provable security guarantees by simulating ideal hash behavior, avoiding reliance on specific hash function properties. The core security goal for PSS is existential unforgeability under chosen-message attack (EUF-CMA), which requires that no efficient adversary, given access to a signing for adaptively chosen messages, can produce a valid signature on a fresh message. The foundational security proof for PSS employs a reduction from the EUF-CMA security of the scheme to the hardness of the RSA inversion problem, as established by Bellare and Rogaway. Specifically, any adversary A\mathcal{A} that forges a PSS signature with non-negligible probability ε\varepsilon can be transformed into an algorithm that inverts an RSA challenge (i.e., given ee-th power residue y=xemodNy = x^e \mod N, computes xx) with probability εε\varepsilon' \approx \varepsilon, up to negligible terms. This reduction is tight, incurring only constant overhead in success probability and polynomial loss in running time, unlike looser reductions in prior schemes like full-domain hash (FDH). The forgery probability is further bounded as εε+3(qsig+qhash)2(2k0+2k1)\varepsilon \leq \varepsilon' + 3(q_{\text{sig}} + q_{\text{hash}})^2 (2^{-k_0} + 2^{-k_1}), where qsigq_{\text{sig}} and qhashq_{\text{hash}} are the numbers of signing and hash queries, and k0k_0, k1k_1 are output lengths related to the salt and hash; with salt length l=k02λl = k_0 \geq 2\lambda for security parameter λ\lambda, the term 2l2^{-l} ensures the additional probability is negligible. A key theorem states that if RSA is secure against efficient inversion (no polynomial-time algorithm succeeds with non-negligible probability), then PSS is EUF-CMA-secure in the ROM, with the reduction preserving tightness via constant factors in the security loss. The original proof by Bellare and Rogaway relies on random oracles for HH (mapping to fixed-length outputs) and MGF (derived from another oracle gg). Later refinements, such as those by Coron in 2002, optimize the proof to achieve equivalent security with a shorter salt of length log2qsig\log_2 q_{\text{sig}}, maintaining the tight reduction in the ROM; efforts to extend proofs to the , including early analyses around 2000, yield only loose bounds with exponential security loss, reinforcing PSS's practical reliance on the ROM.

Advantages Over Deterministic Schemes

Probabilistic signature schemes, such as RSA-PSS, incorporate through mechanisms like salts and , which provide significant advantages over deterministic schemes like RSA-PKCS#1 v1.5 by mitigating vulnerabilities that exploit predictable padding and outputs. In particular, the thwarts multi-collision attacks that rely on the fixed structure of deterministic paddings; for instance, Bleichenbacher's 1998 on PKCS#1 v1.5 padding exploited oracle responses to recover plaintexts by iteratively refining invalid ciphertexts, a analogous to forgeries in deterministic settings where partial information leaks. Deterministic signatures are susceptible to chosen-message forgeries when partial signature information is compromised, as attackers can exploit the invariance to craft valid signatures for related messages; PSS counters this by using a random salt to generate unique, varying outputs for the same , ensuring that even with leaked partial , forgeries remain computationally infeasible under the EUF-CMA model. Compared to RSA-PKCS#1 v1.5, which lacks provable security and admits known forgeries—such as those on low-exponent RSA with related messages demonstrated by et al.—PSS offers tight provable security in the model, albeit with slightly longer signatures due to the additional random bits (typically 8-32 bytes for the salt). In practice, PSS reduces signature malleability, where an attacker might modify a valid deterministic to produce another valid one without the private key, making it particularly suitable for applications like blind signing that require non-revealing message processing without compromising .

Implementations and Applications

Standardization and Protocols

Probabilistic signature schemes, exemplified by RSASSA-PSS, were first formally defined in version 2.1 by RSA Laboratories in 2002, with subsequent revisions incorporating refinements to the scheme's structure and parameters. This standard established RSASSA-PSS as a randomized alternative to deterministic methods, emphasizing its role in enhancing through probabilistic encoding. The (IETF) further standardized RSASSA-PSS for integration into broader cryptographic frameworks, notably in RFC 4056 published in 2005, which specifies its use within the (CMS) and Public-Key Infrastructure (PKIX) environments. Building on this, RFC 8017 in 2016 updated to version 2.2, providing clearer definitions for PSS parameters such as the mask generation function and salt length to ensure consistent implementation across systems. In protocol integrations, RSASSA-PSS plays a key role in secure communications. The (TLS) Protocol version 1.3, as defined in RFC 8446, mandates RSASSA-PSS for RSA-based server in the CertificateVerify message, requiring schemes like rsa_pss_rsae_sha256 for verifying . Similarly, the Syntax and Processing (XMLDSig) specification supports RSASSA-PSS as an optional RSA signature algorithm, identified by the URI http://www.w3.org/2007/05/xmldsig-more#rsa-pss, for signing XML documents in web services and data interchange. For email security, version 4.0 incorporates RSASSA-PSS via CMS in RFC 8551, recommending its use with SHA-256 for signing messages to provide authenticity and . Additionally, FIPS 186-4 from NIST in 2013 approves RSASSA-PSS as a required mode for RSA digital signatures in federal systems, ensuring compliance with approved ; this was updated in FIPS 186-5 (2023) to integrate PSS with post-quantum signature schemes like . Parameter recommendations in these standards emphasize robustness: the hash function H must be from a secure family such as (e.g., SHA-256), the salt length should match the hash output length (typically 32 octets for SHA-256), and the encoded message length emLen must equal the RSA modulus size in octets. Both RSASSA-PSS and RSASSA-PKCS1-v1.5 are approved for cryptographic module validations under FIPS 140-3. RSASSA-PSS thus serves as the primary instantiation of probabilistic signature schemes across these formal standards.

Practical Implementations

Probabilistic signature schemes, particularly RSASSA-PSS, are implemented in several widely used cryptographic libraries to facilitate secure digital signing and verification. provides support for RSASSA-PSS through its EVP interface, including functions such as EVP_PKEY_sign and EVP_PKEY_verify with PSS padding, introduced in version 1.0.1. Bouncy Castle, a cryptography library, offers the PSSSigner class for generating and verifying RSASSA-PSS signatures, integrating mask generation functions like MGF1. In Python, PyCryptodome implements RSASSA-PSS via the PKCS1_PSS module, which supports customizable hash algorithms and defaults to MGF1 for the mask generation step. Deploying RSASSA-PSS requires careful attention to and to maintain security. Current recommendations from NIST specify RSA key sizes of at least 2048 bits for signatures, providing adequate protection against classical attacks until at least 2030. Salt values, which introduce into the , must be generated using a (CSPRNG) to ensure the scheme's probabilistic properties and resistance to forgery. A notable pitfall involves improper handling of the mask generation function (MGF) chaining, which can expose oracles. Practical tools in various languages simplify RSASSA-PSS usage. Go's crypto/rsa package includes the SignPSS function for signing hashed messages with PSS padding, paired with VerifyPSS for validation, making it suitable for server-side applications. In contexts, RSASSA-PSS serves as a fallback for RSA-based signatures in protocols that occasionally require legacy compatibility. As of 2025, RSASSA-PSS is mandated for RSA signatures in TLS 1.3 handshake messages such as CertificateVerify, while certificate chain signatures may still use v1.5 under baselines, though PSS is increasingly preferred. Meanwhile, migrations to quantum-resistant alternatives like are underway in response to NIST's standards, with organizations planning hybrid schemes by 2030 while PSS remains dominant for legacy RSA systems.
Add your contribution
Related Hubs
User Avatar
No comments yet.