Проверять подпись с открытого ключа, автоматически определять алгоритм в BouncyCastle - PullRequest
0 голосов
/ 18 марта 2019

Мой вопрос: как я могу написать свою функцию проверки подписи, чтобы она не зависела от алгоритма открытого ключа?

Я работаю с библиотекой .Net BouncyCastle (v1.8.4). Я пытаюсь проверить подпись, не зная заранее алгоритм (но его идентификация будет встроена в открытый ключ).

Мне нужно проверить подпись для байтового потока, и у меня есть открытый ключ в формате PEM:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7t7Uo4NB7kjqPGMzdXbBI66gy8rz
oYvRatFPTGsdS9lCru6imfdMclcr/hCkxHgfgz0ewmKqEjWK8EjZczUCEA==
-----END PUBLIC KEY-----

Я ожидаю, что он проинформирует алгоритм в потоке ASN.1, который в этом примере анализируется следующим образом:

$ openssl asn1parse -i -in pubkey.pem
    0:d=0  hl=2 l=  89 cons: SEQUENCE
    2:d=1  hl=2 l=  19 cons:  SEQUENCE
    4:d=2  hl=2 l=   7 prim:   OBJECT            :id-ecPublicKey
   13:d=2  hl=2 l=   8 prim:   OBJECT            :prime256v1
   23:d=1  hl=2 l=  66 prim:  BIT STRING

Алгоритм в этом случае прост 256v1 (secp256k1 и т. Д.), Но я не буду знать, что это заранее. В настоящее время мой код выглядит так:

Private Function SignatureChecks(data() as Byte, pubkey as String, signature as String) As Boolean

    Dim keypars As Org.BouncyCastle.Crypto.AsymmetricKeyParameter 'impements ICipherParameters

    'Read and parse the PEM file into the proper object
    Dim pubkeybytes = Encoding.ASCII.GetBytes(pubkey)
    Using pubkeystream = New MemoryStream(pubkeybytes)
        Using reader = New StreamReader(pubkeystream)
            Dim pemrd = New PemReader(reader)
            'Now this is the decoded PEM for the public key
            keypars = pemrd.ReadObject()
        End Using
    End Using

    Dim signer As ISigner

    '*************************************************************
    'Currently this is hardwired: how can I make this intelligent?
    '*************************************************************
    signer = SignerUtilities.GetSigner("SHA-256withECDSA")

    'Init the signer with the public key
    signer.Init(False, keypars)
    'Appends the data to be verified in the SHA block buffer
    signer.BlockUpdate(data, 0, data.Length)

    'Get the bytes from the signature
    Dim sigbytes = Convert.FromBase64String(signature)

    Return signer.VerifySignature(sigbytes)

End Function

Этот код работает нормально, если подпись была сделана с использованием алгоритма secp256k1, что может быть не так. Я попытался извлечь информацию из объекта AsymmetricKeyParameter (который на самом деле является ECPublicKeyParameters), но в нем очень мало открытых членов. Однако соответствующая информация отображается во внутренних элементах объекта с помощью отладчика: такие значения, как publicKeyParamSet = 1.2.840.10045.3.1.7, алгоритма = "EC" и т. Д.

Заранее спасибо

1 Ответ

0 голосов
/ 19 марта 2019

Алгоритм prime256v1, сообщаемый в открытом ключе, является просто алгоритмом шифрования (как и должно быть), в то время как алгоритм hash не указан ни в открытом ключе, ни вподпись.Чтобы проверить подпись, хэш-функция (в данном случае SHA-256) должна быть согласована между участниками, используя другие средства.Примером является кодировка CMS (ранее PKCS # 7), которая является контейнерным методом, который может встраивать всю информацию, необходимую для проверки достоверности подписи.Получение алгоритма шифрования из открытого ключа недостаточно для выполнения задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...