Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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;
}
}

//Ну и как бонус smile.gif функция для формировки заголовка авторизации по логину и паролю:
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 smile.gif

Автор: Ars 15.12.2003, 19:00
Цитата
А где это API и доку найти?

Я, когда занимался этим вопросом, в хелпе по Win32 всю необходимую инфу нашел.

Автор: oleg1973 15.12.2003, 23:00
XOR и все дела smile.gif
от дурака помогает smile.gif

Автор: VisualCraft 16.12.2003, 13:17
А когда дурак не совсем дурак, имеет на руках несколько своих логинов и паролей, результат шифрования и саму программу в которой это делается, имеет право добавлять новых пользователей?

Задача

для такого юзера
1) воспрепятствовать входу под чужим паролем (одностороннее шифрование - метод 1).
2) затруднить идентификацию записей бызы в ручном режиме, чтоб крайне трудно было корректно отредактировать (симметричное шифрование - метод 2).
3) защитить код самой программы (ASPack)
4)Еще бы базу закрыть от всех кроме самой программы. Но база VFP6. Там кажется этого нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)