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.
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 –