python 中的 Diffie-Hellman 加密方案
Diffie-Hellman encryption scheme in python
我已经从爱丽丝的 24 个单词助记符中生成了主 pub/priv 密钥对。
master_private_key='9f74f4534cbdf01a1f925e20108d86045bd96849af9c94534a10ef2a26ff133b',
master_public_key="0308de0952b00ebc83a41830794534ae912b86d3718832a36ce98c256ab5bfdc4e"
mnemonic='flash city relief spirit federal own metal history great hello toy volcano same subway loan bleak rapid swamp pigeon secret pyramid spoon famous blouse',
同样,我重复了相同的过程来为 Bob 生成密钥。现在我想从 Alice 的私钥和 Bob 的 public 密钥生成 Diffie-Hellman 密钥。 python 中 Diffie-Hellman 的所有实现都会生成它们自己的 public/private 密钥对。
来自secp256k1 python documentation:
ecdh(scalar) -> bytes
compute an EC Diffie-Hellman secret in constant time. The instance
public_key is used as the public point, and the scalar specified must be
composed of 32 bytes. It outputs 32 bytes representing the ECDH secret
computed. If the scalar is invalid, an Exception is raised.
注意:只有在 secp256k1 C 库编译时支持 ecdh 才能使用。如果不支持,调用时会抛出Exception。
我只是不知道如何用 libsecp256k1 编译这个库。我觉得Diffie-Hellman ECC版本更适合这里。
这是我遇到的错误:
from sawtooth_signing.secp256k1 import Secp256k1PublicKey
bob_pub='033036dd96b7bef82556fe09eef42bef5e66545317c92a5deca99275f616729fef'
public_key = Secp256k1PublicKey.from_hex(bob_pub)
public_key.secp256k1_public_key.ecdh(alice_private_key)
----------------------
Exception Traceback (most recent call last)
<ipython-input-4-5175cf593934> in <module>()
----> 1 public_key.secp256k1_public_key.ecdh("dsds")
~/SawtoothClient/SawtoothClient/lib/python3.6/site-packages/secp256k1-0.13.2-py3.6-linux-x86_64.egg/secp256k1/__init__.py in ecdh(self, scalar)
305 assert self.public_key, "No public key defined"
306 if not HAS_ECDH:
--> 307 raise Exception("secp256k1_ecdh not enabled")
308 if not isinstance(scalar, bytes) or len(scalar) != 32:
309 raise TypeError('scalar must be composed of 32 bytes')
异常:secp256k1_ecdh 未启用
我已经尝试安装 https://github.com/bitcoin-core/secp256k1,按照说明进行安装并输出:
Libraries have been installed in:
/usr/local/lib
现在,当我再次尝试使用 python 3.6 安装 secp256k1 时,如他们的 git 页面所述:
INCLUDE_DIR=include/ LIB_DIR=/usr/local/lib pip install --no-binary secp256k1,
我收到这个错误:
ERROR: You must give at least one requirement to install (see "pip help install")
我是用另一个库 coincurve 做的。
import coincurve
alice_priv = "29307c4354b7d9d311d2cec4878c0de56c93a921d300273c19577e9004de3c9f"
alice_pub = "02f3c25355c29f64ea8e9b4e11b583ac0a7d0d8235f156cffec2b73e5756aab206"
bob_pub = "03a1db8e8b047e1350958a55e0a853151d0e1f685fa5cf3772e01bccc5aa5cb2eb"
bob_priv = "4138d1b6dde34f81c38cef2630429e85847dd5b70508e37f53c844f66f19f983"
alice_coin_priv = coincurve.PrivateKey.from_hex(alice_priv)
bob_coin_priv = coincurve.PrivateKey.from_hex(bob_priv)
binascii.hexlify(alice_coin_priv.ecdh(bob_coin_priv.public_key.public_key))
十六进制编码的共享密钥是
b'92959cb394b71a05d440e0e2973bc9d0e7182eb86bb94d3a260ce8353c7a0317'
验证工作
bob_coin_priv.ecdh(alice_coin_priv.public_key.public_key)== alice_coin_priv.ecdh(bob_coin_priv.public_key.public_key)
我已经从爱丽丝的 24 个单词助记符中生成了主 pub/priv 密钥对。
master_private_key='9f74f4534cbdf01a1f925e20108d86045bd96849af9c94534a10ef2a26ff133b',
master_public_key="0308de0952b00ebc83a41830794534ae912b86d3718832a36ce98c256ab5bfdc4e"
mnemonic='flash city relief spirit federal own metal history great hello toy volcano same subway loan bleak rapid swamp pigeon secret pyramid spoon famous blouse',
同样,我重复了相同的过程来为 Bob 生成密钥。现在我想从 Alice 的私钥和 Bob 的 public 密钥生成 Diffie-Hellman 密钥。 python 中 Diffie-Hellman 的所有实现都会生成它们自己的 public/private 密钥对。
来自secp256k1 python documentation:
ecdh(scalar) -> bytes
compute an EC Diffie-Hellman secret in constant time. The instance
public_key is used as the public point, and the scalar specified must be
composed of 32 bytes. It outputs 32 bytes representing the ECDH secret
computed. If the scalar is invalid, an Exception is raised.
注意:只有在 secp256k1 C 库编译时支持 ecdh 才能使用。如果不支持,调用时会抛出Exception。
我只是不知道如何用 libsecp256k1 编译这个库。我觉得Diffie-Hellman ECC版本更适合这里。
这是我遇到的错误:
from sawtooth_signing.secp256k1 import Secp256k1PublicKey
bob_pub='033036dd96b7bef82556fe09eef42bef5e66545317c92a5deca99275f616729fef'
public_key = Secp256k1PublicKey.from_hex(bob_pub)
public_key.secp256k1_public_key.ecdh(alice_private_key)
----------------------
Exception Traceback (most recent call last)
<ipython-input-4-5175cf593934> in <module>()
----> 1 public_key.secp256k1_public_key.ecdh("dsds")
~/SawtoothClient/SawtoothClient/lib/python3.6/site-packages/secp256k1-0.13.2-py3.6-linux-x86_64.egg/secp256k1/__init__.py in ecdh(self, scalar)
305 assert self.public_key, "No public key defined"
306 if not HAS_ECDH:
--> 307 raise Exception("secp256k1_ecdh not enabled")
308 if not isinstance(scalar, bytes) or len(scalar) != 32:
309 raise TypeError('scalar must be composed of 32 bytes')
异常:secp256k1_ecdh 未启用
我已经尝试安装 https://github.com/bitcoin-core/secp256k1,按照说明进行安装并输出:
Libraries have been installed in:
/usr/local/lib
现在,当我再次尝试使用 python 3.6 安装 secp256k1 时,如他们的 git 页面所述:
INCLUDE_DIR=include/ LIB_DIR=/usr/local/lib pip install --no-binary secp256k1,
我收到这个错误:
ERROR: You must give at least one requirement to install (see "pip help install")
我是用另一个库 coincurve 做的。
import coincurve
alice_priv = "29307c4354b7d9d311d2cec4878c0de56c93a921d300273c19577e9004de3c9f"
alice_pub = "02f3c25355c29f64ea8e9b4e11b583ac0a7d0d8235f156cffec2b73e5756aab206"
bob_pub = "03a1db8e8b047e1350958a55e0a853151d0e1f685fa5cf3772e01bccc5aa5cb2eb"
bob_priv = "4138d1b6dde34f81c38cef2630429e85847dd5b70508e37f53c844f66f19f983"
alice_coin_priv = coincurve.PrivateKey.from_hex(alice_priv)
bob_coin_priv = coincurve.PrivateKey.from_hex(bob_priv)
binascii.hexlify(alice_coin_priv.ecdh(bob_coin_priv.public_key.public_key))
十六进制编码的共享密钥是
b'92959cb394b71a05d440e0e2973bc9d0e7182eb86bb94d3a260ce8353c7a0317'
验证工作
bob_coin_priv.ecdh(alice_coin_priv.public_key.public_key)== alice_coin_priv.ecdh(bob_coin_priv.public_key.public_key)