PDA

Просмотр полной версии : Как зашифровать данные заданным ключом DES через CryptoAPI


Yazzer
14.05.2009, 17:07
Добрый день. В общем проблема такая. Надо написать алгоритм хеширования LM пароля.

Я получаю два 7 байтых ключа, каждый их которых надо использовать для создания соответственно 2-х 8 байтных DES ключа.

Мне сказали, что теоретически DES шифрование добавляет в каждый байт ключа по биту проверки четности и получается 8 байтовый ключ для DES.

Как это реализовать на C++ Builder?

Пока у меня есть такой вот DES




HCRYPTPROV hCryptProv;
DWORD dwUserNameLen = 100;
LPCSTR UserName= NULL;
HCRYPTKEY hKey=DesKey1;
BYTE data[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
BYTE key[8] = {0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1};
BYTE IV[8] = {0, 0, 0, 0, 0, 0, 0, 0};
CryptAcquireContext(&hCryptProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0);
BYTE bKey[20];
DWORD keyLen = 8;
DWORD dataLen = 8;

BLOBHEADER keyHeader;
keyHeader.bType = PLAINTEXTKEYBLOB;
keyHeader.bVersion = CUR_BLOB_VERSION;
keyHeader.reserved = 0;
keyHeader.aiKeyAlg = CALG_DES;
//move keyHeader into buffer
for(i=0; i<sizeof(keyHeader); i++){
bKey[i] = *((BYTE*) &keyHeader + i);
}
//move keySize into buffer
for(i=0; i<sizeof(keyLen); i++){
bKey[i + sizeof(keyHeader)] = *((BYTE*) &keyLen + i);
}
//move key bytes into buffer
for(i=0; i<8; i++){
bKey[i + sizeof(keyHeader) + sizeof(keyLen)] = key[i];
}
//Import key BLOB
CryptImportKey(hCryptProv, (BYTE*) &bKey, sizeof(keyHeader) + sizeof(DWORD) + 8, 0, 0, &hKey);
//set DES mode
DWORD desMode = CRYPT_MODE_CBC;
CryptSetKeyParam(hKey, KP_MODE, (BYTE*) &desMode, 0);
//set padding mode
DWORD padding = ZERO_PADDING;
CryptSetKeyParam(hKey, KP_MODE, (BYTE*) &desMode, 0);
//set iv
CryptSetKeyParam(hKey, KP_IV, &IV[0], 0);
//Set FALSE to avoid padding
CryptEncrypt(hKey, 0, FALSE, 0, (BYTE*) &data[0], &dataLen, 8);
CryptDestroyKey(hKey);
CryptReleaseContext(hCryptProv, 0);
</code>


и два 7 значных ключа. Правда в Ansi и в 16-м предсталение.