我应该使用 wchar 还是 char 来加密?
Should I use wchar or char to encrypt?
我使用此代码创建密钥的散列以使用 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?
which should I use to hash the key, char string or wchar_t string?
这是个人选择的问题。使用适合您需要的任何一种。加密对原始字节进行操作,它不关心这些字节代表什么。
UTF-8 in my apps means to use always char and UTF-16 means the use of wchar_t?
在 windows 上,是的。 wchar_t
在大多数其他平台上不是 2 个字节,因此不是 UTF-16。
I use always UNICODE in Visual Studio 2017 then should I use wchar since WindowsAPI's outputs seems to be wchar_t?
是的,Windows 是一个基于 Unicode 的 OS,它的大多数基于字符串的 API expect/return UTF-16。但是加密 API 不关心这个。但是,在您的情况下,您可能应该考虑在加密之前将 UTF-16 转换为 UTF-8,然后在解密之后将 UTF-8 转换为 UTF-16。这样一来,您的加密数据占用的存储空间就更少了 space,至少。
我使用此代码创建密钥的散列以使用 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?
which should I use to hash the key, char string or wchar_t string?
这是个人选择的问题。使用适合您需要的任何一种。加密对原始字节进行操作,它不关心这些字节代表什么。
UTF-8 in my apps means to use always char and UTF-16 means the use of wchar_t?
在 windows 上,是的。 wchar_t
在大多数其他平台上不是 2 个字节,因此不是 UTF-16。
I use always UNICODE in Visual Studio 2017 then should I use wchar since WindowsAPI's outputs seems to be wchar_t?
是的,Windows 是一个基于 Unicode 的 OS,它的大多数基于字符串的 API expect/return UTF-16。但是加密 API 不关心这个。但是,在您的情况下,您可能应该考虑在加密之前将 UTF-16 转换为 UTF-8,然后在解密之后将 UTF-8 转换为 UTF-16。这样一来,您的加密数据占用的存储空间就更少了 space,至少。