Zireael |
Отправлено: 23 Сентября, 2018 - 01:37:06
|
Эксперт
Просматривает форум
Сообщений всего: 4463
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Шифрование xor (Отобразить)CODE:string text="тестовый текст: для проверки; шифровки"; // строка
string pass="a2qw6"; // пароль для шифровки/дешифровки (любые символы ASCII)
// в функцию shifrovanie передаются: строка для шифровки/дешифровки и пароль
string shifr=shifrovanie(text, pass); // шифровка строки
messagebox(shifr);
string result=shifrovanie( shifr, pass); // дешифровка
messagebox(result);
function binary(string symbol)
{
int x=formatci(symbol), arr[8], z=-1;
string s="";
while (x>0){z++; arr[z]=mod(x, 2); x=x/2;}
for(int i=z; i>-1; i--)s=s+format(arr[i]);
while(size(s)<8)s="0"+s;
return s;
}
function decimal(string symbol3)
{
char c[9]; strcpy(#c[0], symbol3);
int z=0, degree=size(symbol3)-1;
for(int i=0; i<8; i++){if(c[i]=='1')z=z+pow(2, degree); degree--;}
return formatic(z);
}
function xor(int x, int y){if((x==0 && y==0) || (x==1 && y==1))return 0; return 1;}
function mod(int a, int b){return a-(a/b)*b;}
function shifrovanie(string str, string key_)
{
string symbol2, ss;
char c1[9], c2[9];
int size_str=size(str), size_key=size(key_);
new char c3[size_str+1]; new char c4[size_key+1];
strcpy(#c3[0], str); strcpy(#c4[0], key_);
ss="";
for(int i=0; i<size_str; i++)
{
strcpy(#c1[0], binary(c3[i]));
for(int j=0; j<size_key; j++)
{
symbol2="";strcpy(#c2[0], binary(c4[j]));
for(int k=0; k<8; k++)
{
if(xor(formatsn(c1[k]), formatsn(c2[k]))==0)symbol2=symbol2+"0";
else symbol2=symbol2+"1";
}
strcpy(#c1[0], symbol2);
}
ss=ss+decimal(symbol2);
}
delete c3;
delete c4;
return ss;
} |
|
|
Zireael |
Отправлено: 05 Декабря, 2019 - 00:33:37
|
Эксперт
Просматривает форум
Сообщений всего: 4463
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Можно пояснить почему?
Переход на дробное деление. Заменить функцию mod.
CODE:function mod(int a, int b){int z=a/b; return a-z*b;} |
|
|
Zireael |
Отправлено: 08 Июня, 2020 - 12:06:44
|
Эксперт
Просматривает форум
Сообщений всего: 4463
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: а можно сделать dll'ку с шифрованием?
https://drive.google.com/file/d/...view?usp=sharing
Длл распаковать и закинуть в папку с kibor.exe.
CODE:external(INT, "shifrovanie", "shifrovanie", pathfolder()+"Shifr.dll");
string Text = "текст для шифровки qwerty 123";
string Key = "password123";
char c[999]; // сюда запишется результат
shifrovanie(Text, Key, address(#c[0]));
messagebox(format(#c[0])); // зашифрованная строка
shifrovanie(format(#c[0]), Key, address(#c[0]));
messagebox(format(#c[0])); // расшифрованная строка
Код dll C++ (Отобразить)CODE:#include "pch.h"
extern "C" __declspec(dllexport)int shifrovanie(char* pText, char* pKey, char* result)
{
int len_text = strlen(pText);
int len_key = strlen(pKey);
memset(result, 0, len_text+1);
for (int i = 0; i < len_text; i++)
{
result[i] = (unsigned char)(pText[i] ^ pKey[i % len_key]);
}
return 1;
} |
|
|
Zireael |
Отправлено: 08 Июня, 2020 - 16:38:02
|
Эксперт
Просматривает форум
Сообщений всего: 4463
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: шифрование обрывается.
Оно не обрывается, просто функция format выводит текст до первого 0.
Чуть подправил. Для расшифровки нужно передавать в функцию адрес массива char и длину текста.
https://drive.google.com/file/d/...view?usp=sharing
CODE:external(INT, "shifrovanie", "shifrovanie", pathfolder()+"Shifr.dll");
string Text = "qeWerty";
string Key = "rzWfgu";
char c[999], c2[999];
shifrovanie(Text, size(Text), Key, address(#c[0]));
messagebox(format(#c[0])); // зашифрованная строка
shifrovanie(address(#c[0]), size(Text), Key, address(#c2[0]));
messagebox(format(#c2[0])); // расшифрованная строка
Код dll C++ (Отобразить)CODE:#include "pch.h"
extern "C" __declspec(dllexport)int shifrovanie(char* pText, int len_text, char* pKey, char* result)
{
int len_key = strlen(pKey);
memset(result, 0, len_text+1);
for (int i = 0; i < len_text; i++)
{
result[i] = (unsigned char)(pText[i] ^ pKey[i % len_key]);
}
return 1;
}
Вообще можно в инете поискать и другие алгоритмы шифрования, просто этот один из самых простых в плане реализации. |
|
|
Zireael |
Отправлено: 07 Января, 2024 - 13:58:52
|
Эксперт
Просматривает форум
Сообщений всего: 4463
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Длл из предыдущего поста скачать и закинуть в папку с кибор.
CODE:external(INT, "shifrovanie", "shifrovanie", "Shifr.dll");
string Text = "Какой-то текст для шифрования";
string Key = "Ключ 123";
string Code = Encryption(Text, Key);
messagebox(Code);
string Decode = Decryption(Code, Key);
messagebox(Decode);
// неправильный ключ
messagebox(Decryption(Code, "12345"));
// функция шифрования, возвращает строку в Base64
function Encryption(string TextEncrypt, string KeyEncrypt)
{
char c[99999];
shifrovanie(TextEncrypt, size(TextEncrypt), KeyEncrypt, address(#c[0]));
return base64code (#c[0], size(TextEncrypt));
}
// функция расшифровки
function Decryption(string TextDecrypt, string KeyDecrypt)
{
char c[99999], c2[99999];
strcpy(#c[0], TextDecrypt);
string Temp[2];
int k = regexsearch(2, #Temp[0], TextDecrypt, "=");
int k2 = base64decode (#c[0], size(TextDecrypt), #c2[0]);
shifrovanie(address(#c2[0]), k2-k, KeyDecrypt, address(#c[0]));
return format(#c[0]);
} |
|
|
|