介紹如何在 Python 中使用 eciespy
模組產生 ECC 金鑰,並對資料進行加密與解密。
橢圓曲線密碼學(Elliptic Curve Cryptography,縮寫為 ECC)是一種新興的公鑰加密方式,跟 RSA 加密演算法相較之下,ECC 只需要較小的密鑰長度即可提供相當等級的安全性,所需要的 CPU 計算與記憶體資源也相對較低。
eciespy
模組eciespy
是 Python 的一個 ECIES(Elliptic Curve Integrated Encryption Scheme)橢圓曲線加密模組,其所採用的橢圓曲線是 secp256k1
,搭配 AES-256-GCM
演算法做加密,經過 eciespy
加密之後的資料會用以下這樣的格式來儲存:
+-------------------------------+----------+----------+-----------------+ | 65 Bytes | 16 Bytes | 16 Bytes | == data size | +-------------------------------+----------+----------+-----------------+ | Sender Public Key (ephemeral) | Nonce/IV | Tag/MAC | Encrypted data | +-------------------------------+----------+----------+-----------------+ | sender_pk | nonce | tag | encrypted_data | +-------------------------------+----------+----------+-----------------+ | Secp256k1 | AES-256-GCM | +-------------------------------+---------------------------------------+
我們可以使用以下 pip
指令安裝 Python 的 eciespy
模組:
# 安裝 eciespy 模組
pip install eciespy
eciespy
指令加密與解密Python 的 eciespy
模組有附帶一個 eciespy
指令,我們可以透過指令方式來做 ECIES 的加密與解密。
首先要產生 ECC 的私鑰與公鑰:
# 產生 ECC 私鑰與公鑰 eciespy -g
Private: 0xca84563bdfb9e7111a5511ad11ebe2db7ff65e505714e5fafac6d996885f84d7 Public: 0xe9b567f30b806812b08551a5130be3725d44770fbace8a7357bfb45bf96c6f6c4dd00b7049f414a4c207bf74b7a8242b6777253c59fef7ae01ffd21bc52b3e5e Address: 0xE59Edd7F208Cf1132ad6a8c75DcC27758B196E7d
接著將私鑰與公鑰儲存至檔案:
# 儲存 ECC 私鑰與公鑰 echo "0xca84563bdfb9e7111a5511ad11ebe2db7ff65e505714e5fafac6d996885f84d7" > priv.key echo "0xe9b567f30b806812b08551a5130be3725d44770fbace8a7357bfb45bf96c6f6c4dd00b7049f414a4c207bf74b7a8242b6777253c59fef7ae01ffd21bc52b3e5e" > pub.key
產生原始資料之後,就可以使用 eciespy
指令進行 ECIES 加密:
# 產生原始資料 echo 'top secret!!!' > data.txt # ECIES 加密 eciespy -e -k pub.key -D data.txt -O data.txt.enc
這裡 eciespy
參數意義如下:
-e
:進行 ECIES 加密。-k
:指定金鑰檔案。-D
:指定輸入資料檔案。-O
:指定資料輸出檔案。加密之後,可用以下指令解密:
# ECIES 解密 eciespy -d -k priv.key -D data.txt.enc -O data.txt.out
解密的指令參數大同小異,只有將加密參數 -e
改為解密參數 -d
,並指定私鑰。解密之後,可以驗證資料的正確性:
# 檢查資料正確性
md5sum data.txt data.txt.out
88338e46f94cb95b867bc4e6087f61f0 data.txt 88338e46f94cb95b867bc4e6087f61f0 data.txt.out
以下是在 Python 程式中使用 eciespy
模組進行 ECC 加密與解密的範例:
from ecies.utils import generate_eth_key, generate_key from ecies import encrypt, decrypt # 產生 ECC 私鑰 privKey = generate_eth_key() # 產生 ECC 公鑰 pubKey = privKey.public_key # 原始資料 data = b'top secret!!!' # 以 ECC 公鑰加密 dataEnc = encrypt(pubKey.to_hex(), data) # 以 ECC 私鑰解密 dataOut = decrypt(privKey.to_hex(), dataEnc) # 確認解密輸出 print(dataOut)
b'top secret!!!'
若要在 Python 程式中實作 ECDH(Elliptic Curve Diffie–Hellman,簡稱 ECDH)金鑰交換,可以參考以下範例:
from coincurve import PrivateKey # 產生 ECC 私鑰 privKey1 = PrivateKey.from_int(1) privKey2 = PrivateKey.from_int(2) # 產生 ECC 公鑰 pubKey1 = privKey1.public_key pubKey2 = privKey2.public_key # 計算共享密鑰 secret1 = privKey1.ecdh(pubKey2.format()) secret2 = privKey2.ecdh(pubKey1.format()) print(secret1 == secret2)
True
參考資料:PyCryptodome、Practical Cryptography for Developers:ECIES Hybrid Encryption Scheme