簡體   English   中英

如何正確將未簽名的char *從C dll封送至C#

[英]How to correctly marshal unsigned char* from c dll to c#

我正在嘗試准備一個基於GUI的簡單AES-CMAC計算器。為此,我決定從打開的ssl庫中創建c dll。[我不想使用.net來計算AES-CMAC]。此DLL已通過測試使用c ++(控制台)創建的測試應用程序,並根據測試向量生成值。 但是,當我嘗試從c#調用此函數時,我得到了錯誤的值。在這里,我使用的是byte []而不是unsigned char *。

我的C函數代碼段是

double calc_AES_CMAC(unsigned char* message ,unsigned char* key,unsigned char* cmac_16)
{

    size_t mactlen;

    CMAC_CTX *ctx = CMAC_CTX_new();
    CMAC_Init(ctx, key, 16, EVP_aes_128_cbc(), NULL);
    CMAC_Update(ctx, message, sizeof(message));
    CMAC_Final(ctx, cmac_16, &mactlen);
    CMAC_CTX_free(ctx);

    return 0;
}

我調用的C#代碼是

首先功能導入

[DllImport("C:\\Users\\Sudhanwa\\Documents\\Visual Studio 2010\\Projects\\Ccsharpdll\\Debug\\Ccsharpdll.dll", CallingConvention = CallingConvention.Cdecl)]

public static extern double calc_AES_CMAC(byte[] message, byte[] key, byte[] output);

其次按鈕點擊事件

byte [] null_arr = new byte[16];
// K: 2b7e1516 28aed2a6 abf71588 09cf4f3c
byte[] key = { 0x2b,0x7e,0x15,0x16,
0x28,0xae,0xd2,0xa6,
0xab,0xf7,0x15,0x88,
0x09,0xcf,0x4f,0x3c };

// M: 6bc1bee2 2e409f96 e93d7e11 7393172a Mlen: 128
byte[] message= { 0x6b,0xc1,0xbe,0xe2,
0x2e,0x40,0x9f,0x96,
0xe9,0x3d,0x7e,0x11,
0x73,0x93,0x17,0x2a };

byte [] cmac = new byte [16];

c = calc_AES_CMAC(message, key, cmac);
string ans = ByteArrayToString(cmac);
MessageBox.Show(ans);

在此代碼中,我得到了16字節的十六進制輸出,但這與正確的結果不匹配。

您需要向marshaller指示您希望在輸出參數中返回數據(以及返回多少數據):

public static extern double calc_AES_CMAC(byte[] message, byte[] key, 
    [In, Out, MarshalAs(UnmanagedType.LPArray, SizeConst=16)] byte[] output);

否則,數組當前內容的副本將被傳遞給C ++函數,但任何修改都不會被復制回C#調用者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM