2012-08-03 77 views
1

我花了相当多的时间在Google上搜索这个答案。我发现了几段描述解决方案的代码,但大多数都在C,.NET或Java中。我的情况是VB6。我有一个非常简单的RSA1应用程序:用私钥签名一些数据(在“appA”中),然后验证签名(在“appB”中使用公钥,这是VB6应用程序)。现在一切都通过CryptoAPI库运行良好。将OpenSSL密钥转换为CryptoAPI

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

我试图将端口this C code连接到VB。 CryptStringToBinary成功,但CryptDecodeObjectEx只是挂起然后崩溃VB。

我一直无法找到任何文档显示在VB中使用。我不确定甚至可能。我希望有人能够阐明这一点。我也尝试过CryptDecodeObject(无“Ex”)函数,希望缺少所有需要的结构可以解决问题......但同样的问题。使用openssl_pkey_new

回答

0

祢唯一的东西我能想到的是检查,以确保你的声明是正确的,调试/打印出你逝去的PARAMATERS并验证它们是正确的OpenSSL的生成

我测试的关键。

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

+0

谢谢。我的声明很好,但我有一种感觉,我的PCRYPT_DECODE_PARA(和所有关联的结构)没有正确声明。我还没有找到任何有关VB的文档,只有标准的C结构。由于某些原因,我不能有任何外部依赖,所以现在C存根已经出来了。我可能会试一试PHPSecLib,看看我能否在两端都使用XML编码的密钥。看来CryptoAPI支持这些。 – 2012-08-09 13:47:14

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的生成的公开密钥:

----- BEGIN PUBLIC KEY ----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANWhFRxt/ZF56uGO7GsbvevmX42 // THM JdseUwQNot/ihXCPRadf0SPYbtHS6/JA92pCX7NxfgYNoYlOFb0IYYcCAwEAAQ == --- --END公钥-----

相关问题