Как настроить keyvault, используя алгоритм secp256k1 в GCP? - PullRequest
0 голосов
/ 23 сентября 2019

Мне нужно настроить keyvault с использованием алгоритма secp256k1 в качестве службы Google Cloud Platform и не знаю, с чего начать.

Я проверил доступные варианты и нашел только Elliptic Curve P-256 - поддержка дайджеста SHA256,Это так же, как secp256k1?

1 Ответ

1 голос
/ 25 сентября 2019

Если то, что вы подразумеваете под первым предложением, имеет аналогичную (хотя бы частично) службу Key Vault с Google Cloud Platform (это Cloud Key Management Service он же KMS) тогда ответ - нет.

В то время как для хранилища ключей Azure доступна эллиптическая кривая SECP256K1 , на данный момент для Cloud KMS единственные доступные эллиптические кривые P-256 и P-384.

Кривые P-256 и SECP256K1 не совпадают, и на данный момент P-256 определено в FIPS-186-4 и SECP256K1 в Стандарты для эффективной криптографии Версия 2 .

В любом случае, чтобы поддержать все это, вы можете запустить следующий эксперимент.

Создать ASYMMETRIC_SIGN целевой ключ с Cloud SDK ( см. инструкции ):

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

И выполните следующую команду, чтобы проверить подпись и увидеть кривую, используемую KMS при выборе алгоритма подписи ec-sign-p256-sha256:

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)
"""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...