Шифрование текста
финт, но этот файл можно прочитать даже блокнотом, задача заключается в том как мне зашифровать всю инфу этого файла, так что бы не навредить работе программы. Собственно в файле хранятся настройки программы.
финт, но этот файл можно прочитать даже блокнотом, задача заключается в том как мне зашифровать всю инфу этого файла, так что бы не навредить работе программы. Собственно в файле хранятся настройки программы.
Имеется множество вариантов. Например, LibTomCrypt, DCPcrypt, GnuPG. Из сертифицированных (и платных) решений: Домен-К, Верба, КриптоПро, Крипто-Си.
Можно ещё на Торри покопаться (и и в этом разделе).
Простой xor не подойдет? Или контрольная сумма какая-нибудь?
ЗЫ "сохраняет файл на [COLOR="Black"]ф[/COLOR]инт" - это круто ;)
А как ей пользоваться то, нинаю:confused::confused::(
расшифровать этот файл, Очень надо. Не могу сам никак все что могу перепробовал.
По мне, так выбирайте сами нужный шифр. Если программа слишком дорога и эти настройки так важны, так не пожалейте денег купить готовые программы типа Крипто-Про и прочее, которые гарантированно защитят ваши файлы.
Если все не так серьезно, то возьмите и напишите обычный перестановочный шифр (перестановка символов, сдвиг символов, поблочная перестановка) + xor - это как минимум отобъет максимальное число людей, так как лень кому-либо будет в этом разбираться.
Ну или найдите в сети исходники AES (они есть, например, тут) или RSA (его и самого не сложно реализовать для небольшой длины ключа (чтобы время создания не было большим)). Хотя RSA немного для других целей, но тоже можно шифровать данные на нём спокойно.
Вот именно что для других целей. Файл шифровать им смысла неимеет - больше минусов.
Ну да, так-то он для цифровых подписей предназначен. Но реализовать алгоритм RSA несложно (для малых ключей, где не надо аппараты математики применять, типа быстрого возведения в степень и прочее), так что если хочет сам, то пусть не парится)
Ну а если серьезно, то берите любой симметричный алгоритм. Вообщем, вот тут все ответы: http://ru.wikipedia.org/wiki/Симметричные_криптосистемы
Там же, я думаю, можно и реализации шифров найти, и почитать про них, и выбрать самый подходящий.
unsigned char ucKey = 0x13;
void Crypt(unsigned char *ByteArray, unsigned int Length)
{
for (unsigned i = 0; i < Length; i++) ByteArray ^= ucKey;
}
void SaveSettings()
{
ofstream fout("settings.cfg");
Crypt( (unsigned char*)&iSetting, sizeof(int) );
fout << iSettings;
fout.close();
}
void LoadSettings()
{
ifstream fin("settings.cfg");
fin >> iSettings;
Crypt( (unsigned char*)&iSetting, sizeof(int) );
fin.close();
}
К тому же, как я понимаю, ключ будет храниться где-то в программе, так что криптостойкость алгоритма особой роли не играет :)
Ну конечно. Цифровые подписи - это лишь одна из побочных областей его применения. )
Но реализовать алгоритм RSA несложно
да многие криптоалгоритмы реализовать не сложно. В том числе и симметричные.
для малых ключей,
Для малых ключей он смысла не имеет.
Там же, я думаю, можно и реализации шифров найти, и почитать про них, и выбрать самый подходящий.
Реализации вон можно в OpenSSL взять. =)
Да любая криптосистема не имеет смысла при малых ключах) Просто я думаю, что для текущей задачи большой ключ не нужен, не такая уж там тайна великая будет храниться. Ну т.е. в рамках темы дал совет. Так как если брать большой ключ, и если писать самому программу, то придется больше возиться не с реализацией, а с оптимизацией))
[SIZE="1"]Offtopic:
сам вот недавно по универу реализовывал задачку: "Подсчет точек на эллиптической кривой алгоритмом Схоуфа". Вообщем, нарыл в инете прогу=) Она считала количество точек для поля, допустим, F(503) менее чем за секунду)) Мой же скромный вариант, написанный в лоб для проверки моих ручных расчетов, подогнанный под мою скромную эллиптическую кривую над полем F(7) считал от 20 до 30 секунд:D[/SIZE]
расшифровать этот файл, Очень надо. Не могу сам никак все что могу перепробовал.
этот файл по-моему вообще rotate255 зафигачен =))) что-то по типу xor но только char + int, то есть например
почему-то так думается )
Ну все же для RSA да и вобще для ассиметричных криптоалгоритмов ключи требуются как минимум на порядок (ато и более) длинные чем для симметричных при той же криптостойкости.
Просто я думаю, что для текущей задачи большой ключ не нужен, не такая уж там тайна великая будет храниться.
Так какой тогда вобще смысл от всей замороченности с открытыми ключами RSA, если он на офисном компе будет ломаться за паруминут? =)
Тогда уж проще воспользоваться неизвестностью алгоритма или лобовым XORом =)
Ну т.е. в рамках темы дал совет. Так как если брать большой ключ, и если писать самому программу, то придется больше возиться не с реализацией, а с оптимизацией))
Для этого есть готовые и давно отлаженные реализации. В том числе и открытые.
Ну так-то да. Длина ключа определяется самим алгоритмом ширфрования. Для RSA пока что 1024 бит хватает, для того же ГОСТа нашего 256, если мне память не изменяет)
[SIZE="1"]Оффтоп: ждем квантового компьютера) Сразу всех порешает)
Да и вообще чет я уже отошел сам от темы топика:)[/SIZE]
Ничо, уже существует квантовая криптосистема, основанная, на поляризации квантов. Она ему не позубам.;)
Не хватает кстати. =)
Криптоалгоритм на основе эллиптических кривых над конечным полем помогут гиганту мысли. ;) Говорят, у 256-разрядного ключа такая же криптостойкость, как у 2048-разрядного ключа RSA.
unsigned char ucKey = 0x13;
void Crypt(unsigned char *ByteArray, unsigned int Length)
{
for (unsigned i = 0; i < Length; i++) ByteArray ^= ucKey;
}
void SaveSettings()
{
ofstream fout("settings.cfg");
Crypt( (unsigned char*)&iSetting, sizeof(int) );
fout << iSettings;
fout.close();
}
void LoadSettings()
{
ifstream fin("settings.cfg");
fin >> iSettings;
Crypt( (unsigned char*)&iSetting, sizeof(int) );
fin.close();
}
Все равно непойму, как я понял обработчик Void LoadSettings() - это загрузка файла который мы зашифровали, обработчик Void SaveSetings() - это сохранение и зашифровка файла который нужно зашифровать.
Void Crypt - Это метод шифрования.
Просто я чет недогоняю, загрузка сохранение файла это понятно,
но обработчик VOID CRYPT и переменные iSetting и ucKey, должны ведь находиться должны находиться в одном обработчике события, причем вместе с Загрузкой и сохранением иначе переменные iSettings и ucKey не
будут являтся переменными.
пример:
unsigned char ucKey = 0x13;
for (unsigned i = 0; i < Length; i++) ByteArray ^= ucKey;
ofstream fout("settings.cfg");
Crypt( (unsigned char*)&iSetting, sizeof(int) );
fout << iSettings;
fout.close();
ifstream fin("settings.cfg");
fin >> iSettings;
Crypt( (unsigned char*)&iSetting, sizeof(int) );
fin.close();
Пробовал обоими способами, Билдер пишет ошибка.
Може, для наглядности скинете мне исходник именно вашего примера.
Т.е. при записи порядок такой:
1. Любую настройку (т.е. переменную какого-то типа) интерпретируем как массив байт (в общем случае - слов, двойных слов и т.д.).
2. Меняем в этом массиве байт байты согласно некоторому закону.
3. Записываем этот массив байт в файл.
В коде это выглядит примерно так:
unsigned char *ucPointer = (unsigned char*)&Setting;// 1
Crypt( ucPointer, sizeof(SomeType) ); // 2
// 3 теперь по адресу &Setting лежит преобразованный массив байт - можно записать его в файл каким угодно способом
Порядок чтения обратный:
1. Вычитать из файла массив байт
2. Преобразовать его согласно некоторому закону
3. Интерпретировать этот массив байт как объект некоторого типа
unsigned char *ucPointer = (unsigned char*)&Setting;
// вычитать каким-то способом из файла
Crypt( ucPointer, sizeof(SomeType) );
Где вы расположите ваши переменные различных настроек - это уже ваше дело. Будут ли они локальными, глобальными или членами класса (например, формы) - решать вам.
Константу ucKey - ключ для шифрования - можно объявить внутри метода Crypt. Или, опять же, где вам удобнее
ЗЫ Посмотрите, что такое "метод" и что такое "обработчик события", и чем они отличаются
Т.е. при записи порядок такой:
1. Любую настройку (т.е. переменную какого-то типа) интерпретируем как массив байт (в общем случае - слов, двойных слов и т.д.).
2. Меняем в этом массиве байт байты согласно некоторому закону.
3. Записываем этот массив байт в файл.
В коде это выглядит примерно так:
unsigned char *ucPointer = (unsigned char*)&Setting;// 1
Crypt( ucPointer, sizeof(SomeType) ); // 2
// 3 теперь по адресу &Setting лежит преобразованный массив байт - можно записать его в файл каким угодно способом
Порядок чтения обратный:
1. Вычитать из файла массив байт
2. Преобразовать его согласно некоторому закону
3. Интерпретировать этот массив байт как объект некоторого типа
unsigned char *ucPointer = (unsigned char*)&Setting;
// вычитать каким-то способом из файла
Crypt( ucPointer, sizeof(SomeType) );
Где вы расположите ваши переменные различных настроек - это уже ваше дело. Будут ли они локальными, глобальными или членами класса (например, формы) - решать вам.
Константу ucKey - ключ для шифрования - можно объявить внутри метода Crypt. Или, опять же, где вам удобнее
ЗЫ Посмотрите, что такое "метод" и что такое "обработчик события", и чем они отличаются
У меня пишет 11 Ошибок, Нездешний посмотри пожалуйсто исходник я вроде все правельно сделал.
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
int iSetting;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void Crypt(unsigned char * ByteArray, unsigned int Length);
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
iSetting = 789;
}
//---------------------------------------------------------------------------
void TForm1::Crypt(unsigned char * ByteArray, unsigned int Length)
{
const unsigned char ucKey = 0x13;
for (unsigned i = 0; i < Length; i++) ByteArray ^= ucKey;
}
//---------------------------------------------------------------------------
Да как помогут, в данном случае вобще не нужна ассиметричная криптография. А у симметричной ключи итак такого порядка.
Так то все асиметричные алгоритмы основанны на NP-полных задачах. Или на задаче факторизации или дискретного логарифмирования обычно. Так что сложность у них одинаковая.
Просто у группы эллиптических нет недостатков группы чисел по модулю n на основе которых можно ускорить немного подбор. За счет этого у криптоалгоритмов (дискретного логарифмирования) над ней могут быть ключи меньше. Но не факт что не найдутся решения подобные и для эллипттических кривых. Да и собственно проблема P =? NP то до сих пор не разрешена. =)
Так то все асиметричные алгоритмы основанны на NP-полных задачах. Или на задаче факторизации или дискретного логарифмирования обычно. Так что сложность у них одинаковая.
Просто у группы эллиптических нет недостатков группы чисел по модулю n на основе которых можно ускорить немного подбор. За счет этого у криптоалгоритмов (дискретного логарифмирования) над ней могут быть ключи меньше. Но не факт что не найдутся решения подобные и для эллипттических кривых. Да и собственно проблема P =? NP то до сих пор не разрешена. =)
Копирайт, как я понимаю, принадлежит А. П. Алфёрову? ;)
PS. несмотря на недостаточную изученность "эллиптической криптографии", она принята в качестве стандарта для ЭЦП.
Копирайт чего? Криптоалгоритмов на основе эллиптических кривых? Да нет, не ему видимо. Текста написанного? Дык я на клавиатуре набрал. На основе 5 лет изучения этого дела будучи студентом еще в универе и последующей работе. =) Ни с каким Алферовом лично не знаком. =)
PS. несмотря на недостаточную изученность "эллиптической криптографии", она принята в качестве стандарта для ЭЦП.
В курсе, чеб её не быть принятой то у нас. Не хуже с изученностью чем с факторизацией. да и группы элиптических кривых не один десяток лет изучают, пожалуй наверно даже сотню. =)
Да.
Приятно читать посты знающего человека. Вносит, понимаешь, приятный контраст.
Я имел в виду Алфёрова Александра Павловича, одного из авторов учебника: А.П. Алфёров, А.Ю. Зубов, А.С. Кузьмин, А.В. Черёмушкин, "Основы криптографии".