Мой вопрос: как я могу написать свою функцию проверки подписи, чтобы она не зависела от алгоритма открытого ключа?
Я работаю с библиотекой .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" и т. Д.
Заранее спасибо