我应该使用wchar还是char进行加密?

时间:2018-08-22 20:40:39

标签: c++ encryption unicode char wchar

我使用此代码来创建密钥的哈希,以使用Wincrypt加密字符串:

wchar_t key[] = L"123456789AFA11";
wchar_t *key_str = key;
size_t len = lstrlenW(key_str);


DWORD dwStatus = 0;
BOOL bResult = FALSE;
wchar_t info[] = L"Microsoft Enhanced RSA and AES Cryptographic Provider";
HCRYPTPROV hProv;

if (!CryptAcquireContextW(&hProv, NULL, info, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
    dwStatus = GetLastError();
    printf("CryptAcquireContext failed: %x\n", dwStatus);
    CryptReleaseContext(hProv, 0);
    system("pause");
    return dwStatus;
}

HCRYPTHASH hHash;

if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) {      // Note that we will truncate the SHA265 hash to the first 128 bits because we are using AES128.
    dwStatus = GetLastError();
    printf("CryptCreateHash failed: %x\n", dwStatus);
    CryptReleaseContext(hProv, 0);
    system("pause");
    return dwStatus;
}

if (!CryptHashData(hHash, (BYTE*)key_str, len * sizeof(wchar_t), 0)) {
    DWORD err = GetLastError();
    printf("CryptHashData Failed : %#x\n", err);
    system("pause");
    return (-1);
}

如果我使用char代替wchar作为密钥,则加密文本完全不同,因为wchar每个字符2个字节:

char key[] = "123456789AFA11";
char *key_str = key;
size_t len = lstrlenA(key_str);


DWORD dwStatus = 0;
BOOL bResult = FALSE;
wchar_t info[] = "Microsoft Enhanced RSA and AES Cryptographic Provider";
HCRYPTPROV hProv;

if (!CryptAcquireContextA(&hProv, NULL, info, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
    dwStatus = GetLastError();
    printf("CryptAcquireContext failed: %x\n", dwStatus);
    CryptReleaseContext(hProv, 0);
    system("pause");
    return dwStatus;
}

HCRYPTHASH hHash;

if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) {      // Note that we will truncate the SHA265 hash to the first 128 bits because we are using AES128.
    dwStatus = GetLastError();
    printf("CryptCreateHash failed: %x\n", dwStatus);
    CryptReleaseContext(hProv, 0);
    system("pause");
    return dwStatus;
}

if (!CryptHashData(hHash, (BYTE*)key_str, len, 0)) {
    DWORD err = GetLastError();
    printf("CryptHashData Failed : %#x\n", err);
    system("pause");
    return (-1);
}

我的问题是我应该使用哪个来散列键,字符字符串或wchar_t字符串?

另一个问题是我的应用程序中的UTF-8意味着始终使用char,而UTF-16意味着使用wchar_t吗?我在Visual Studio 2017中始终使用UNICODE,然后应该使用wchar,因为WindowsAPI的输出似乎是wchar_t?

1 个答案:

答案 0 :(得分:2)

  

我应该使用哪种哈希密钥,char字符串或wchar_t字符串?

这是个人选择的问题。使用适合您需求的任何一种。加密对原始字节进行操作,它不在乎这些字节代表什么。

  

我的应用中的UTF-8表示始终使用char,而UTF-16表示使用wchar_t?

在Windows上,是的。在大多数其他平台上,wchar_t不是2字节,因此不是UTF-16。

  

我在Visual Studio 2017中始终使用UNICODE,然后应该使用wchar,因为WindowsAPI的输出似乎是wchar_t?

是的,Windows是一个基于Unicode的操作系统,并且其大多数基于字符串的API都期望/返回UTF-16。但是加密API对此并不关心。但是,根据您的情况,您可能应该考虑在加密之前将UTF-16转换为UTF-8,然后在解密后将UTF-8转换为UTF-16。这样,您的加密数据至少会占用更少的存储空间。