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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Yazzer, 14 May 2009.

  1. Yazzer

    Yazzer New Member

    Joined:
    13 May 2009
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Добрый день. В общем проблема такая. Надо написать алгоритм хеширования LM пароля.

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

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

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

    Пока у меня есть такой вот DES
    Code:
    
    
    
    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-м предсталение.