Matrix CR Studio

Quantum threat assessment

What breaks, and what to fix first.

We find the cryptography that quantum computers will break, rank it by how long your data must stay secret, and give you a migration plan, with a signed record of how the inventory and the plan were produced.

Every assessment runs only against systems you authorize in writing. We scope to systems, never to individuals, and nothing is scanned before the engagement is signed.

Book an assessmentSee a sample deliverable

A financial entity in the EU? How each part maps to DORA’s technical standard · Also: healthcare in Latin America, software sold to banks in Brazil

What you receive

Four parts, each one sealed.

01SEALED

An inventory of your cryptography

An automated scan of the code and dependency manifests you give us access to. Every finding records the file and line where it was seen. Systems we cannot scan are listed from what you tell us, and marked as such.

02SEALED

An exposure ranking

Every asset tested with one inequality, X plus Y against Z: how long its data must stay secret, plus how long its migration takes, against the horizon you plan for. You supply X and Y where you know them; where we assumed, the assumption is sealed with the ranking.

03SEALED

A migration plan

The replacement for each asset: a NIST post-quantum standard for public-key cryptography, a stronger classical algorithm where that is the fix, and a question back to you where the scan cannot tell how a key is used. Ordered phases, with a way back at each one. Nothing is marked done until it is.

04SEALED

The evidence file

The inventory, the ranking and the plan as linked, signed receipts in one file, together with each of them and the inputs they were built from. Your auditor checks it with our free checker, offline, without asking us.

Sealed means the step is written into a signed receipt linked to the one before it, so any later edit to that step shows, and each step must have been built from the same inventory. How the receipts work · The free checker

The parts, on a real project

Our assessment of paramiko 5.0.0, an open-source SSH library, not a client. Click through the inventory and the plan, check the evidence file in your browser, then hide a finding and watch the check fail.

Findings111in 41 files
Must move77by the published rule
Weak classically43DES and MD5 and SHA1; depends on the use
Plan steps13in a safe order

Every use of cryptography our scanner found in the source (41files read), including algorithms the code offers by name, each with its file and line. A scan of source has gaps: it can miss dependencies, compiled code and choices made at runtime. Each finding is ranked by one published rule (Mosca's): if what it protects must stay secret for X = 12 years, and moving off it takes Y = 3 years, then X + Y = 15 years is longer than the Z = 10-year horizon we plan against, so it has to move now. Change those numbers and the ranking changes; they are sealed in the record.

AlgorithmWhereRankingWhy
3DEStransport.py:263Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
3DEStransport.py:182Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
MD5pkey.py:390Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
SHA1config.py:449Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
DHtransport.py:324Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_group16.py:35Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_group16.py:30Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_group14.py:45Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:325Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:219Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:218Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:220Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_gex.py:51Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:326Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECecdsakey.py:167Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:113Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:254Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:224Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:268Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:305Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:151Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:67Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:242Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:71Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:145Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:117Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:23Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:59Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECDHkex_ecdh_nist.py:143Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:327Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHkex_ecdh_nist.py:21Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:329Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:216Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:215Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:328Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHkex_ecdh_nist.py:149Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:217Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDSAtransport.py:201Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:208Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:313Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:199Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:210Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:315Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:317Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:200Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:209Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519transport.py:198Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519transport.py:207Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519ed25519key.py:42Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519transport.py:319Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSArsakey.py:43Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSArsakey.py:211Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAagent.py:53Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:210Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:791Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:203Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:431Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:41Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:1317Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAagent.py:54Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:1318Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:78Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:211Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:790Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:432Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:433Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:311Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:212Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:45Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:309Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:434Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:202Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:430Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:184Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSArsakey.py:89Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
X25519transport.py:223Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:109Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:45Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:30Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519transport.py:332Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:71Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
AEStransport.py:177Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:251Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:178Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:179Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:227Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:257Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AESpkey.py:727Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AESpkey.py:691Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:233Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:176Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:239Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AESpkey.py:693Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:181Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:245Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:180Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:188Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:192Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:287Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACpacket.py:47Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:292Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:194Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:191Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:288Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:290Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:293Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:286Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:193Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMAChostkeys.py:300Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:187Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
SHA256pkey.py:401Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.

The one test

X plus Y against Z.

Michele Mosca’s inequality, as NIST IR 8547 presents it: if the years your data must stay secret (X) plus the years your migration takes (Y) add up to more than the years until a quantum computer can break the cryptography (Z), that data is already exposed.

X · SHELF LIFE

How long the data must stay secret. Your retention policy decides it.

Y · MIGRATION TIME

How long replacing the cryptography on that system takes. Your engineers estimate it; we check it against the inventory.

Z · HORIZON

Nobody knows it. An expert survey puts the chance at 28 to 49% within ten years, so we plan against ten by default and you can choose another.

Probability bands from the Global Risk Institute Quantum Threat Timeline Report 2025 (Mosca and Piani, published March 2026, 26 experts surveyed). Deadlines from US Executive Order 14412, the EU Coordinated Implementation Roadmap, and NIST IR 8547, which is still a draft. Each binds different organizations.

No retention policy? Start from our assumption for a sector:
HIGH

X plus Y exceeds Z by 3 years, with little slack. Anything copied today can be read once the capability exists.

Bar: solid is X, faint is Y, the gold line is Z. Nothing you enter leaves this page.

The full exposure tool, for a list of assets

Exposure tiers

Every exposed asset gets one of four answers.

The same rules as the free exposure tool, so you can recompute any tier we give you. An asset already on a NIST post-quantum standard is marked MIGRATED instead.

CRITICAL

X plus Y exceeds Z by five years or more

Data copied today is still valuable when the capability is expected to exist. Migrate first.

HIGH

X plus Y exceeds Z by less than five years

Exposed, with little slack.

MONITOR

X plus Y within three years of Z, or a 128-bit symmetric key

Not exposed on these values, but a longer retention or a slower migration would flip it.

SAFE

Comfortably inside Z, or strong symmetric cryptography

Not a migration target on the values given.

Our starting assumptions

If you have no retention policy, we start here.

These shelf lives are our planning assumptions, not legal requirements. Your own retention policy replaces them, and the report says which values were yours and which were ours.

Defense

35 yrs

Classified programs, communications security

Insurance

30 yrs

Long-tail claims and reserves

Healthcare

30 yrs

Medical records over a patient lifetime

Banking

25 yrs

Customer and transaction records

Pharma

25 yrs

Compound IP and clinical data

Government

25 yrs

Records under classification holds

Energy

20 yrs

Grid topology and safety systems

Legal

20 yrs

Privileged communications and litigation

Telecom

15 yrs

Subscriber data and signaling

Manufacturing

15 yrs

Trade secrets and designs

Technology

10 yrs

Product roadmaps and source code

Frameworks we map to

The documents your auditor will cite.

The plan references the framework each recommendation answers to. Each link goes to the issuing authority’s own page.

NSA · USCNSA 2.0
CISA · USQuantum-Readiness
OMB · USM-23-02
NIST · USIR 8547
NIST · USSP 800-227
ENISA · EUPQC Guidance
DORA · EUArticle 6 · ICT Risk
ETSI · EUQuantum-Safe Crypto
SWIFT · GlobalCSP / CSCF
BSI · DEMigration to PQC

Timing

Our target is 72 hours from access.

From receiving access to the code in scope to delivering the four parts above. The first engagements will show whether that target holds, and we will say so either way. Scope and terms are agreed in conversation before anything starts.

Book an assessmentSee a sample deliverable