Уважаемые гуру,помогите пожалуйста. Пишу программу которая шифрует и расшифровует текст.Шифрование происходит на основе пароля. Так вот если пароль слабенький то все нормально шифруеться,а если сложный ,например @@@@,то в зависимости от алгоритма хеширования,и от алгоритма шифрование,данные шифруються коректно,но могут и не коректно шифроваться.Вот например если у мен алгоритм хеширования MD2 и алгоритм шифрования RC4 то из строки которую я зашифрую,независимо от ее размера и содержания строки зашифрованые данные могут быть из 3 символов,например шифрую слово ][aker ,потом расшифровую и получаю ][ak.Шифрую другое слово,оно расшифровуеться.Короче суть проблемы,данные не коректно шифруються,в зависимости от введеного пароля и от размера строки.ПОМОГИТЕ очень прошу!!!!!!!!!!!!!!!!!! Во всех примерах из гугла у меня практически идентичный код.
А вот теперь объясни нафига для КРИПТОГРАФИИ использовать функции ХЕШИРОВАНИЯ? Тебе что криптоалгоритмов мало? Ну хоть тот же избитый 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 - алгоритмы хэширования.
Я ввожу пароль,хеширую его,на основе хеша получаю сесионный ключ,при помощи ключа шифрую. Расшифровка происходит также само.
Не набивай посты, я уже написал, что любой MD алгоритм это ХЕШ! Что есть CryptoAPI? Микрософтовская нашлепка для работы с криптопровайдерами или алгоритм?
Посты я не набиваю,мне нужен рабочий код Ето я знаю без тебя,просто спишил когда писал сообщение и место RC4 написал MD4
Ты уж извини, но "Очепятка" такая маленькая, что прям не заметить... Для начала (на знаю как на c ++, я на vb писал) перегони все данные в юникод, затем проверь функции вычисления хеша (это для галочки, ибо смоневаюсь, что проблема в нем) и шифровки/дешифровки, далее если не поможет, выложи код, а то у меня маны на телепатию не хватает Кстати почитай [link]http://ru.wikipedia.org/wiki/Симметричные_криптосистемы[/link] тебе будет полезно, раз в криптографию полез
Вот смотри 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),то оно расшифруеться нормально.
Вот у меня возникает вопрос,с чем ето связано,ведь с темже ключем другое слово нормально шифруеться и расшифровуеться.
Немного не в тему. Зачем тебе для шифрования текста использовать поточный алгоритм? Гораздо удобнее, а главное логичнее, использовать блочные алгоритмы. Твоя проблема может быть вот в чем. Ты шифруешь данные, на выходе получается массив байт, подчеркиваю - массив байт, а не строка. Потом ты этот массив подаешь на вход расшифровки как строку. Где-то в этом массиве попадается ноль, который интерпретируется как конец строки, поэтому расшифровка дальше не идет. Это только предположение, без кода сложно сказать что-то. UPDATE: Глянул код. Как я и говорил, проблема в использовании строк. Замени strcpy и strlen на "буферные" аналоги и будет тебе счастье
А подумай, ведь ][ - это символы, а не алфавит Тебе знающий человек правильно сказал... Зря не прочитал
Извини, не напишу код. Но мысль такая: 1. Если в си есть функции, позволяющие получить длину массива - при расшифровке используй их. 2. Если такх функций нет - пиши отдельную расшифровку, и в нее явно передавай длину
Redeemer, зачем писать? В нете куча сорсов! например http://planet-source-code.com/vb/scripts/BrowseCategoryOrSearchResults.asp?txtCriteria=RC4&lngWId=3 Там я думаю, разберется Если там не поймешь, то велком на hackhound.org, ток английский знать надо...там сорсов крипторов куча))
Возможно пробовал с ошибками. Подожди кого-нибудь, пишущего на сях, с ними быстрей общий язык найдешь. offtop: Люблю паскаль за жесткую типизацию ^_^