| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как в C++ Builder 5 зашифровать строку |
| Автор: VisualCraft 15.12.2003, 01:53 |
| Народ подскажите плиз! Как в в C++ Builder 5 зашифровать строку, например логин+пароль. Искал стандартные функции шифрования и не нашел. Пришлось пока свой оригинальный алгоритм смастерить, сгодится за третий сорт... но это не есть гуд. Строка не передается на сервер, а записывается в локальную базу данных пользователя, поэтому нужно шифрование без возможности восстановления исходных логина и пароля по ключу. Но при повторном вводе логина и пароля результат шифрования должен получаться всегда один и тот-же - (128 байтная бинарная последовательность). Это нужно для "защиты от дурака" и частично для защиты данных в пределах рабочей группы. Полностью защитить все равно не удасться. |
| Автор: <Spawn> 15.12.2003, 03:53 |
| Открываешь IndyMisc и смортишь там TidBase64Encoder, TidBase64Decoder, TidUUEncoder, TidUUDecoder и т.д. |
| Автор: Ars 15.12.2003, 11:20 |
| Смотри CryptoAPI (ф-ции CryptEncrypt, CryptDecrypt) |
| Автор: SeregaLBN 15.12.2003, 14:34 |
| алгоритм BASE64: void Base64_code(IN const CHAR* strIn, OUT CString& strOut) { const static CHAR base64ABC[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; strOut.Empty(); const size_t len = strlen(strIn); for(int i=0; i<len; i+=3) { LONG l = ( ((LONG)strIn[i ])<<16 ) | (((i+1) < len) ? (((LONG)strIn[i+1])<<8 ) : 0 ) | (((i+2) < len) ? ( (LONG)strIn[i+2] ) : 0 ); strOut += base64ABC[(l>>18) & 0x3F]; strOut += base64ABC[(l>>12) & 0x3F]; if (i+1 < len) strOut += base64ABC[(l>> 6) & 0x3F]; if (i+2 < len) strOut += base64ABC[(l ) & 0x3F]; } switch (len%3) { case 1: strOut += '='; case 2: strOut += '='; } } void Base64_decode( IN const CHAR* strIn, // на вход - зашифрованная строка OUT CString& strOut // на выход - расшифрованная строка ) { const static CHAR base64ABC[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; strOut.Empty(); const size_t len = strlen(strIn); for (int i=0; i<len; i+=4) { LONG l = (( (strIn[i ] != '=')) ? (((LONG)(strchr(base64ABC, strIn[i ]) - base64ABC)) << 18) : 0) | ((((i+1) < len) && (strIn[i+1] != '=')) ? (((LONG)(strchr(base64ABC, strIn[i+1]) - base64ABC)) << 12) : 0) | ((((i+2) < len) && (strIn[i+2] != '=')) ? (((LONG)(strchr(base64ABC, strIn[i+2]) - base64ABC)) << 6 ) : 0) | ((((i+3) < len) && (strIn[i+3] != '=')) ? ((LONG)(strchr(base64ABC, strIn[i+3]) - base64ABC)) : 0); BYTE ch1 = ((l>>16) & 0xFF); if (ch1) strOut += ch1; BYTE ch2 = ((l>>8 ) & 0xFF); if (ch2) strOut += ch2; BYTE ch3 = ( l & 0xFF); if (ch3) strOut += ch3; } } //Ну и как бонус void GetHeaderAuthorization( IN const CString& strLogin, // на вход - строка с логином IN const CString& strPassword, // на вход - строка с паролем OUT CString& strHeaderAuthorization // на выход - сторка, содержащая заголовок авторизации ){ CString strLoginPass(strLogin + ':' + strPassword); // формирую строку для шифрования CString strEncode; // сторка, где будет содержаться результат шифрования Base64_code(strLoginPass, strEncode); // шифрование strHeaderAuthorization = CString("Authorization: Basic " + strEncode + "\r\n"); // формирую заголовок авторизации } |
| Автор: VisualCraft 15.12.2003, 18:39 |
| Ars,Spawn,SeregaLBN мучас грациес за вспомоществование! Буду пилить... Ars А где это API и доку найти? SeregaLBN Спасибо за алгоритм, я оказывается что-то в этом роде сварганил, только без массива, типа BASE256 |
| Автор: Ars 15.12.2003, 19:00 | ||
Я, когда занимался этим вопросом, в хелпе по Win32 всю необходимую инфу нашел. |
| Автор: oleg1973 15.12.2003, 23:00 |
| XOR и все дела от дурака помогает |
| Автор: VisualCraft 16.12.2003, 13:17 |
| А когда дурак не совсем дурак, имеет на руках несколько своих логинов и паролей, результат шифрования и саму программу в которой это делается, имеет право добавлять новых пользователей? Задача для такого юзера 1) воспрепятствовать входу под чужим паролем (одностороннее шифрование - метод 1). 2) затруднить идентификацию записей бызы в ручном режиме, чтоб крайне трудно было корректно отредактировать (симметричное шифрование - метод 2). 3) защитить код самой программы (ASPack) 4)Еще бы базу закрыть от всех кроме самой программы. Но база VFP6. Там кажется этого нет. |