将OpenSSL密钥转换为CryptoAPI

将OpenSSL密钥转换为CryptoAPI,openssl,rsa,cryptoapi,Openssl,Rsa,Cryptoapi,我花了很多时间在谷歌上搜索这个问题的答案。我发现了几段描述解决方案的代码,但大多数都是C、.NET或Java。我的案例是VB6 我有一个非常简单的RSA1应用程序:签署一些数据(在“appA”中使用私钥),然后验证签名(在“appB”中使用公钥,这是VB6应用程序)。现在,通过CryptoAPI库,一切都正常运行 “appA”签名部分需要移动到unix服务器上,并由OpenSSL执行(最好)。问题在于将密钥格式从PEM转换为CryptoAPI所期望的PublicKeyBlob 我已经尝试移植到V

我花了很多时间在谷歌上搜索这个问题的答案。我发现了几段描述解决方案的代码,但大多数都是C、.NET或Java。我的案例是VB6

我有一个非常简单的RSA1应用程序:签署一些数据(在“appA”中使用私钥),然后验证签名(在“appB”中使用公钥,这是VB6应用程序)。现在,通过CryptoAPI库,一切都正常运行

“appA”签名部分需要移动到unix服务器上,并由OpenSSL执行(最好)。问题在于将密钥格式从PEM转换为CryptoAPI所期望的PublicKeyBlob

我已经尝试移植到VB。CryptStringToBinary成功,但CryptDecodeObjectEx只是挂起然后崩溃

我还没有找到任何在VB中显示这种用法的文档。我甚至不确定这是否可能。我希望有人能对此有所了解。我还尝试了CryptDecodeObject(sans“Ex”)函数,希望缺少所需的所有结构可以解决这个问题。。。但同样的问题


我的测试密钥是由OpenSSL使用OpenSSL_pkey_new生成的

我唯一能想到的是检查以确保您的声明是正确的,并调试/打印您传递的参数并验证它们是否正确

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调用它。

< P>,我发现了一个结构的问题(没有声明一个字节数组成员作为数组),并且我不再有崩溃问题。然而,我仍然没有在CryptoDecodeObject方面取得任何成功。下面的代码就是我正在使用的代码。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生成的公钥:

-----开始公钥----- MFWWDQYJKOZHIHVCNAQEBQADSWAWSAJBANWHFRXT/ZF56uGO7GsbvevmX42//thm JdseUwQNot/IHXCPRADF0SPYBTH6/JA92PCX7NxFGYNOYLOFB0IYYCCAWEAQ==
-----结束公钥------

谢谢。我的声明很好,但我感觉我的PCRYPT_DECODE_PARA(以及所有相关结构)没有正确声明。我还没有找到任何关于VB的文档,只有标准的C结构def。由于某些原因,我不能有任何外部依赖项,所以C存根现在已经过时了。我可以尝试一下PHPSecLib,看看是否可以让XML编码的密钥在两端都工作。CryptoAPI似乎支持这些。