以太坊與密碼學系統比較分析:多方安全計算、同態加密在實際應用場景中的深度比較
本文深入比較以太坊與 MPC、同態加密等密碼學系統在技術原理、實際應用場景與限制條件上的異同。以太坊使用 ECDSA 簽名與 ZK-SNARKs,而 MPC 與同態加密在雲端運算、醫療保健、金融服務等領域有廣泛應用。本文涵蓋 Shamir 秘密分享、Paillier 加法同態加密、閾值 ECDSA、以太坊 ZK 方案、MPC錢包、FHE 應用等核心主題。提供完整的理論說明與程式碼範例,幫助讀者理解不同技術的適用範圍與權衡取捨。
以太坊與密碼學系統比較分析:多方安全計算、同態加密在實際應用場景中的深度比較
前言:密碼學是區塊鏈的基石
密碼學是以太坊與所有區塊鏈系統的根基。從最基本的橢圓曲線數位簽名演算法(ECDSA)到複雜的零知識證明,密碼學為去中心化系統提供了安全性、隱私性與可驗證性的保證。然而,以太坊並非使用密碼學的唯一領域——多方安全計算(MPC)、同態加密(HE)、可信執行環境(TEE)等技術在雲端運算、醫療保健、金融服務等領域都有廣泛應用。
本文深入比較以太坊與這些密碼學系統在技術原理、實際應用場景與限制條件上的異同,幫助讀者理解不同技術的適用範圍與權衡取捨。
第一章:以太坊的密碼學基礎
1.1 橢圓曲線密碼學在以太坊中的應用
以太坊使用 secp256k1 橢圓曲線作為其主要的簽名演算法。這條曲線的方程式為:
y² = x³ + 7 (mod p)
其中:
- p = 2²⁵⁶ - 2³² - 2⁹ - 2⁶ - 2⁴ - 1(這是一個質數)
- 基點 G 的階 n ≈ 2²⁵⁶
ECDSA 簽名流程
import hashlib
class ECDSASignature:
"""
簡化版 ECDSA 簽名實現
實際以太坊使用 secp256k1 曲線
"""
# secp256k1 參數(簡化表示)
CURVE_ORDER = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
FIELD_PRIME = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
@staticmethod
def keccak_hash(message: bytes) -> int:
"""Keccak-256 哈希"""
h = hashlib.new('keccak256')
h.update(message)
return int.from_bytes(h.digest(), 'big')
@classmethod
def sign(private_key: int, message: bytes) -> tuple:
"""
ECDSA 簽名
返回:(r, s, v)
"""
# 計算消息哈希
z = ECDSASignature.keccak_hash(message) % ECDSASignature.CURVE_ORDER
# 生成隨機 nonce(實際實現中需要安全隨機數生成器)
import secrets
k = secrets.randbelow(ECDSASignature.CURVE_ORDER - 2) + 1
# 計算 R 點
# R = k * G(這是簡化表示,實際需要橢圓曲線點運算)
r = k # 簡化:r 是 nonce 的 x 座標模曲線階
# 計算 s
s = pow(k, -1, ECDSASignature.CURVE_ORDER) * (z + r * private_key)
s = s % ECDSASignature.CURVE_ORDER
# 標準化 s(確保較小的 s 值)
if s > ECDSASignature.CURVE_ORDER / 2:
s = ECDSASignature.CURVE_ORDER - s
# 計算 v(recid)
v = 0 # 簡化
return (r, s, v)
@classmethod
def verify(public_key: tuple, message: bytes, signature: tuple) -> bool:
"""
驗證 ECDSA 簽名
"""
r, s, v = signature
if not (1 <= r < ECDSASignature.CURVE_ORDER):
return False
if not (1 <= s < ECDSASignature.CURVE_ORDER):
return False
z = ECDSASignature.keccak_hash(message) % ECDSASignature.CURVE_ORDER
# 驗證計算(簡化)
w = pow(s, -1, ECDSASignature.CURVE_ORDER)
u1 = z * w % ECDSASignature.CURVE_ORDER
u2 = r * w % ECDSASignature.CURVE_ORDER
# 計算 P = u1 * G + u2 * public_key
# (需要完整的橢圓曲線點運算)
return True # 簡化返回
1.2 以太坊的零知識證明應用
以太坊生態系統大量使用零知識證明技術,主要應用於:
- ZK-Rollup:zksync、Starknet、Polygon zkEVM
- 隱私交易:Aztec Network
- 身份驗證:Worldcoin、Sismo
ZK-SNARKs 的數學基礎
class ZKSNARKProtocol:
"""
簡化版 ZK-SNARK 協議說明
實際實現需要複雜的多項式承諾與配對密碼學
"""
@staticmethod
def trusted_setup(security_parameter: int = 128) -> dict:
"""
可信設置儀式
生成 CRS(Common Reference String)
"""
# 這是簡化表示
# 實際實現需要 MPC 儀式
tau = secrets.randbits(256) # 有毒廢料
# G1 點
G1_points = [
pow(tau, i) % 2**256 # 簡化的群操作
for i in range(security_parameter)
]
# G2 點
G2_points = [
pow(tau, i) * G1_points[0] # 簡化
for i in range(security_parameter)
]
return {
'G1_points': G1_points,
'G2_points': G2_points,
'tau': tau # 在真實設置中會被丟棄
}
@staticmethod
def prove(crs: dict, witness: list, statement: list) -> dict:
"""
生成證明
參數:
- crs: 公共參考字串
- witness: 秘密見證(只有證明者知道)
- statement: 公共陳述
"""
# 簡化的證明生成
polynomial_values = witness + statement
# 計算證明
proof_a = sum(polynomial_values) % 2**256
proof_b = product(polynomial_values) % 2**256
return {
'pi_a': proof_a,
'pi_b': proof_b,
'pi_c': proof_a * proof_b % 2**256 # 簡化
}
@staticmethod
def verify(crs: dict, proof: dict, statement: list) -> bool:
"""
驗證證明
"""
# 配對檢查(簡化)
lhs = proof['pi_a'] * proof['pi_b'] % 2**256
rhs = proof['pi_c'] + sum(statement) % 2**256
return lhs == rhs
@staticmethod
def generate_keypair(circuit: 'Circuit') -> tuple:
"""
為電路生成驗證金鑰
電路定義要證明的計算
"""
# 抽樣隨機值
alpha = secrets.randbits(256)
beta = secrets.randbits(256)
gamma = secrets.randbits(256)
# 計算驗證金鑰
verifying_key = {
'alpha_g1': alpha,
'beta_g1': beta,
'gamma_g2': gamma,
'delta_g2': secrets.randbits(256)
}
# 計算 proving 金鑰
proving_key = {
'alpha_g1': alpha,
'beta_g1': beta,
'gamma_g1': gamma,
'delta_g1': secrets.randbits(256)
}
return (proving_key, verifying_key)
第二章:多方安全計算(MPC)
2.1 MPC 的基本概念
多方安全計算(Secure Multi-Party Computation, MPC)允許多個參與者在不洩露各自輸入的情況下,共同計算一個函數的輸出。MPC 的核心問題可追溯到 1980 年代姚期智的「百萬富翁問題」:
百萬富翁問題:
- Alice 有資產 a 百萬
- Bob 有資產 b 百萬
- 兩人想知道誰更有錢,但不透露具體數額
MPC 的安全定義
MPC 的安全性通常通過「模擬範式」(Simulation Paradigm)定義:
class MPCProtocol:
"""
MPC 協議的安全屬性
"""
@staticmethod
def define_security_properties():
"""
MPC 必須滿足的安全屬性
"""
properties = {
# 隱私性:攻擊者無法從協議輸出推斷其他參與者的輸入
'privacy': '攻擊者看不到其他方的私有輸入',
# 正確性:協議正確執行,輸出是函數的正確值
'correctness': '協議輸出正確的函數值',
# 輸入獨立性:攻擊者無法強制誠實參與者使用特定輸入
'input_independence': '誠實方的輸入不受攻擊者影響',
# 公平性:要麼所有方都收到輸出,要麼都收不到
'fairness': '所有方同時收到結果或不收到結果',
# 輸出可達性:誠實參與者總是能收到輸出
'output_delivery': '誠實方總是能得到正確輸出'
}
return properties
@staticmethod
def threat_models():
"""
威脅模型
"""
models = {
# 半島攻擊者:控制最多 t 個參與者
'semi_honest': '被動攻擊者,遵循協議但試圖從訊息推斷資訊',
# 惡意攻擊者:可能任意偏離協議
'malicious': '主動攻擊者,可能發送錯誤訊息',
# 靜態 vs 自適應
'static': '攻擊者在協議開始前選擇目標',
'adaptive': '攻擊者可以在協議執行中選擇目標'
}
return models
2.2 秘密分享(Secret Sharing)
秘密分享是 MPC 的基礎原語:
class SecretSharing:
"""
秘密分享實現
"""
@staticmethod
def shamir_share(secret: int, threshold: int,
num_shares: int, prime: int) -> list:
"""
Shamir 秘密分享 (t, n) 閾值方案
將秘密分成 n 份,至少需要 t 份才能恢復
原理:
- 在有限域上構造 t-1 次多項式
- f(0) = secret
- 分發 f(1), f(2), ..., f(n)
"""
import secrets
# 生成隨機係數(t-1 個)
coefficients = [secret]
for _ in range(threshold - 1):
coefficients.append(secrets.randbelow(prime))
def evaluate_polynomial(x: int) -> int:
"""計算多項式在 x 處的值"""
result = 0
power = 1
for coef in coefficients:
result = (result + coef * power) % prime
power = (power * x) % prime
return result
# 生成分額
shares = []
for i in range(1, num_shares + 1):
shares.append((i, evaluate_polynomial(i)))
return shares
@staticmethod
def shamir_reconstruct(shares: list, threshold: int,
prime: int) -> int:
"""
透過拉格朗日插值重建秘密
f(0) = Σ f(xi) * Li(0)
其中 Li(x) = Π_{j≠i} (x - xj) / (xi - xj)
"""
if len(shares) < threshold:
raise ValueError(f"需要 {threshold} 份,目前只有 {len(shares)} 份")
secret = 0
for i in range(threshold):
xi, yi = shares[i]
# 計算拉格朗日係數 Li(0)
numerator = 1
denominator = 1
for j in range(threshold):
if i != j:
xj = shares[j][0]
# Li(0) = Π_{j≠i} (0 - xj) / (xi - xj)
# = Π_{j≠i} (-xj) / (xi - xj)
numerator = (numerator * (-xj)) % prime
denominator = (denominator * (xi - xj)) % prime
li_0 = numerator * pow(denominator, -1, prime) % prime
# 累加
secret = (secret + yi * li_0) % prime
return secret
@staticmethod
def additive_share(secret: int, num_shares: int,
prime: int) -> list:
"""
簡單加法秘密分享
只需要 1 份就能恢復(不安全)
這裡展示加法分享的概念
"""
import secrets
shares = []
cumulative = 0
for i in range(num_shares - 1):
share = secrets.randbelow(prime)
shares.append(share)
cumulative = (cumulative + share) % prime
# 最後一份 = secret - sum(other_shares)
last_share = (secret - cumulative) % prime
shares.append(last_share)
return shares
2.3 以太坊 MPC 應用 vs 傳統 MPC 應用
| 特性 | 以太坊 MPC 應用 | 傳統 MPC 應用 |
|---|---|---|
| 典型場景 | 閾值簽名、多重簽名錢包 | 隱私計算、聯合分析 |
| 信任模型 | 區塊鏈共識 | 密碼學安全 |
| 效率 | 中等(需考慮 Gas) | 高 |
| 去中心化程度 | 高 | 可配置 |
| 典型項目 | Gnosis Safe、Uniswap | MP-SPDZ、ABY |
以太坊 MPC 應用實例:閾值 ECDSA
class ThresholdECDSA:
"""
閾值 ECDSA 簽名實現
允許 n 個參與者中的 t 個共同簽名
任何少於 t 個參與者都無法簽名
"""
def __init__(self, threshold: int, num_parties: int):
self.t = threshold
self.n = num_parties
self.private_key_shares = []
self.public_key = None
def keygen(self) -> list:
"""
分散式金鑰生成 (DKG)
每個參與者得到私鑰分片
"""
import secrets
# 生成主私鑰(實際使用 MPC 協議分配)
master_sk = secrets.randbelow(CURVE_ORDER)
self.public_key = master_sk * G # 公開公鑰
# 使用 Shamir 分享分配私鑰
key_shares = SecretSharing.shamir_share(
master_sk,
self.t,
self.n,
CURVE_ORDER
)
self.private_key_shares = key_shares
return [share[1] for share in key_shares] # 返回給各參與者
def partial_sign(self, signer_share: int, message_hash: int,
signer_id: int) -> dict:
"""
部分簽名(每個參與者執行)
計算 (ri, si) 其中 i 是部分簽名
"""
import secrets
# 生成 nonce 分片
ki = secrets.randbelow(CURVE_ORDER)
# 計算 Ri = ki * G
Ri = ki * G
# 計算部分 si
ri = Ri.x % CURVE_ORDER # 取 x 座標
si = (message_hash + ri * signer_share) * pow(ki, -1, CURVE_ORDER)
si = si % CURVE_ORDER
return {
'signer_id': signer_id,
'Ri': Ri,
'si': si,
'ki': ki # 實際需要秘密分享
}
def combine_signatures(self, partial_sigs: list,
message_hash: int) -> tuple:
"""
組合部分簽名
需要 t 個有效部分簽名
"""
if len(partial_sigs) < self.t:
raise ValueError(f"需要 {self.t} 個部分簽名")
# 計算 R = Σ Ri(取第一個簽名者的 R)
R = partial_sigs[0]['Ri']
r = R.x % CURVE_ORDER
# 使用拉格朗日插值計算完整的 s
s = 0
gamma = 0
for i, sig in enumerate(partial_sigs[:self.t]):
si = sig['si']
# 計算拉格朗日係數
numerator = 1
denominator = 1
for j, other_sig in enumerate(partial_sigs[:self.t]):
if i != j:
numerator = (numerator * (other_sig['signer_id'])) % CURVE_ORDER
denominator = (denominator * (sig['signer_id'] - other_sig['signer_id'])) % CURVE_ORDER
li = numerator * pow(denominator, -1, CURVE_ORDER) % CURVE_ORDER
s = (s + si * li) % CURVE_ORDER
# 標準化 s
if s > CURVE_ORDER / 2:
s = CURVE_ORDER - s
return (r, s)
第三章:同態加密(Homomorphic Encryption)
3.1 同態加密的理論基礎
同態加密允許在密文上直接進行運算,而無需解密。這意味著:
Decrypt(Encrypt(a) ⊕ Encrypt(b)) = a ⊕ b
其中 ⊕ 是對應於加法或乘法的運算。
同態加密的類型
| 類型 | 支援運算 | 範例 |
|---|---|---|
| 部分同態(PHE) | 加法或乘法之一 | RSA(乘法)、Paillier(加法) |
| somewhat HE | 有限組合 | BGN 系統 |
| 層級同態(LHE) | 受限的加法乘法組合 | BGV, BFV |
| 全同態(FHE) | 任意加法乘法組合 | GSW, CKKS, FHEW, TFHE |
3.2 Paillier 加法同態加密實現
class PaillierCryptosystem:
"""
Paillier 同態加密系統
支援:
- 加法同態:Enc(m1) * Enc(m2) = Enc(m1 + m2)
- 標量乘法:Enc(m)^k = Enc(m * k)
適用場景:
- 私密競價
- 加密資料統計
- 私人機器學習
"""
def __init__(self, bit_length: int = 1024):
self.bit_length = bit_length
self.public_key = None
self.private_key = None
def keygen(self) -> tuple:
"""
金鑰生成
"""
import secrets
from math import gcd
# 生成兩個大質數 p 和 q
p = self._generate_prime(bit_length // 2)
q = self._generate_prime(bit_length // 2)
n = p * q
lambda_n = (p - 1) * (q - 1) # Carmichael 函數
n_squared = n * n
# 選擇隨機數 g,其中 g ∈ (Z/n²Z)*
g = n + 1 # 簡單選擇 g = n + 1
# 計算 μ = (L(g^λ mod n²))⁻¹ mod n
# 其中 L(x) = (x - 1) / n
lambda_val = lambda_n
mu = pow(
self._L(pow(g, lambda_val, n_squared)),
-1,
n
)
self.public_key = {'n': n, 'g': g, 'n_squared': n_squared}
self.private_key = {'lambda': lambda_val, 'mu': mu, 'p': p, 'q': q}
return (self.public_key, self.private_key)
def _generate_prime(self, bits: int) -> int:
"""生成指定位數的質數"""
import secrets
while True:
candidate = secrets.randbits(bits)
# 確保是奇數
candidate |= 1
# 質數測試(使用 Miller-Rabin)
if self._is_prime(candidate):
return candidate
def _is_prime(self, n: int, iterations: int = 40) -> bool:
"""Miller-Rabin 質數測試"""
import secrets
if n < 2:
return False
if n == 2 or n == 3:
return True
if n % 2 == 0:
return False
# 寫 n-1 = 2^r * d
r, d = 0, n - 1
while d % 2 == 0:
r += 1
d //= 2
for _ in range(iterations):
a = secrets.randbelow(n - 3) + 2
x = pow(a, d, n)
if x == 1 or x == n - 1:
continue
for _ in range(r - 1):
x = pow(x, 2, n)
if x == n - 1:
break
else:
return False
return True
def _L(self, x: int) -> int:
"""Paillier 的 L 函數"""
return (x - 1) // self.public_key['n']
def encrypt(self, message: int) -> int:
"""
加密
c = g^m * r^n mod n²
"""
n = self.public_key['n']
g = self.public_key['g']
n_squared = self.public_key['n_squared']
import secrets
# 選擇隨機數 r,其中 r ∈ (Z/nZ)*
r = secrets.randbelow(n)
while self._gcd(r, n) != 1:
r = secrets.randbelow(n)
# 計算密文
c = (pow(g, message, n_squared) * pow(r, n, n_squared)) % n_squared
return c
def decrypt(self, ciphertext: int) -> int:
"""
解密
m = L(c^λ mod n²) * μ mod n
"""
n = self.public_key['n']
n_squared = self.public_key['n_squared']
lambda_val = self.private_key['lambda']
mu = self.private_key['mu']
c_lambda = pow(ciphertext, lambda_val, n_squared)
L_c_lambda = self._L(c_lambda)
message = (L_c_lambda * mu) % n
return message
def _gcd(self, a: int, b: int) -> int:
"""計算最大公因數"""
while b:
a, b = b, a % b
return a
# 同態運算
def add(self, ciphertext1: int, ciphertext2: int) -> int:
"""
同態加法
Enc(m1) * Enc(m2) = Enc(m1 + m2)
"""
n_squared = self.public_key['n_squared']
return (ciphertext1 * ciphertext2) % n_squared
def add_constant(self, ciphertext: int, constant: int) -> int:
"""
同態加常數
Enc(m)^g^k = Enc(m + k)
"""
n = self.public_key['n']
n_squared = self.public_key['n_squared']
g = self.public_key['g']
return (ciphertext * pow(g, constant, n_squared)) % n_squared
def multiply(self, ciphertext: int, scalar: int) -> int:
"""
同態標量乘法
Enc(m)^k = Enc(m * k)
"""
n_squared = self.public_key['n_squared']
return pow(ciphertext, scalar, n_squared)
# Paillier 應用示例:私有競價
class PrivateAuction:
"""
使用 Paillier 同態加密的私有競價系統
投標者加密他們的投標價格
拍賣方可以比較密文
中標者可以證明自己中標而不洩露其他投標
"""
def __init__(self):
self.paillier = PaillierCryptosystem(bit_length=512)
self.public_key = self.paillier.keygen()[0]
self.bids = [] # (bidder_id, encrypted_bid)
def submit_bid(self, bidder_id: str, bid: int) -> int:
"""投標者提交加密投標"""
encrypted_bid = self.paillier.encrypt(bid)
self.bids.append((bidder_id, encrypted_bid))
return encrypted_bid
def determine_winner(self) -> tuple:
"""
確定中標者
使用同態加密比較所有投標
"""
if not self.bids:
raise ValueError("沒有投標")
# 初始化為第一個投標
current_winner = self.bids[0][0]
max_bid = self.bids[0][1]
# 比較所有其他投標
for bidder_id, encrypted_bid in self.bids[1:]:
# 計算 max_bid - encrypted_bid
# 如果結果為正,說明 max_bid > encrypted_bid
difference = self.paillier.multiply(
max_bid,
pow(encrypted_bid, -1, self.public_key['n_squared']) % self.public_key['n_squared']
)
# 這是簡化表示,實際需要更複雜的零知識證明來驗證結果為正
return (current_winner, self.paillier.decrypt(max_bid))
3.3 全同態加密(FHE)簡介
全同態加密允許在密文上執行任意計算,是密碼學的「聖杯」之一。代表性的 FHE 方案包括:
class FHEScheme:
"""
全同態加密(FHE)方案概述
現代 FHE 方案基於以下問題之一:
- RLWE (Ring Learning With Errors)
- LWE (Learning With Errors)
"""
@staticmethod
def explain_fhew():
"""
FHEW 方案概述
基於 GGHS15,首次實現了高效的自舉(Bootstrapping)
"""
description = """
FHEW 主要特點:
- 使用 RLWE 問題
- 支援任意計算
- 自舉實現密文刷新
- 典型運算延遲:毫秒級
應用場景:
- 私有決策樹
- 加密資料庫查詢
- 跨機構協作計算
"""
return description
@staticmethod
def explain_tfhe():
"""
TFHE(全面同態加密)方案概述
FHEW 的改進版本,支援任意運算
"""
description = """
TFHE 主要特點:
- 快速自舉(~13ms)
- 任意布林電路
- 整数與浮點數支援
- 開源實現:tfhe-rs
應用場景:
- 私有機器學習推斷
- 加密函數評估
- 零知識證明生成
"""
return description
@staticmethod
def explain_ckks():
"""
CKKS 方案概述
專為近似浮點數計算設計
適合機器學習訓練
"""
description = """
CKKS 主要特點:
- 近似計算(不是精確結果)
- 高效的密文向量運算
- 支援線性代算
- 固定點近似
應用場景:
- 隱私保護機器學習
- 加密神經網路
- 安全多方學習
"""
return description
第四章:實用場景比較分析
4.1 以太坊隱私 vs MPC vs 同態加密
| 特性 | 以太坊 ZK 方案 | MPC | 同態加密 |
|---|---|---|---|
| 隱私保護方式 | 零知識證明 | 秘密分享 | 密文運算 |
| 計算開銷 | 高(ZK 證明生成) | 中等(網路通訊) | 高(密文運算) |
| 驗證效率 | 高(ZK 驗證) | 中等 | 中等 |
| 互動性 | 無需多方互動 | 需要 | 無需 |
| 可擴展性 | 較好 | 受網路限制 | 受計算限制 |
| 適用場景 | 鏈上隱私交易 | 分散式金鑰管理 | 雲端隱私計算 |
4.2 實際應用對比
場景一:去中心化身份驗證
class PrivacyComparison:
"""
不同密碼學方案在身份驗證中的應用比較
"""
@staticmethod
def zk_approach():
"""
ZK 方案(以太坊風格)
"""
return """
方案:使用 ZK-SNARK 證明年齡 > 18
流程:
1. 將身份資訊存儲為 Merkle 樹葉節點
2. 生成 ZK 證明:
- 知道秘密輸入(出生日期)
- 輸入位於 Merkle 樹中
- 計算結果滿足條件(age > 18)
3. 驗證者只檢查證明,不接觸實際資料
優點:
- 無需透露實際出生日期
- 證明可重複使用(同一電路)
- 可結合鏈上身份(如 ENS)
缺點:
- 需要可信設置
- 電路固定,灵活性受限
"""
@staticmethod
def mpc_approach():
"""
MPC 方案
"""
return """
方案:多方計算年齡驗證
流程:
1. 身份提供者持有加密的身份資料
2. 驗證機構持有年齡門檻
3. 雙方執行 MPC 協議比較年齡
4. 雙方都只知道結果,不知道對方的輸入
優點:
- 無需可信設置(某些 MPC 方案)
- 靈活:可實現任意比較邏輯
- 可抵禦部分參與者腐化
缺點:
- 需要多方同時在線
- 網路延遲影響效率
- 複雜的安全假設
"""
@staticmethod
def he_approach():
"""
同態加密方案
"""
return """
方案:使用 Paillier 加密身份資料
流程:
1. 身份資料以 Paillier 加密
2. 驗證機構直接計算加密值:
Enc(age) + Enc(-threshold) = Enc(age - threshold)
3. 使用零知識範圍證明驗證年齡滿足條件
優點:
- 單向:只有持有私鑰方能解密
- 可離線驗證
- 適用於簡單算術運算
缺點:
- 只支援加法同態(Paillier)
- 需要保護私鑰
- FHE 計算開銷仍然較高
"""
場景二:加密資產託管
class CustodyComparison:
"""
不同託管方案的密碼學比較
"""
@staticmethod
def ethereum_multisig():
"""
以太坊多簽合約
"""
return """
方案:Gnosis Safe 多重簽名合約
實現:
- 合約錢包支援 M-of-N 簽名門檻
- 所有簽名者在鏈上可見
- 簽名聚合降低 Gas 成本
安全性:
- 由智能合約代碼保證
- 依賴以太坊共識
- 私鑰洩露風險
適用:中等價值資產、團隊托管
"""
@staticmethod
def mpc_wallet():
"""
MPC 錢包
"""
return """
方案:Fireblocks、BitGo MPC 錢包
實現:
- 私鑰分散為 n 個分片
- 簽名時無需重組完整私鑰
- 每個分片獨立存儲
安全性:
- 無單點故障
- 需要 M 個分片同時被攻擊
- 支援地理分佈
適用:高價值機構資產
"""
@staticmethod
def he_wallet():
"""
同態加密錢包
"""
return """
方案:理論可行但實用性較低
實現:
- 公鑰加密交易授權
- 持有私鑰方可解密並執行
實際限制:
- 區塊鏈共識需要驗證簽名
- 同態加密簽名效率低
- 目前不適用於主流區塊鏈
適用:特定隱私場景
"""
4.3 效能比較數據
| 操作 | 以太坊 ZK | MPC (3方) | Paillier HE | FHE (TFHE) |
|---|---|---|---|---|
| 密鑰生成 | ~1 分鐘 | ~5 秒 | ~500ms | ~1 分鐘 |
| 加密 | ~1ms | N/A | ~5ms | ~10ms |
| 解密 | ~1ms | N/A | ~3ms | ~5ms |
| 加法 | N/A | N/A | ~0.1ms | ~1ms |
| 乘法 | N/A | N/A | ~100ms | ~5ms |
| 簽名/驗證 | ~10ms | ~50ms | N/A | N/A |
| 密文大小 | ~200 bytes | N/A | ~1KB | ~50KB |
結論:選擇合適的密碼學工具
不同的密碼學技術適用於不同的場景:
- 以太坊 ZK 方案:適合需要鏈上驗證、公開可驗證的場景
- MPC:適合分散式金鑰管理、多方協作計算
- 同態加密:適合需要委託計算但不想洩露資料的場景
在實際應用中,這些技術經常組合使用,例如:
- ZK + MPC:用於私有多簽名錢包
- FHE + ZK:用於可驗證的加密計算
- 以太坊合約 + MPC:用於機構級資產托管
理解這些技術的權衡取捨,是設計安全高效系統的關鍵。
參考資源
- Yao's Millionaires' Problem - Andrew Yao
- Shamir's Secret Sharing - Adi Shamir
- Paillier Cryptosystem - Pascal Paillier
- ZK-SNARKs: A Practical Gentle Introduction - Consensys
- TFHE: Fast Fully Homomorphic Encryption over the Torus - Ilaria Chillotti et al.
免責聲明
本網站內容僅供教育與資訊目的,不構成任何投資建議或推薦。在進行任何加密貨幣相關操作前,請自行研究並諮詢專業人士意見。所有投資均有風險,請謹慎評估您的風險承受能力。
相關文章
- 以太坊錢包安全模型深度比較:EOA、智慧合約錢包與 MPC 錢包的技術架構、風險分析與選擇框架 — 本文深入分析以太坊錢包技術的三大類型:外部擁有帳戶(EOA)、智慧合約錢包(Smart Contract Wallet)與多方計算錢包(MPC Wallet)。我們從技術原理、安全模型、風險維度等面向進行全面比較,涵蓋 ERC-4337 帳戶抽象標準、Shamir 秘密分享方案、閾值簽名等核心技術,並提供針對不同資產規模和使用場景的選擇框架。截至 2026 年第一季度,以太坊生態系統的錢包技術持續演進,理解這些技術差異對於保護數位資產至關重要。
- MPC 錢包完整技術指南:多方計算錢包架構、安全模型與實作深度分析 — 多方計算(Multi-Party Computation)錢包代表了區塊鏈資產安全管理的前沿技術方向。本文深入剖析 MPC 錢包的密碼學原理、主流實現方案、安全架構,涵蓋 Shamir 秘密分享、BLS 閾值簽名、分散式金鑰生成等核心技術,並提供完整的部署指南與最佳實踐建議。
- 以太坊 PoS 共識密碼學完整指南:BLS 簽章聚合、VDF 隨機數、BFT 容錯模型數學推導 — 本文深入分析以太坊 PoS 共識機制的密碼學基礎,包括 BLS 簽章聚合技術的數學原理與效率分析、VDF 可驗證延遲函數的設計與實現、RANDAO 混洗機制、以及共識安全性分析。特別聚焦於 BFT 共識容錯模型的數學推導,包括 PBFT 協議的安全性證明、Casper FFG 的容錯分析、LMD-GHOST 的安全模型、以及經濟激勵的數學模型。提供完整的數學推導與 2026 Q1 最新驗證者數據。
- 以太坊歷史關鍵事件深度技術分析:The DAO Fork 完整脈絡、EIP-999 爭議與社群治理啟示 — 本文深入分析以太坊歷史上兩大關鍵事件:2016 年 The DAO 攻擊及其後續的硬分叉決策,以及 2018 年 EIP-999 提案失敗的完整脈絡。我們從技術層面還原 DAO 漏洞的攻擊機制,分析社群分裂的深層原因,探討 код 即法律原則的形成過程,並從這些歷史事件中提煉出對去中心化治理的深刻啟示。
- 比特幣以太坊跨鏈橋接完整指南:技術架構、安全分析與實際操作案例 — 本文深入探討比特幣與以太坊之間的跨鏈橋接技術,從原理分析到安全評估,從主流項目比較到實際操作演練,提供完整的技術參考。我們將詳細分析 WBTC、tBTC、RenBTC 等主流橋接方案的技術架構和安全特性,透過 Wormhole、Ronin 等真實安全事件案例幫助讀者建立全面的風險意識,並提供詳盡的操作指南和最佳實踐建議。
延伸閱讀與來源
- Ethereum.org Developers 官方開發者入口與技術文件
- EIPs 以太坊改進提案完整列表
- Solidity 文檔 智慧合約程式語言官方規格
- EVM 代碼庫 EVM 實作的核心參考
- Alethio EVM 分析 EVM 行為的正規驗證
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!