Страница: 1 |
Страница: 1 |
Вопрос: XXE на Visual Basic
Добавлено: 04.03.08 18:39
Автор вопроса: Ellic | Web-сайт:
Вот нашёл алгоритм шифрования XXE на с++. Но в с++ я ещё пока не силён :( Может кто-нибудь сможет этот код перенести на VB? Думаю этим заинтиресуюсь не не только я :)
//////////////////////////////////САМ КОД
#include "comprlib.h"
/* Encode a character */
#define ENC(c) (set[(c) & 077])
/* Set of characters is used */
static char set[] =
"+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
/* Output one group of 3 bytes, pointed to by 'p' */
static void outenc(char* p)
{
int c1, c2, c3, c4;
c1 = *p >> 2;
c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
c4 = p[2] & 077;
write_byte(ENC(c1));
write_byte(ENC(c2));
write_byte(ENC(c3));
write_byte(ENC(c4));
}
/* 'fr' is like 'read' */
static int fr(char* buf, int cnt)
{
register int i, c;
for (i = 0; i < cnt; ++i)
{
c = read_byte();
if (end_of_data())
return i;
buf = c;
}
return cnt;
}
/* XXEncode a file */
int encode_xxe()
{
char buf[80];
int i, n;
while (true)
{
/* Read a 1 to 45 character line */
n = fr(buf, 45);
write_byte(ENC(n));
for (i = 0; i < n; i += 3)
outenc(&buf);
write_byte('\n');
if (n <= 0)
break;
}
return 0;
}
#define DEC(c) (table[(c) & 0117])
static char table[128];
static int replace;
static void outdec(char* p, int n)
{
int c1, c2, c3;
c1 = DEC(*p) << 2 | DEC(p[1]) >> 4;
c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
c3 = DEC(p[2]) << 6 | DEC(p[3]);
if (n >= 1)
write_byte(c1);
if (n >= 2)
write_byte(c2);
if (n >= 3)
write_byte(c3);
}
int decode_xxe()
{
char buf[80];
char* bp;
int n, i;
bp = table;
for (n = 128; n; n--)
*(bp++) = 0;
bp = set;
for (n = 64; n; n--)
table[*(bp++) & 0117] = 64 - n;
while (true)
{
/* Read an input line */
for (i = 0; i < (signed)sizeof(buf); i++)
{
buf = read_byte();
if (end_of_data())
break;
}
n = DEC(buf[0]);
if (n <= 0)
break;
bp = &buf[1];
while (n > 0)
{
if (replace) /* never initialized? */
outdec(bp, n);
bp += 4;
n -= 3;
}
}
return 0;
}
//////////////////////////////////////////COMPRLIB.H
extern int (*end_of_data)(); /* True if no more data left */
extern int (*read_byte)(); /* Read a byte from input */
extern int (*write_byte)(int byte); /* Write a byte to output */
extern int (*beginning_of_data)(); /* Move to beginning of data source */
extern int (*write_array)(void* a, int);/* Write stream of data */
extern int (*write_block)(char c, int); /* Write one byte many times */
extern long (*stream_size)(); /* Retreive length of data source */
/* All encoding/decoding method prototypes */
int fastcopy(); int slowcopy();
int encode_xxe(); int decode_xxe();
int encode_arith(); int decode_arith();
int encode_lzss(); int decode_lzss();
int encode_dmc(); int decode_dmc();
int encode_lzari(); int decode_lzari();
int encode_rle1(); int decode_rle1();
int encode_rle2(); int decode_rle2();
int encode_lzhuf(); int decode_lzhuf();
int encode_collapse(); int decode_collapse();
int encode_lzw(); int decode_lzw();
int encode_splay(); int decode_splay();
int encode_huffman(); int decode_huffman();
int encode_spread(); int decode_spread();
int encode_xor(); int decode_xor();
int encode_addsub(); int decode_addsub();
int encode_uue(); int decode_uue();
int encode_lzo(); int decode_lzo();
typedef struct PAIR {
char* name;
char* value;
} PAIR;
typedef PAIR* PPAIR;
typedef struct METHOD_TO_NAME {
char* name;
int (*encode)();
int (*decode)();
} METHOD_TO_NAME;
extern METHOD_TO_NAME methods[]; /* in comprlib.c */
/* ComprLib properties */
int comprlib_set_prop(char* tag, char* value);
char* comprlib_get_prop(char* tag);
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 04.03.08 22:08
Это не алгоритм шифрования, а алгоритм кодирования. И он прост, как бублик. Разбиваешь входной поток на куски по 6 бит и записываешь в выходной поток символ строки +-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz с соответствующим номером.
Номер ответа: 2
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #2
Добавлено: 04.03.08 22:45
и файл становится на 25% длинее (из сборника собственных мыслей
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 05.03.08 09:46
Нифига подобного, больше чем на треть. Во-первых, из 6 битов получается 8, во-вторых, там, как правило, добавляется разбитие на строки и заголовок.
Номер ответа: 4
Автор ответа:
Ellic
Вопросов: 17
Ответов: 26
Web-сайт:
Профиль | | #4
Добавлено: 05.03.08 15:41
Хе, я как-то всё-таки решил что Base64 немного удобней, вот и сделал прогу на нём
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 06.03.08 06:36
Они практически идентичны.
Номер ответа: 6
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #6
Добавлено: 06.03.08 17:00
ну видимо base64 удобней тем, что с ним был готовой код)
Номер ответа: 7
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #7
Добавлено: 07.03.08 21:33
http://www.google.com/codesearch?q=lang%3Abasic+file%3AXXE&hl=ru
Номер ответа: 8
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #8
Добавлено: 11.03.08 09:12
Я писал декодирование xxe на ассемблере (и постил исходник на этом форуме). В общем, как правильно заметил Sharp, алгоритм простой, только вот один раз с переносом строк ничего не напутать. Есть реализации, которые вставляют в начале строки контрольные суммы строк, что-ли. Так поступает встроенный в Total Commander кодировщик.
Номер ответа: 9
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #9
Добавлено: 11.03.08 20:04
Кстати я помню тема была, о том, что картинка не декодировалась обратно. Еле догадались, что там переносы виноваты)) глупо конечно))