1

これに対する答えを探すために、Google でかなりの時間を費やしてきました。ソリューションを説明するコードをいくつか見つけましたが、ほとんどは C、.NET、または Java で書かれています。私の場合はVB6です。

私は非常に単純なRSA1アプリケーションを持っています.いくつかのデータに署名し(「appA」で秘密鍵を使用)、署名を検証します(「appB」で公開鍵を使用、これはVB6アプリです)。現在、CryptoAPI ライブラリを介してすべてが正常に動作しています。

「appA」署名部分は UNIX サーバーに移動し、OpenSSL で実行する必要があります (できれば)。問題は、キー形式を PEM から CryptoAPI が期待する PublicKeyBlob に変換することです。

この C コードを VBに移植しようとしました。CryptStringToBinary は成功しますが、CryptDecodeObjectEx がハングして VB がクラッシュします。

VB でのこの使用法を示すドキュメントを見つけることができませんでした。それが可能かどうかさえわかりません。誰かがこれに光を当てることができることを願っています。必要なすべての構造が不足していれば問題が解決することを期待して、CryptDecodeObject (sans "Ex") 関数も試しましたが、同じ問題です。

テスト キーは、openssl_pkey_new を使用して OpenSSL によって生成されました

4

2 に答える 2

0

構造の1つに問題があり(バイト配列メンバーを配列として宣言していません)、クラッシュの問題は発生していません。ただし、CryptDecodeObjectではまだ成功していません。以下のコードは私が扱っているものです。GetLastErrは0を返すだけです(あまり役に立ちません)。私がどこで間違っているのか誰かが考えているなら、私に知らせてください!

Dim iFile As Integer
Dim sPEM As String, sDER As String
Dim lenPEM As Long, lenDER As Long
Dim publicKeyInfo As CERT_PUBLIC_KEY_INFO
Dim publicKeyInfoLen As Long


iFile = FreeFile
Open app.Path & "\publickey.txt" For Binary As iFile
sPEM = Space(LOF(iFile))
Get #iFile, , sPEM
Close iFile

lenPEM = Len(sPEM)

' Determine buffer length required for the DER string
CryptStringToBinary sPEM, lenPEM, CRYPT_STRING_BASE64HEADER, 0, lenDER, 0, 0
sDER = Space(lenDER)

' Do conversion to binary
If Not CryptStringToBinary(sPEM, lenPEM, CRYPT_STRING_BASE64HEADER, sDER, lenDER, 0, 0) Then
    Debug.Print sDER
Else
    MsgBox "CryptStringToBinary Error " & GetLastError
    Exit Sub
End If

' Do conversion to blob
If Not CryptDecodeObject(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, sDER, lenDER, 0, publicKeyInfo, publicKeyInfoLen) Then
    MsgBox "CryptDecodeObject Error: " & GetLastError
    Exit Sub
End If

誰かがそれが役立つと思うなら、私はすべての関数と型の宣言を投稿することができます、私はそれらが正しいと信じています。

OpenSSLによって生成された公開鍵は次のとおりです。

----- BEGIN PUBLIC KEY ----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANWhFRxt / ZF56uGO7GsbvevmX42 // thm JdseUwQNot / ihXCPRadf0SPYbtHS6 / JA92pCX7NxfgYNoYlOFb0Y

于 2012-08-09T16:29:29.910 に答える
0

私が考えることができるのは、宣言が正しいことを確認し、渡したパラメーターをデバッグ/印刷して、それらが正しいことを確認することだけです。

Declare Function CryptDecodeObject lib "crypt32" (ByVal dwCertEncodingType As Long, ByVal lpszStructType As String, ByVal pbEncoded As String, ByVal cbEncoded As Long, ByVal dwFlags As Long, pvStructInfo As Any, ByRef pcbStructInfo As Long) As Long`

Declare Function CryptDecodeObjectEx lib "crypt32" (ByVal dwCertEncodingType As Long, ByVal lpszStructType As String, ByVal pbEncoded As String, ByVal cbEncoded As Long, ByVal dwFlags As Long, ByRef pDecodePara As PCRYPT_DECODE_PARA, pvStructInfo As Any, ByRef pcbStructInfo As Long) As Long

常に方法または回避策があります。検証後もvb6はまだ血を吐いています。動作するc++スタブdllを記述し、vb6から呼び出します。

于 2012-08-03T03:31:31.503 に答える