Py学习  »  Python

python中的diffie-hellman加密方案

GraphicalDot • 7 年前 • 2092 次点击  

我已经从24个单词的助记键中为Alice生成了master 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的公钥生成diffie-hellman密钥。python中diffie-hellman的所有实现都会生成自己的公钥/私钥对。

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。如果没有支持,调用时将引发异常。

我只是不知道如何用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")
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30654
文章 [ 1 ]  |  最新文章 7 年前
GraphicalDot
Reply   •   1 楼
GraphicalDot    7 年前

我用另一个图书馆的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)