python ECIES HKDF KDF2密钥派生计算出共享公钥 解密数据
import base64
import binascii
import os
from hashlib import sha256
from sd.utils.KDF import KDF2
from Crypto.Cipher import AES
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
def generate_key_pair():
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()
print(public_key.public_numbers())
print(public_key.key_size)
public_key_byte = public_key.public_bytes(serialization.Encoding.X962, serialization.PublicFormat.UncompressedPoint)
public_key_b64 = base64.b64encode(public_key_byte).decode()
return private_key, public_key, public_key_b64
def load_ec_pub_key(remote_key_base64_str=None):
remote_key_bytes = base64.b64decode(remote_key_base64_str)
remote_public_key = ec.EllipticCurvePublicKey.from_encoded_point(curve=ec.SECP256R1(), data=remote_key_bytes)
return remote_public_key
def ecies_kem_hkdf(private_key, remote_key_base64_str, salt, info, shared_key_len=32):
remote_key_bytes = base64.b64decode(remote_key_base64_str)
remote_public_key = ec.EllipticCurvePublicKey.from_encoded_point(curve=ec.SECP256R1(), data=remote_key_bytes)
shared_key = private_key.exchange(ec.ECDH(), remote_public_key)
derived_key = HKDF(
algorithm=hashes.SHA256(),
length=shared_key_len,
salt=base64.b64decode(salt),
info=base64.b64decode(info)
).derive(remote_key_bytes + shared_key)
derived_key = base64.b64encode(derived_key).decode()
return derived_key
def ecies_kem_kdf2(private_key, ephemeral_public_key_str, secret_key_len=32):
print("private key=" + base64.b64encode(private_key.private_bytes(serialization.Encoding.PEM, serialization.PrivateFormat.PKCS8, serialization.NoEncryption())).decode())
ephemeral_public_key_bytes = base64.b64decode(ephemeral_public_key_str)
ephemeral_public_key_bytes = ec.EllipticCurvePublicKey.from_encoded_poin