我必须使用secp256k1算法设置一个密钥库作为Google Cloud平台服务,不知道从哪里开始。
我检查了可用的选项,发现只有Elliptic Curve P-256 - SHA256摘要支持。这和secp256k1是一样的吗?
发布于 2019-09-25 16:02:09
如果你第一句话的意思是在谷歌云平台上拥有类似的(至少是部分的) Key Vault服务(这就是Cloud Key Management Service,又名KMS),那么答案是否定的。
而对于Azure的密钥库,椭圆曲线SECP256K1
is available,目前对于云KMS,只有椭圆曲线available are P-256和P-384。
P-256
和SECP256K1
曲线并不相同,到目前为止,P-256
是在FIPS-186-4中定义的,SECP256K1
是在Standards for Efficient Cryptography Version 2中定义的。
无论如何,为了支持这一切,您可以运行以下实验。
使用云开发工具包(see how-to)创建ASYMMETRIC_SIGN
目的密钥:
keyring=keyring0
key=key0
location=US
gcloud kms keyrings create $keyring --location=$location
gcloud kms keys create $key --location $location --keyring $keyring --purpose asymmetric-signing --default-algorithm ec-sign-p256-sha256 --protection-level software
签署一条消息并导入先前生成的(即KMS生成的)密钥对的公钥。
message=message
signature=message.sig
echo $(date):$(uname -a) > $message
gcloud kms asymmetric-sign --keyring=$keyring --key=$key --location=$location --input-file=$message --signature-file=$signature --digest-algorithm=sha256 --version=1
gcloud kms keys versions get-public-key 1 --location=$location --keyring=$keyring --key=$key --output-file=./$keyring-$key.pub
现在,您可以使用openssl dgst -verify $keyring-$key.pub -signature $signature $message
验证签名,但是您将无法获得有关用于生成密钥对的椭圆曲线的信息,密钥对用于执行签名。
为了获取这些信息,我们可以安装一个Python第三方库:
virtualenv --python=/usr/bin/python3 ecdsa
cd ecdsa
source bin/activate
pip install ecdsa
执行以下命令验证签名,并查看选择签名算法ec-sign-p256-sha256
时KMS使用的曲线:
python3 -c """
from pathlib import Path
import hashlib
from ecdsa import VerifyingKey, BadSignatureError
publickey = Path('$keyring-$key.pub')
signature = Path('$signature')
message = Path('$message')
def read_signature(signature):
'''
workaround for https://github.com/warner/python-ecdsa/issues/67
more background on why's that in https://tools.ietf.org/html/rfc5652
'''
LEN = 64
LENHALF = LEN//2
with signature.open('rb') as fp:
sig = fp.read()
offset = 4 if sig[4] else 5
slice_s, slice_r = slice(offset, offset + LENHALF), slice(-LENHALF, len(sig))
s,r = sig[slice_s], sig[slice_r]
return s + r
def verify(publickey, signature, message):
with publickey.open() as pkfp, message.open('br') as messagefp:
vk = VerifyingKey.from_pem(pkfp.read())
try:
print('Verifying with public key associated with curve', repr(vk.curve.name))
vk.verify(read_signature(signature), messagefp.read(), hashfunc=hashlib.sha256)
print('Verify Success')
except BadSignatureError:
print('Verify Failure')
verify(publickey, signature, message)
"""
要将本例中KMS中使用的椭圆曲线的点指向NIST的P-256
及其与SECP256K1
的参数差异,请查看以下代码片段:
python3 -c """
from collections import namedtuple
from operator import attrgetter
from ecdsa import NIST256p, SECP256k1
sextuple = namedtuple('T', 'p, a, b, G, n, h')
ag_curve = attrgetter(*('curve._CurveFp__'+c for c in 'abp'))
ag_generator = attrgetter(*('generator._Point__'+c for c in 'x y order'.split()))
def make_sextuple(curve, h=1):
n, G_x, G_y = ag_generator(curve)
return sextuple(*ag_curve(curve), n=n, G=(G_x, G_y), h=h)
T_NIST256p = make_sextuple(NIST256p)
T_SECP256k1 = make_sextuple(SECP256k1)
if T_NIST256p != T_SECP256k1:
for k in sextuple._fields:
ag_k = attrgetter(k)
v0, v1 = ag_k(T_NIST256p), ag_k(T_SECP256k1)
if v0 != v1:
print('Different values for parameter ', k,)
print(v0)
print(v1)
"""
https://stackoverflow.com/questions/58053715
复制