Python

Python 以 eciespy 實作 ECC 非對稱式加密方法教學與範例

介紹如何在 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 程式加密與解密

以下是在 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 金鑰交換

若要在 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

參考資料:PyCryptodomePractical Cryptography for Developers:ECIES Hybrid Encryption Scheme

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago