我花了很多时间在Google上寻找答案。我发现了几段描述解决方案的代码,但大部分是C,.NET或Java。我的情况是VB6。
我有一个相当简单的RSA1应用程序:签署一些数据(在“appA”中使用私钥),然后验证签名(在“appB”中使用公钥,这是VB6应用程序)。现在一切都通过CryptoAPI库运行良好。
“appA”签名部分需要移动到unix服务器并由OpenSSL(最好)执行。问题是将密钥格式从PEM转换为CryptoAPI期望的PublicKeyBlob。
我试图将this C code移植到VB。 CryptStringToBinary成功但CryptDecodeObjectEx只是挂起然后崩溃VB。
我无法在VB中找到任何显示此用法的文档。我不确定它是否可能。我希望有人能够对此有所了解。我也尝试过CryptDecodeObject(没有“Ex”)函数,希望缺少所需的所有结构可以解决问题......但同样的问题。
我的测试密钥是由OpenSSL使用openssl_pkey_new
生成的答案 0 :(得分: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调用它。
答案 1 :(得分: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 == ----- END PUBLIC KEY -----