2012-08-03 112 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公鑰-----

相關問題