Проблема с CryptDeriveKey

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ShkiperLol, 12 Aug 2010.

  1. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Уважаемые гуру,помогите пожалуйста.
    Пишу программу которая шифрует и расшифровует текст.Шифрование происходит на основе пароля.
    Так вот если пароль слабенький то все нормально шифруеться,а если сложный ,например @@@@,то в зависимости от алгоритма хеширования,и от алгоритма шифрование,данные шифруються коректно,но могут и не коректно шифроваться.Вот например если у мен алгоритм хеширования MD2 и алгоритм шифрования RC4 то из строки которую я зашифрую,независимо от ее размера и содержания строки зашифрованые данные могут быть из 3 символов,например шифрую слово ][aker ,потом расшифровую и получаю ][ak.Шифрую другое слово,оно расшифровуеться.Короче суть проблемы,данные не коректно шифруються,в зависимости от введеного пароля и от размера строки.ПОМОГИТЕ очень прошу!!!!!!!!!!!!!!!!!!
    Во всех примерах из гугла у меня практически идентичный код.
     
    #1 ShkiperLol, 12 Aug 2010
    Last edited: 12 Aug 2010
  2. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    536
    Likes Received:
    200
    Reputations:
    293
    А вот теперь объясни нафига для КРИПТОГРАФИИ использовать функции ХЕШИРОВАНИЯ?
    Тебе что криптоалгоритмов мало? Ну хоть тот же избитый RC4 сорсы которого лежат везде...
    Ты в курсе, что на каждом из языков программирования при использовании функции md5 может получиться разный результат? И не потому что языки разные, а потому что портирован он был недоучкой!

    Вот кстати пример RC4 на с++, могу на vb или vb.net подкинуть...

    Code:
    unsigned char S[256];
    unsigned int i, j;
     
    /* ключевое расписание */
    void rc4_init(unsigned char *key, unsigned int key_length) {
      unsigned char temp;
     
        for (i = 0; i != 256; i++)
            S[i] = i;
     
        for (i = j = 0; i != 256; i++) {
            j = (j + key[i % key_length] + S[i]) & 255;
            temp = S[i];
            S[i] = S[j];
            S[j] = temp;
        }
     
        i = j = 0;
    }
     
    /* Вывод одного псевдослучайного байта */
    unsigned char rc4_output() {
        unsigned char temp;
     
        i = (i + 1) & 255;
        j = (j + S[i]) & 255;
     
        temp = S[j];
        S[j] = S[i];
        S[i] = temp;
     
        return S[(temp + S[j]) & 255];
    } 
    Пример взят из вики http://ru.wikipedia.org/wiki/RC4...

    З.Ы. MDX/SHXXX - алгоритмы хэширования.
     
    #2 z0mbyak, 12 Aug 2010
    Last edited: 12 Aug 2010
  3. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0

    Я ввожу пароль,хеширую его,на основе хеша получаю сесионный ключ,при помощи ключа шифрую.

    Расшифровка происходит также само.
     
  4. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Зачем весь етот бред писать.если в CryptoApi уже все ето написано.
     
  5. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Ето мне безразлично,так как я пишу на С++,и не использую других языков.
     
  6. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    536
    Likes Received:
    200
    Reputations:
    293
    Не набивай посты, я уже написал, что любой MD алгоритм это ХЕШ!
    Что есть CryptoAPI? Микрософтовская нашлепка для работы с криптопровайдерами или алгоритм?
     
    #6 z0mbyak, 12 Aug 2010
    Last edited: 12 Aug 2010
  7. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Посты я не набиваю,мне нужен рабочий код
    Ето я знаю без тебя,просто спишил когда писал сообщение и место RC4 написал MD4
     
  8. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    536
    Likes Received:
    200
    Reputations:
    293
    Ты уж извини, но "Очепятка" такая маленькая, что прям не заметить...
    Для начала (на знаю как на c ++, я на vb писал) перегони все данные в юникод, затем проверь функции вычисления хеша (это для галочки, ибо смоневаюсь, что проблема в нем) и шифровки/дешифровки, далее если не поможет, выложи код, а то у меня маны на телепатию не хватает:)
    Кстати почитай [link]http://ru.wikipedia.org/wiki/Симметричные_криптосистемы[/link] тебе будет полезно, раз в криптографию полез:)
     
    #8 z0mbyak, 12 Aug 2010
    Last edited: 12 Aug 2010
  9. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Вот смотри

    Code:
    #include <iostream.h>
    char* Code(char* word, bool x){
    HCRYPTPROV hProv;
    HCRYPTHASH hash;
    HCRYPTKEY key;
    DWORD len;
    char psw[]="@@@@";
    char buff[4096];
    CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
    CRYPT_VERIFYCONTEXT);
    CryptCreateHash(hProv, CALG_MD2, NULL, NULL, &hash);
    CryptHashData (hash, psw, strlen(psw), NULL);
    CryptDeriveKey (hProv, CALG_RC4, hash, 0, &key);
    CryptDestroyHash (hash);
    strcpy(buff, word);
    len=strlen(buff);
    if (x)CryptEncrypt (key,0,true,0,(BYTE*)buff, &len, len);
    else CryptDecrypt (key,0,false,0, (BYTE*)buff, &len);
    CryptReleaseContext (hProv, NULL);
    return buff; 
    }
    int main(int argc, char* argv[])
    {
     char*t=Code("Zimper",true);
     cout<<t<<"\n";
     cout<<Code(t,false);
     Sleep(40000);
            return 0;
    }
    
    При расшифровке слово Zimper расшифровуеться неполностью а только 3 первых буквы.
    Но если написать ][akep(ето слово такой же длины как и Zimper),то оно расшифруеться нормально.
     
  10. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Вот у меня возникает вопрос,с чем ето связано,ведь с темже ключем другое слово нормально шифруеться и расшифровуеться.
     
  11. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Немного не в тему. Зачем тебе для шифрования текста использовать поточный алгоритм? Гораздо удобнее, а главное логичнее, использовать блочные алгоритмы.

    Твоя проблема может быть вот в чем. Ты шифруешь данные, на выходе получается массив байт, подчеркиваю - массив байт, а не строка. Потом ты этот массив подаешь на вход расшифровки как строку. Где-то в этом массиве попадается ноль, который интерпретируется как конец строки, поэтому расшифровка дальше не идет.
    Это только предположение, без кода сложно сказать что-то.

    UPDATE:
    Глянул код. Как я и говорил, проблема в использовании строк. Замени strcpy и strlen на "буферные" аналоги и будет тебе счастье
     
    #11 Redeemer, 12 Aug 2010
    Last edited: 12 Aug 2010
  12. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Дело в том что данная проблема возникает и при шифровании блочными алгоритмами.
     
  13. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Второй абзац моего поста ты проигнорировал? Зря) А теперь там еще апдейт есть)
     
    1 person likes this.
  14. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    536
    Likes Received:
    200
    Reputations:
    293
    А подумай, ведь ][ - это символы, а не алфавит:)
    Тебе знающий человек правильно сказал...
    Зря не прочитал:)
     
    #14 z0mbyak, 12 Aug 2010
    Last edited: 12 Aug 2010
  15. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Можете показать пример?Очень вас прошу.
     
  16. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Я не пишу на си, но щас попробую накидать. Синтаксические ошибки поисправляешь сам если что)))
     
  17. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Извини, не напишу код. Но мысль такая:
    1. Если в си есть функции, позволяющие получить длину массива - при расшифровке используй их.
    2. Если такх функций нет - пиши отдельную расшифровку, и в нее явно передавай длину
     
  18. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    536
    Likes Received:
    200
    Reputations:
    293
    Redeemer, зачем писать? В нете куча сорсов! например http://planet-source-code.com/vb/scripts/BrowseCategoryOrSearchResults.asp?txtCriteria=RC4&lngWId=3
    Там я думаю, разберется:)
    Если там не поймешь, то велком на hackhound.org, ток английский знать надо...там сорсов крипторов куча:)))
     
  19. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    И то и другое я уже пробывал много раз,над данной проблемой мучаюсь уже больше двух недель(((
     
  20. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Возможно пробовал с ошибками.
    Подожди кого-нибудь, пишущего на сях, с ними быстрей общий язык найдешь.

    offtop: Люблю паскаль за жесткую типизацию ^_^