【问题标题】:Convert OpenSSL key to CryptoAPI将 OpenSSL 密钥转换为 CryptoAPI
【发布时间】:2012-08-01 00:50:44
【问题描述】:

我在谷歌上花了很多时间来寻找这个问题的答案。我发现了几段描述解决方案的代码,但大多数都是用 C、.NET 或 Java 编写的。我的情况是VB6。

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

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

我尝试将this C code 移植到VB。 CryptStringToBinary 成功,但 CryptDecodeObjectEx 只是挂起,然后 VB 崩溃。

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

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

【问题讨论】:

    标签: openssl rsa cryptoapi


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我的声明很好,但我感觉我的 PCRYPT_DECODE_PARA(以及所有相关结构)没有正确声明。我找不到任何关于它们的 VB 文档,只有标准的 C 结构定义。由于某些原因,我不能有任何外部依赖项,所以 C 存根现在已经出来了。我可以试试 PHPSecLib,看看我是否可以让 XML 编码的密钥在两端都工作。看来 CryptoAPI 支持这些。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多