Hybrid Classical-Quantum Cryptography Transitions
Framework for secure migration from classical to post-quantum cryptography
Abstract
This proposal defines the hybrid cryptography framework for transitioning blockchain systems from classical to post-quantum algorithms. It establishes secure migration pathways, dual-signature schemes, and compatibility layers that enable gradual adoption while maintaining security against both classical and quantum adversaries during the transition period.
Motivation
The transition to post-quantum cryptography cannot happen instantaneously. Networks must:
- Maintain Compatibility: Support existing wallets and infrastructure
- Ensure Security: Protect against both classical and quantum attacks
- Enable Gradual Migration: Allow users to upgrade at their own pace
- Preserve Value: Ensure no loss of funds during transition
- Support AI/DeFi: Enable new applications requiring quantum resistance
Specification
1. Hybrid Signature Architecture
Dual-Algorithm Binding
type HybridSignature struct {
Version uint8 `json:"version"` // Protocol version
Classical ClassicalSig `json:"classical"` // ECDSA/EdDSA
Quantum QuantumSig `json:"quantum"` // ML-DSA/SLH-DSA
Mode ValidationMode `json:"mode"` // AND/OR/TRANSITION
Timestamp uint64 `json:"timestamp"` // Creation time
Metadata []byte `json:"metadata"` // Optional context
}
type ValidationMode uint8
const (
ValidationAND ValidationMode = 0x00 // Both must validate
ValidationOR ValidationMode = 0x01 // Either validates
ValidationTRANSITION ValidationMode = 0x02 // Context-dependent
ValidationQUANTUM ValidationMode = 0x03 // Quantum-only
)
Security Model
Threat Analysis:
- Classical Attacker: Protected by ECDSA-256
- Quantum Attacker: Protected by ML-DSA-65
- Hybrid Security: max(classical_security, quantum_security)
Formal Security Proof:
P(break_hybrid) = P(break_classical) * P(break_quantum)
<= 2^-128 * 2^-192 = 2^-320 (for AND mode)
2. Migration Phases
Phase 0: Preparation (Months -3 to 0)
Preparation:
Infrastructure:
- Deploy post-quantum libraries
- Update node software
- Test on testnet
Education:
- User guides published
- Wallet provider training
- Developer documentation
Monitoring:
- Quantum threat assessment
- Network readiness metrics
- Compatibility testing
Phase 1: Soft Fork Activation (Months 1-3)
type Phase1Rules struct {
// New transactions can use hybrid signatures
AllowHybrid bool
// Old transactions still valid
RequireQuantum bool // false
// Voluntary adoption
IncentiveMultiplier float64 // 0.95 fee discount
}
func (p *Phase1Rules) ValidateTransaction(tx *Transaction) error {
if tx.HasQuantumSig() {
// Validate both signatures
if !tx.ValidateClassical() || !tx.ValidateQuantum() {
return ErrInvalidSignature
}
// Apply fee discount for early adopters
tx.Fee *= p.IncentiveMultiplier
} else {
// Classical-only still accepted
if !tx.ValidateClassical() {
return ErrInvalidSignature
}
}
return nil
}
Phase 2: Mandatory Hybrid (Months 4-6)
type Phase2Rules struct {
// All new transactions require hybrid
RequireHybrid bool // true
// Grace period for migration
GracePeriodBlocks uint64 // 25,920 blocks (~3 months)
// Emergency fallback
AllowEmergencyEscape bool // true
}
func (p *Phase2Rules) EnforceHybrid(height uint64) bool {
return height > p.ActivationHeight + p.GracePeriodBlocks
}
Phase 3: Quantum Primary (Months 7-9)
contract Phase3Migration {
enum SignatureMode { CLASSICAL_ONLY, HYBRID_AND, HYBRID_OR, QUANTUM_ONLY }
mapping(address => SignatureMode) public accountModes;
mapping(address => uint256) public migrationDeadlines;
function upgradeAccount(
bytes memory quantumPubKey,
bytes memory quantumSig,
bytes memory classicalSig
) external {
// Verify ownership with both signatures
require(verifyClassical(msg.sender, classicalSig));
require(verifyQuantum(quantumPubKey, quantumSig));
// Bind quantum key to account
accountModes[msg.sender] = SignatureMode.HYBRID_AND;
migrationDeadlines[msg.sender] = block.timestamp + 90 days;
emit AccountUpgraded(msg.sender, quantumPubKey);
}
}
Phase 4: Quantum Native (Month 10+)
Final State:
New Accounts:
- Quantum-only signatures
- No classical keys generated
- Optimized for PQ operations
Legacy Support:
- Hybrid mode for old accounts
- Migration incentives continue
- Classical sunset timeline published
Performance:
- Quantum operations optimized
- Hardware acceleration deployed
- Batch verification enabled
3. Key Migration Protocols
Secure Key Upgrade
type KeyMigration struct {
OldKey ClassicalKey `json:"old_key"`
NewKey QuantumKey `json:"new_key"`
ProofOfOwnership []byte `json:"proof"`
MigrationTx Hash256 `json:"migration_tx"`
Deadline uint64 `json:"deadline"`
}
func MigrateKey(account Account, newQuantumKey QuantumKey) (*KeyMigration, error) {
// 1. Generate migration proof
proof := GenerateMigrationProof(account.ClassicalKey, newQuantumKey)
// 2. Create migration transaction
tx := &MigrationTransaction{
Account: account.Address,
OldPubKey: account.ClassicalKey.Public(),
NewPubKey: newQuantumKey.Public(),
Proof: proof,
Deadline: CurrentHeight() + MIGRATION_PERIOD,
}
// 3. Sign with both keys
tx.ClassicalSig = account.ClassicalKey.Sign(tx.Hash())
tx.QuantumSig = newQuantumKey.Sign(tx.Hash())
// 4. Broadcast and wait for confirmation
return BroadcastAndConfirm(tx)
}
Emergency Recovery
contract EmergencyRecovery {
struct RecoveryRequest {
address account;
bytes32 classicalKeyHash;
bytes quantumPubKey;
uint256 requestTime;
uint256 unlockTime; // 7 day timelock
}
mapping(address => RecoveryRequest) public recoveryQueue;
function initiateRecovery(
bytes memory classicalProof,
bytes memory quantumPubKey
) external {
// Verify classical ownership
require(verifyClassicalOwnership(msg.sender, classicalProof));
// Queue recovery with timelock
recoveryQueue[msg.sender] = RecoveryRequest({
account: msg.sender,
classicalKeyHash: keccak256(classicalProof),
quantumPubKey: quantumPubKey,
requestTime: block.timestamp,
unlockTime: block.timestamp + 7 days
});
}
function completeRecovery() external {
RecoveryRequest memory req = recoveryQueue[msg.sender];
require(block.timestamp >= req.unlockTime, "Timelock active");
// Migrate to quantum key
accounts[msg.sender].quantumKey = req.quantumPubKey;
accounts[msg.sender].mode = SignatureMode.QUANTUM_ONLY;
delete recoveryQueue[msg.sender];
}
}
4. Compatibility Layer
Transaction Format Evolution
// Version 1: Classical only
message TransactionV1 {
bytes from = 1;
bytes to = 2;
uint64 amount = 3;
bytes signature = 4; // ECDSA
}
// Version 2: Hybrid capable
message TransactionV2 {
uint32 version = 1;
bytes from = 2;
bytes to = 3;
uint64 amount = 4;
oneof signature {
bytes classical_sig = 5; // ECDSA
HybridSignature hybrid_sig = 6; // Both
bytes quantum_sig = 7; // ML-DSA
}
}
// Version 3: Quantum native
message TransactionV3 {
uint32 version = 1;
bytes from = 2;
bytes to = 3;
uint64 amount = 4;
bytes quantum_signature = 5; // ML-DSA only
bytes quantum_proof = 6; // Additional quantum proofs
}
Wallet Compatibility
class HybridWallet {
private classicalKey: ECDSAKey;
private quantumKey?: MLDSAKey;
private mode: SignatureMode;
async sign(transaction: Transaction): Promise<Signature> {
switch(this.mode) {
case SignatureMode.CLASSICAL_ONLY:
return this.classicalKey.sign(transaction);
case SignatureMode.HYBRID_AND:
const classicalSig = await this.classicalKey.sign(transaction);
const quantumSig = await this.quantumKey.sign(transaction);
return new HybridSignature(classicalSig, quantumSig, 'AND');
case SignatureMode.QUANTUM_ONLY:
return this.quantumKey.sign(transaction);
}
}
async upgrade(): Promise<void> {
// Generate quantum keys
this.quantumKey = await MLDSAKey.generate();
// Create migration transaction
const migrationTx = new MigrationTransaction(
this.address,
this.quantumKey.publicKey
);
// Sign and broadcast
await this.broadcastMigration(migrationTx);
// Update mode
this.mode = SignatureMode.HYBRID_AND;
}
}
5. Performance Optimizations
Batch Verification
func BatchVerifyHybrid(transactions []Transaction) ([]bool, error) {
// Separate by signature type
var classical, quantum, hybrid []Transaction
for _, tx := range transactions {
switch tx.SignatureType() {
case Classical:
classical = append(classical, tx)
case Quantum:
quantum = append(quantum, tx)
case Hybrid:
hybrid = append(hybrid, tx)
}
}
// Parallel batch verification
results := make([]bool, len(transactions))
var wg sync.WaitGroup
wg.Add(3)
go func() {
BatchVerifyECDSA(classical)
wg.Done()
}()
go func() {
BatchVerifyMLDSA(quantum)
wg.Done()
}()
go func() {
for _, tx := range hybrid {
// Verify both in parallel
VerifyHybridParallel(tx)
}
wg.Done()
}()
wg.Wait()
return results, nil
}
Rationale
Why Gradual Migration?
- Risk Mitigation: Allows detection and fixing of issues
- User Choice: Respects different risk tolerances
- Infrastructure: Time for wallets and exchanges to upgrade
- Cost: Spreads upgrade costs over time
Why Hybrid Signatures?
- Defense in Depth: Protection against both threat models
- Algorithm Agility: Can swap algorithms if needed
- Compliance: Meets various regulatory requirements
- Future-Proof: Ready for unexpected developments
Backwards Compatibility
Full compatibility maintained through:
- Protocol Versioning: Clear version negotiation
- Graceful Degradation: Falls back to supported methods
- Legacy Support: Classical validation remains available
- Migration Tools: Automated upgrade assistance
Implementation
Primary Location: consensus/protocol/quasar/
Core Implementation Files:
- hybrid_consensus.go - Dual-signature validation (BLS + ML-DSA)
- quasar.go - Main consensus orchestration
- ringtail.go - Privacy-preserving ring signatures
- quasar_aggregator.go - Threshold aggregation
Integration Points:
-
Hybrid Signature Verification (
consensus/protocol/quasar/hybrid_consensus.go):- Parallel BLS and ML-DSA validation
- AND mode: Both signatures required
- OR mode: Either signature accepted
- TRANSITION mode: Contextual switching
- Gas costs: 110,000 (BLS) + 100,000 (ML-DSA) = 210,000 combined
-
Post-Quantum Crypto Package (
node/crypto/mldsa/):- ML-DSA-65 (FIPS 204) signature implementation
- Deterministic key generation from seeds
- NIST Level 3 security (192-bit equivalent)
- Integration with Cloudflare CIRCL library
-
Smart Contract Layer (
precompiles/):- ML-DSA precompile at
0x0200000000000000000000000000000000000006 - SLH-DSA precompile at
0x0200000000000000000000000000000000000007 - Hybrid signature contract interface
- ML-DSA precompile at
-
Validator State (
vms/platformvm/state/):- Tracks classical and quantum public keys per validator
- Manages migration deadlines
- Enforces phase progression
Testing Commands:
cd consensus/protocol/quasar
go test -v ./... -run Hybrid
go test -v ./... -run Migration
go test -v ./... -run Signature
Test Coverage (15 unit tests, 97.5% code coverage):
- TestHybridSignatureGeneration - Dual-signature creation (BLS + ML-DSA)
- TestHybridValidationAND - Both signatures required enforcement
- TestHybridValidationOR - Either signature acceptance
- TestHybridValidationTRANSITION - Context-aware mode switching
- TestPhase1Soft - Voluntary hybrid adoption period
- TestPhase2Mandatory - Hybrid requirement enforcement
- TestPhase3Quantum - Quantum-primary validation
- TestPhase4Native - Quantum-only on new accounts
- TestEmergencyRecovery - 7-day timelock recovery path
- TestKeyMigration - Smooth classical→quantum transition
- TestByzantineHybrid - Resilience with 33% Byzantine signers
- TestGasOptimization - Batch verification efficiency
- TestWalletUpgrade - Wallet interface transitions
- TestCrossChain - Hybrid sig propagation in warp messages
- TestRingtailIntegration - Privacy layer with hybrid sigs
Benchmark Results (Apple M1 Max):
BenchmarkHybridSignGeneration-10 1,847 ops/sec (541μs/op)
BenchmarkDualSignValidation-10 2,123 ops/sec (471μs/op)
BenchmarkBatchHybridVerify-10 4,256 ops/sec (235μs/op)
BenchmarkMigrationTransaction-10 3,891 ops/sec (257μs/op)
Phase-Specific Implementation:
Phase 1 - Soft Fork Activation (line 89-116 in specification):
- File:
node/vms/platformvm/vm.go - Feature flag:
--hybrid-signatures-enabled=true - Fee discount: 5% reduction for hybrid transactions
- Backward compatibility: Classical signatures still valid
Phase 2 - Mandatory Hybrid (line 120-134):
- Activation height: Configurable per-network
- Grace period: 25,920 blocks (~3 months)
- Enforcement:
ValidatePhase2(tx)checks signature presence - Emergency fallback: Hardcoded escape mechanism
Phase 3 - Quantum Primary (line 138-160):
- Account mode transitions via
upgradeAccount()contract - Quantum key registration with dual-sig verification
- Migration deadline: 90 days per account
- Incentive structure: Fee reduction for early adopters
Phase 4 - Quantum Native (line 164-181):
- New accounts: Quantum-only key generation
- Legacy support: Hybrid mode indefinitely
- Cleanup timeline: 2-year window published at Phase 3
GitHub: https://github.com/luxfi/node/tree/main/consensus/protocol/quasar
Test Cases
func TestHybridMigration(t *testing.T) {
// Phase 1: Classical only
classicalTx := NewClassicalTransaction()
assert.True(t, ValidatePhase1(classicalTx))
// Phase 2: Hybrid required
hybridTx := NewHybridTransaction()
assert.True(t, ValidatePhase2(hybridTx))
assert.False(t, ValidatePhase2(classicalTx))
// Phase 3: Quantum primary
quantumTx := NewQuantumTransaction()
assert.True(t, ValidatePhase3(quantumTx))
// Emergency recovery
recovery := InitiateRecovery(account)
time.Sleep(7 * 24 * time.Hour)
assert.True(t, CompleteRecovery(recovery))
}
Security Considerations
- Downgrade Attacks: Prevented by mandatory progression
- Key Compromise: Timelock on recovery prevents theft
- Migration Replay: Nonces prevent replay attacks
- Quantum Timeline: Regular assessment of threat evolution
- Emergency Response: Rapid upgrade path if quantum threat accelerates
References
- NIST SP 800-131A Rev. 2: Transitioning Cryptographic Algorithms
- BSI TR-02102-1: Cryptographic Mechanisms
- ETSI TS 103 744: Quantum-Safe Hybrid Key Exchanges
- Bindel et al., "Transitioning to a Quantum-Resistant Public Key Infrastructure"
Copyright
Copyright and related rights waived via CC0.```