首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将OpenSSL密钥转换为CryptoAPI

将OpenSSL密钥转换为CryptoAPI
EN

Stack Overflow用户
提问于 2012-08-03 08:45:34
回答 2查看 1.5K关注 0票数 1

我花了相当多的时间在谷歌上寻找这个问题的答案。我找到了几段描述解决方案的代码,但大多数都是用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生成的

EN

回答 2

Stack Overflow用户

发布于 2012-08-03 11:31:32

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

代码语言:javascript
复制
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++存根动态链接库来工作并从vb6调用它。

票数 0
EN

Stack Overflow用户

发布于 2012-08-10 00:29:30

嗯,我发现我的一个结构有问题(没有将字节数组成员声明为数组),我不再有崩溃问题。然而,我仍然没有在CryptDecodeObject上取得任何成功。下面的代码就是我正在使用的代码。GetLastErr只返回0(没有太多帮助)。如果有人对我可能出错的地方有什么想法,请让我知道!

代码语言:javascript
复制
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公钥- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANWhFRxt/ZF56uGO7GsbvevmX42//thm JdseUwQNot/ihXCPRadf0SPYbtHS6/JA92pCX7NxfgYNoYlOFb0IYYcCAwEAAQ== -END公钥

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11787811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档