2012-08-03 3 views
1

J'ai passé pas mal de temps sur Google à chercher la réponse à cette question. J'ai trouvé plusieurs morceaux de code décrivant des solutions mais la plupart sont en C, .NET ou Java. Mon cas est VB6. J'ai une application RSA1 assez simple: signer des données (en "appA" avec une clé privée), puis valider la signature (en "appB" avec la clé publique, c'est l'application VB6). À l'heure actuelle tout fonctionne correctement via la bibliothèque CryptoAPI.Convertir la clé OpenSSL en CryptoAPI

La partie de signature "appA" doit être déplacée vers un serveur Unix et exécutée par OpenSSL (de préférence). Le problème est la conversion du format de clé de PEM à PublicKeyBlob que CryptoAPI attend.

J'ai essayé de porter this C code à VB. CryptStringToBinary réussit mais CryptDecodeObjectEx se bloque puis se bloque VB.

Je n'ai pas été en mesure de trouver toute la documentation montrant cette utilisation dans VB. Je ne suis pas sûr que ce soit possible même. J'espère que quelqu'un sera en mesure de faire la lumière sur ce sujet. J'ai aussi essayé la fonction CryptDecodeObject (sans "Ex") en espérant que le manque de toutes les structures nécessaires résoudrait le problème ... mais le même problème.

Ma clé de test a été généré par OpenSSL openssl_pkey_new

Répondre

0

Thee que les choses que je peux penser est de vérifier pour vous assurer que vos déclarations sont justes et déboguer/imprimer les paramaters vous passez, et vérifiez qu'ils sont corrects.

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 

Il y a toujours une façon ou d'une solution de contournement, VB6 est encore tousser du sang après vérification, il suffit d'écrire un C++ dll stub qui fonctionne et l'appeler de VB6.

+0

Merci. Mes déclarations sont correctes, mais j'ai l'impression que mon PCRYPT_DECODE_PARA (et toutes les structures associées) ne sont pas déclarées correctement. Je n'ai pas pu trouver de documentation sur eux pour VB, seulement les defauts de structure C standard. Pour certaines raisons, je ne peux pas avoir de dépendances externes, donc un bout de C est sorti pour l'instant. Je peux essayer PHPSecLib et voir si je peux obtenir des clés codées XML travaillant sur les deux extrémités. Il semble que CryptoAPI les supporte. –

0

Eh bien, j'ai trouvé un problème avec l'une de mes structures (je n'ai pas déclaré un membre de tableau d'octets en tant que tableau) et je n'ai plus de problèmes de plantage. Cependant, je n'ai toujours pas de succès avec CryptDecodeObject. Le code ci-dessous est ce que je travaille avec. GetLastErr renvoie juste 0 (pas beaucoup d'aide). Si quelqu'un a une pensée sur où je peux aller mal, s'il vous plaît faites le moi savoir!

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 

je peux poster toutes les fonctions et le type de déclarations si quelqu'un pense qu'il va aider, je crois qu'ils sont corrects.

est ici la clé publique comme générée par OpenSSL:

----- ----- BEGIN CLE PUBLIQUE MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANWhFRxt/ZF56uGO7GsbvevmX42 // thm JdseUwQNot/ihXCPRadf0SPYbtHS6/JA92pCX7NxfgYNoYlOFb0IYYcCAwEAAQ == --- --END PUBLIC KEY -----

Questions connexes