1

我花了很多时间在谷歌上寻找这个问题的答案。我发现了几段描述解决方案的代码,但大多数都是用 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 使用 openssl_pkey_new 生成的

4

2 回答 2

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++ stub dll确实能用,从vb6调用。

于 2012-08-03T03:31:31.503 回答
0

好吧,我发现我的一个结构有问题(没有将字节数组成员声明为数组)并且我不再遇到崩溃问题。但是,我仍然没有使用 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 生成的公钥:

-----开始公钥----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANWhFRxt/ZF56uGO7GsbvevmX42//thm JdseUwQNot/ihXCPRadf0SPYbtHS6/JA92pCX7NxfgYNoYlOFb0IYYcCAwEAAQ== -----结束公钥-----

于 2012-08-09T16:29:29.910 回答