Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Micren
Статус: Практикант
Рейтинг: 213
∙ повысить рейтинг >>
Лысков Игорь Витальевич
Статус: Профессионал
Рейтинг: 137
∙ повысить рейтинг >>
AMV007
Статус: 2-й класс
Рейтинг: 55
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1319 от 31.05.2009, 22:35
Администратор рассылки: Dr_Andrew, Младший модератор
В рассылке: подписчиков - 628, экспертов - 142
В номере: вопросов - 1, ответов - 2

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 168354: Нигде не могу найти опубликованные коды реализации криптоалгоритма 3DES. По словам преподавателя в университете, они существуют. Собственно, как можно реализовать алгоритм 3DES в C++, скажем для шифрования сообщения, предположим вводимого в...



Вопрос № 168354:

Нигде не могу найти опубликованные коды реализации криптоалгоритма 3DES.
По словам преподавателя в университете, они существуют.
Собственно, как можно реализовать алгоритм 3DES в C++,
скажем для шифрования сообщения, предположим вводимого в программе (или файла)?

Отправлен: 26.05.2009, 22:09
Вопрос задал: Ishly, Посетитель
Всего ответов: 2
Страница вопроса >>


Отвечает AMV007, 2-й класс :
Здравствуйте, Ishly.
пот пример : www.amv007.narod.ru/DES3DES.ZIP

Приложение:

-----
Работать, работать и еще раз работать (да не, шутка :) )

Ответ отправил: AMV007, 2-й класс
Ответ отправлен: 26.05.2009, 22:33

Оценка ответа: 5
Комментарий к оценке:
Спасибо, как я понял, это будет выполняться в console application...

Если так, то builder ругается на строку: friend triple_des;
И пишет: Friends must be function of classes.

Только не понятно почему, ведь ранее "triple_des" был задан "как class".

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 249880 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Отвечает Micren, Практикант :
    Здравствуйте, Ishly
    Хотелось бы Вам показать как это можно сделать в знакомой(наверное) Вам ОС Windows.
    Дело в том, что Windows имеет в своем составе интерфейс CryptoAPI. И поддерживает большинство популярных алгоритмов шифрования данных. Например: AES,DES,3DES,RSA,Diffie-Hellman и др.
    Пример программы:
    Код:

    #include <locale>
    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <Windows.h>

    using namespace std;

    int main()
    {
    locale::global(locale("russian_russia.866"));

    // Введем строку для шифрования
    wcout<<L"Введите строку, какую Вы хотели бы зашифровать(secret):"<<endl;
    wstring secret;
    getline(wcin,secret);

    // Буфер для работы алгоритмов шифрования
    BYTE* buffer;

    try
    {
    // Размер строки в памяти
    size_t strAllocSize=sizeof(wstring::value_type)*secret.length();
    // Размер буфера должен быть немного больше
    size_t bufferSize=strAllocSize+8;
    // Выделяем память под буфер
    buffer=new BYTE[bufferSize];

    #pragma warning(disable:4996)
    // Копируем строку в буфер
    secret.copy(reinterpret_cast<wstring::value_type*>(buffer),secret.length(),0);
    #pragma warning(default:4996)

    // Crypto Sevice Provider
    HCRYPTPROV provider;
    // Попытаемся получить CSP
    if(!CryptAcquireContext(&provider,0,MS_ENHANCED_PROV,PROV_RSA_FULL,0))
    {
    throw L"Не получилось получить CSP";
    }

    // Ключ для шифрования
    HCRYPTKEY key;
    // Сгенерируем ключ
    if(!CryptGenKey(provider,CALG_3DES,CRYPT_EXPORTABLE,&key))
    {
    throw L"Ошибка генерации ключа";
    }

    // Демонстрация экспорта ключа
    // Для работы этой программы не нужна, но если есть желание
    // расшифровать данные где то еще, то ключ необходим

    // Сюда будем экспортировать
    BYTE* keyBlob=0;
    // Длина ключа
    DWORD keyBlobLength=0;
    // Получим размер ключа
    if(!CryptExportKey(key,0,PLAINTEXTKEYBLOB,0,0,&keyBlobLength))
    {
    throw L"Не получилось вычислить длину ключа";
    }
    // Выделим память для ключа
    keyBlob=new BYTE[keyBlobLength];
    // Экспорт ключа
    if(!CryptExportKey(key,0,PLAINTEXTKEYBLOB,0,keyBlob,&keyBlobLength))
    {
    throw L"Не получилось экспортировать ключ";
    }

    // Распечатаем его
    wcout<<endl<<L"Сгенерирован ключ(hex):"<<endl;
    for(size_t i=0;i<keyBlobLength;++i)
    {
    wcout<<hex<<keyBlob[i];
    }
    wcout<<endl;
    // Освободим память за ненадобностью
    delete[] keyBlob;

    // Размер наших данных для шифрования
    DWORD dataSize=strAllocSize;
    // Шифруем
    if(!CryptEncrypt(key,0,true,0,buffer,&dataSize,bufferSize))
    {
    throw L"Зашифровать данные не удалось";
    }

    // Распечатаем то, что у нас получилось
    wcout<<endl<<L"Зашифрованная строка(hex):"<<endl;
    for(size_t i=0;i<dataSize;++i)
    {
    wcout<<hex<<buffer[i];
    }

    // Попробуем расшифровать
    wcout<<endl<<endl
    <<L"Попробуем ее расшифровать:"<<endl;
    if(!CryptDecrypt(key,0,true,0,buffer,&dataSize))
    {
    throw L"Расшифровать данные не получилось";
    }

    // Соберем результирующую строку
    wstring received(reinterpret_cast<wchar_t*>(buffer),reinterpret_cast<wchar_t*>(buffer+dataSize));
    wcout<<L"Расшифрованные данные(received):"<<endl;
    wcout<<received<<endl;
    wcout<<endl<<L"Проверим совпадают ли строки(хотя и так это видно)"<<endl
    <<L"(secret==received)="<<boolalpha<<(secret==received)<<endl;
    }
    catch (bad_alloc)
    {
    wcout<<L"Ошибка выделения памяти"<<endl;
    }
    catch(const wchar_t* const msg)
    {
    wcout<<L"Исключение:"<<msg<<endl;
    }
    if(buffer)
    {
    delete[] buffer;
    }
    system("PAUSE");
    return 0;
    }

    Пример работы программы:
    Код:

    Введите строку, какую Вы хотели бы зашифровать(secret):
    Это очень-очень секретное сообщение :)

    Сгенерирован ключ(hex):
    82003660018000f2161207d1afe8ca25e70a81c375d54c42c3238d5f79d

    Зашифрованная строка(hex):
    42a76e31075d3c3eabd5ad9c3be2e092ff5f28f34144f383633e38e382b858ec84398958b2b92fb4
    25539e19dc64697ee834c891d8a7ce5945a935bb6aee5d3e7b49a45be07797c8adcd8391276f

    Попробуем ее расшифровать:
    Расшифрованные данные(received):
    Это очень-очень секретное сообщение :)

    Проверим совпадают ли строки(хотя и так это видно)
    (secret==received)=true

    Ответ отправил: Micren, Практикант
    Ответ отправлен: 29.05.2009, 16:11

    Оценка ответа: 5

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 250028 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.0 beta от 24.05.2009

    В избранное