2009-02-05 10 views
0

J'essaye d'appeler P/Invoke dans CryptImportKey à partir de C# pour définir une clé connue avant de crypter des données qui seront décryptées dans un service C++ Win32 à un moment donné. J'ai la signature de la méthode pour le P/Invoke et que tout fonctionne bien, mais je ne peux pas l'obtenir pour accepter mon blob clé. Les structures C++ sont dans les commentaires ci-dessous et mes C# pour le marshaling sont dessous.P/Invocation de structures CryptImportKey et marshaling

 // typedef struct _PUBLICKEYSTRUC 
    // { 
    // BYTE bType; 
    // BYTE bVersion; 
    // WORD reserved; 
    // ALG_ID aiKeyAlg; 
    // } BLOBHEADER, PUBLICKEYSTRUC; 
    [StructLayout(LayoutKind.Sequential)] 
    public struct PUBLICKEYSTRUC 
    { 
     public Byte bType; 
     public Byte bVersion; 
     public Int16 reserved; 
     public Int32 aiKeyAlg; 
    } 

    //typedef struct __KEYBLOB 
    //{ 
    // BLOBHEADER hdr; 
    // DWORD cbKeySize; 
    // BYTE* rgbKeyData; 
    //} KEYBLOB; 

    [StructLayout(LayoutKind.Sequential)] 
    public struct KEYBLOB 
    { 
     public PUBLICKEYSTRUC hdr; 
     public Int16 cbKeySize; 
     public Byte[] rgbKeyData; 
    } 

J'utilise ensuite:

 int len = (Marshal.SizeOf(typeof(PUBLICKEYSTRUC) + Marshal.SizeOf(typeof(KEYBLOB)) + KeySize; 
     byte[] arr = new byte[len]; 
     IntPtr ptr = Marshal.AllocHGlobal(len); 
    Marshal.StructureToPtr(keyBlob, ptr, true); 
    Marshal.Copy(ptr, arr, 0,len); 
     Marshal.FreeHGlobal(ptr); 

Pour obtenir dans un tableau d'octets pour passer à CryptImportKey mais il semble ne jamais prendre la clé avec elle et quand je Chiffrer avec ce que je reçois un texte différent de chiffrement le temps suggère qu'il n'utilise pas ma clé.

EDIT:

La substance clé blob est à partir du code C++ je qui peut chiffrer avec succès et déchiffrer les données. Je pense que vous avez peut-être un point à propos de l'inclusion de l'en-tête deux fois mais le principal problème que j'ai est la valeur de l'octet [] rgbKeyData n'est pas placé dans le tableau byte arr.

Répondre

0

Here est une liste de structures/importations, qui semble assez prometteuse. Je ne l'ai pas testé par moi-même, cependant.

Edit:
Lorsque vous calculez la taille de votre blob: pourrait-il vous comptez réellement l'en-tête deux fois? D'ailleurs, comment avez-vous dérivé la déclaration de votre structure KEYBLOB?

+0

C'est là que j'ai obtenu la signature de la méthode mais ce n'est pas utile pour les structures, je pense que je me trompe. Merci quand même –

0

D'un autre côté, pourquoi vous ennuyez-vous avec tous ces trucs P/Invoke ici? Le .NET Framework a des classes intégrées pour faire tout cela pour vous.

En supposant que vous utilisez le cryptage RSA, la classe RSACryptoServiceProvider fournit une méthode ImportParameters qui accepte un objet RSAParameters.
Propre, simple et la bonne façon de le faire.

Y a-t-il une raison pour laquelle vous ne pouvez pas l'utiliser?

+0

RSACryptoServiceProvider a été introduit dans .NET 3.5 et nous sommes bloqués sur .NET 2.0 :( –

+0

Pas du tout - Existe certainement dans 2.0, à peu près sûr qu'il était là à partir de 1.0/1.1 :-). Vérifiez à nouveau - il devrait être là dans System.Security.Cryptography. Comment faites-vous le reste du cryptage, est-ce tout par P/Invoke ...? – AviD

+0

Yup et tous mes p/invoke travaillent en dehors de celui-ci. J'ai essayé RijdaelManaged (sp?) Mais je ne pourrais pas l'obtenir pour décrypter avec l'API Win32 Crypto. Avec toutes les choses égales (clés, sels et IVs) essayant de déchiffrer le texte de chiffrement a échoué. –

Questions connexes