C++/C++11 C++/C++11
Vova9915 15 окт 2018
XOR
Как зашифровать текст с помощью xor на С++? Очень давно не использовал его и забыл как реализуется.
0 1 1
Комментарии (4)
string XOR(string data, char key[])
{
string xorstring = data;
for (int i = 0; i < xorstring.size(); i++) {
xorstring[i] = data[i] ^ key[i % (sizeof(key) / sizeof(char))];
}
return xorstring;
}
int main()
{
char key[3] = { 'K', 'E', 'Y' };
string data = XOR("virtual", key);
cout << data;
getchar();
return 0;
}
{
string xorstring = data;
for (int i = 0; i < xorstring.size(); i++) {
xorstring[i] = data[i] ^ key[i % (sizeof(key) / sizeof(char))];
}
return xorstring;
}
int main()
{
char key[3] = { 'K', 'E', 'Y' };
string data = XOR("virtual", key);
cout << data;
getchar();
return 0;
}
протестировал ваш пример у вас имеется ошибка:
вот тут key[i % (sizeof(key) / sizeof(char))];
у меня при любом размере key равен четырём. значит вот эта операция (sizeof(key) / sizeof(char))
вычисляет размер указателя( CPU у меня 32 bit ) а не всего массива.
проверил так и есть.
если вычислять внутри функций выходит любой размер массива key равен четырем. тоесть размеру указателя а не массива.
вот код теста.
#include <cstdio>
#include <cstring>
char *XOR( const char *data, char key[])
{
int szData = strlen( data );
int szKey = ( sizeof(key) / sizeof(char));
char *xorstring = new char [ szData + 1 ];
for( int i = 0; i < szData; ++i)
{
xorstring[i] = data[i] ^ key[i % szKey ];
std::printf(" szKey = %d | index = %d\n", szKey, i % szKey );
}
return xorstring;
}
char *XOR2( const char *data, const char *key )
{
int szData = strlen( data );
int szKey = strlen( key );
char *xorstring = new char [ szData + 1 ];
for( int i = 0; i < szData; ++i)
{
xorstring[i] = data[i] ^ key[i % szKey ];
std::printf(" szKey = %d | index = %d\n", szKey, i % szKey );
}
return xorstring;
}
void tst( char p[] )
{
std::printf("size - %d\n", sizeof( p ));
}
int main()
{
char key[] = { 'K', 'E', 'Y', 'S', 'U', 'P' };
char key2[] = { "SALAMANDRA" };
char *data = XOR("virtual", key);
char *data2 = XOR2( "virtual", key2 );
std::printf("%s\n", data );
std::printf("%s\n", data2 );
printf("size - %d\n", (sizeof(key) / sizeof(key[0])));
tst(key);
return 0;
}
вот тут key[i % (sizeof(key) / sizeof(char))];
у меня при любом размере key равен четырём. значит вот эта операция (sizeof(key) / sizeof(char))
вычисляет размер указателя( CPU у меня 32 bit ) а не всего массива.
проверил так и есть.
если вычислять внутри функций выходит любой размер массива key равен четырем. тоесть размеру указателя а не массива.
вот код теста.
#include <cstdio>
#include <cstring>
char *XOR( const char *data, char key[])
{
int szData = strlen( data );
int szKey = ( sizeof(key) / sizeof(char));
char *xorstring = new char [ szData + 1 ];
for( int i = 0; i < szData; ++i)
{
xorstring[i] = data[i] ^ key[i % szKey ];
std::printf(" szKey = %d | index = %d\n", szKey, i % szKey );
}
return xorstring;
}
char *XOR2( const char *data, const char *key )
{
int szData = strlen( data );
int szKey = strlen( key );
char *xorstring = new char [ szData + 1 ];
for( int i = 0; i < szData; ++i)
{
xorstring[i] = data[i] ^ key[i % szKey ];
std::printf(" szKey = %d | index = %d\n", szKey, i % szKey );
}
return xorstring;
}
void tst( char p[] )
{
std::printf("size - %d\n", sizeof( p ));
}
int main()
{
char key[] = { 'K', 'E', 'Y', 'S', 'U', 'P' };
char key2[] = { "SALAMANDRA" };
char *data = XOR("virtual", key);
char *data2 = XOR2( "virtual", key2 );
std::printf("%s\n", data );
std::printf("%s\n", data2 );
printf("size - %d\n", (sizeof(key) / sizeof(key[0])));
tst(key);
return 0;
}
Для добавления комментариев необходимо авторизоваться
Флибустьеры
Грабь корабли! Побеждай монстров! Создавай уникаль...