#include <stdio.h>
#include <memory.h>
int myrand(int *seed){
int tmp;
tmp = ((*seed * 257 >> 8) + *seed * 97) + 23 ^ -1496474763;
*seed = tmp >> 16 & 65535 | tmp << 16;
return *seed & 32767;
}
// 0 : success!
// -2147483647 : wrong header
// -2147483646 : wrong checksum
int decrypt(char *a) {
int r, counter, ret;
char *a_header, *a_body;
int flags[64], seed, i, s;
char *target;
int check_sum,check_xor;
ret = -2147483647;
a_header = a;
a_body = a + 16;
if (strcmp(a_header
+ 0, "BSE 1.0")) return ret
; if (*(short *)(a_header + 8) != 256) return ret;
seed = *(long *)(a_header + 12);
counter = 0;
do {
r = myrand(&seed);
i = r & 64 - 1;
while (flags[i]){
i = i + 1 & 64 - 1;
}
r = myrand(&seed);
s = r & 7;
target = (a_body + 0) + i;
r = myrand(&seed);
switch(r & 1){
case 0:
r = myrand(&seed);
r = (*target & 255) - r & 255;
*target = r >> s | r << 8 - s; // rotate shift right
break;
case 1:
r = myrand(&seed);
r = (*target & 255) - r & 255;
*target = r << s | r >> 8 - s; // rotate shift left
break;
}
flags[i] = 1; // done
counter = counter + 1;
} while (counter < 64);
check_sum = 0;
check_xor = 0;
target = a_body + 0;
counter = 0;
do {
check_sum = check_sum + (target[counter] & 255);
check_xor = check_xor ^ (target[counter] & 255);
counter = counter + 1;
} while (counter < 64);
ret =
(a_header[10] & 255) == (check_sum & 255) &&
(a_header[11] & 255) == (check_xor & 255) ?
0 : -2147483646;
return ret;
}
int main(void) {
int ret, i;
unsigned char a[] = {
0x42, 0x53, 0x45, 0x20, 0x31, 0x2e, 0x30, 0x00, 0x00, 0x01, 0xe0, 0xda,
0xc9, 0xa5, 0x6d, 0x70, 0x20, 0xed, 0x53, 0x38, 0x7d, 0x95, 0xe3, 0x03,
0x2c, 0xbe, 0x10, 0xd9, 0x42, 0x70, 0x09, 0x16, 0xa6, 0x77, 0xcd, 0x8f,
0x80, 0x18, 0xdc, 0x3b, 0xd8, 0xf4, 0x22, 0x9e, 0xa5, 0x87, 0x03, 0x18,
0xac, 0x3c, 0x71, 0x1f, 0xa0, 0xd5, 0x1f, 0x68, 0x1e, 0x06, 0x95, 0x46,
0x4e, 0xc0, 0x18, 0x17, 0x53, 0x78, 0xd7, 0x3a, 0x53, 0x70, 0x9b, 0x52,
0x82, 0x81, 0xe5, 0x01, 0xe9, 0xa8, 0xe0, 0x79, 0xce, 0x43, 0x74, 0xa4,
0x01, 0xce, 0x15, 0x91, 0x4e, 0x20, 0xd5, 0xa3, 0x7c, 0x83, 0x09, 0x1a,
};
ret = decrypt((char *)a);
if (ret == 0) {
for (i
= 0x10; i
< 0x80; ++i
) printf("%02x ", a
[i
]); } else {
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtZW1vcnkuaD4KCmludCBteXJhbmQoaW50ICpzZWVkKXsKCWludCB0bXA7Cgl0bXAgPSAoKCpzZWVkICogMjU3ID4+IDgpICsgKnNlZWQgKiA5NykgKyAyMyBeIC0xNDk2NDc0NzYzOwoJKnNlZWQgPSB0bXAgPj4gMTYgJiA2NTUzNSB8IHRtcCA8PCAxNjsKCXJldHVybiAqc2VlZCAmIDMyNzY3Owp9CgovLyAgICAgICAgICAgMCA6IHN1Y2Nlc3MhCi8vIC0yMTQ3NDgzNjQ3IDogd3JvbmcgaGVhZGVyCi8vIC0yMTQ3NDgzNjQ2IDogd3JvbmcgY2hlY2tzdW0KaW50IGRlY3J5cHQoY2hhciAqYSkgewoJaW50IHIsIGNvdW50ZXIsIHJldDsKCWNoYXIgKmFfaGVhZGVyLCAqYV9ib2R5OwoJaW50IGZsYWdzWzY0XSwgc2VlZCwgaSwgczsKCWNoYXIgKnRhcmdldDsKCWludCBjaGVja19zdW0sY2hlY2tfeG9yOwoJcmV0ID0gLTIxNDc0ODM2NDc7CglhX2hlYWRlciA9IGE7CglhX2JvZHkgPSBhICsgMTY7CglpZiAoc3RyY21wKGFfaGVhZGVyICsgMCwgIkJTRSAxLjAiKSkgcmV0dXJuIHJldDsKCWlmICgqKHNob3J0ICopKGFfaGVhZGVyICsgOCkgIT0gMjU2KSByZXR1cm4gcmV0OwoJbWVtc2V0KGZsYWdzLCAwLCA2NCAqIDQpOwoJc2VlZCA9ICoobG9uZyAqKShhX2hlYWRlciArIDEyKTsKCWNvdW50ZXIgPSAwOwoJZG8gewoJCXIgPSBteXJhbmQoJnNlZWQpOwoJCWkgPSByICYgNjQgLSAxOwoJCXdoaWxlIChmbGFnc1tpXSl7CgkJCWkgPSBpICsgMSAmIDY0IC0gMTsKCQl9CgkJciA9IG15cmFuZCgmc2VlZCk7CgkJcyA9IHIgJiA3OwoJCXRhcmdldCA9IChhX2JvZHkgKyAwKSArIGk7CgkJciA9IG15cmFuZCgmc2VlZCk7CgkJc3dpdGNoKHIgJiAxKXsKCQljYXNlIDA6CgkJCXIgPSBteXJhbmQoJnNlZWQpOwoJCQlyID0gKCp0YXJnZXQgJiAyNTUpIC0gciAmIDI1NTsKCQkJKnRhcmdldCA9IHIgPj4gcyB8IHIgPDwgOCAtIHM7ICAvLyByb3RhdGUgc2hpZnQgcmlnaHQKCQkJYnJlYWs7CgkJY2FzZSAxOgoJCQlyID0gbXlyYW5kKCZzZWVkKTsKCQkJciA9ICgqdGFyZ2V0ICYgMjU1KSAtIHIgJiAyNTU7CgkJCSp0YXJnZXQgPSByIDw8IHMgfCByID4+IDggLSBzOyAgLy8gcm90YXRlIHNoaWZ0IGxlZnQKCQkJYnJlYWs7CgkJfQoJCWZsYWdzW2ldID0gMTsgIC8vIGRvbmUKCQljb3VudGVyID0gY291bnRlciArIDE7Cgl9IHdoaWxlIChjb3VudGVyIDwgNjQpOwoJY2hlY2tfc3VtID0gMDsKCWNoZWNrX3hvciA9IDA7Cgl0YXJnZXQgPSBhX2JvZHkgKyAwOwoJY291bnRlciA9IDA7CglkbyB7CgkJY2hlY2tfc3VtID0gY2hlY2tfc3VtICsgKHRhcmdldFtjb3VudGVyXSAmIDI1NSk7CgkJY2hlY2tfeG9yID0gY2hlY2tfeG9yIF4gKHRhcmdldFtjb3VudGVyXSAmIDI1NSk7CgkJY291bnRlciA9IGNvdW50ZXIgKyAxOwoJfSB3aGlsZSAoY291bnRlciA8IDY0KTsKCXJldCA9CgkJKGFfaGVhZGVyWzEwXSAmIDI1NSkgPT0gKGNoZWNrX3N1bSAmIDI1NSkgJiYKCQkoYV9oZWFkZXJbMTFdICYgMjU1KSA9PSAoY2hlY2tfeG9yICYgMjU1KSA/CgkJCTAgOiAtMjE0NzQ4MzY0NjsKCXJldHVybiByZXQ7Cn0KCmludCBtYWluKHZvaWQpIHsKCWludCByZXQsIGk7Cgl1bnNpZ25lZCBjaGFyIGFbXSA9IHsKCQkweDQyLCAweDUzLCAweDQ1LCAweDIwLCAweDMxLCAweDJlLCAweDMwLCAweDAwLCAweDAwLCAweDAxLCAweGUwLCAweGRhLAoJCTB4YzksIDB4YTUsIDB4NmQsIDB4NzAsIDB4MjAsIDB4ZWQsIDB4NTMsIDB4MzgsIDB4N2QsIDB4OTUsIDB4ZTMsIDB4MDMsCgkJMHgyYywgMHhiZSwgMHgxMCwgMHhkOSwgMHg0MiwgMHg3MCwgMHgwOSwgMHgxNiwgMHhhNiwgMHg3NywgMHhjZCwgMHg4ZiwKCQkweDgwLCAweDE4LCAweGRjLCAweDNiLCAweGQ4LCAweGY0LCAweDIyLCAweDllLCAweGE1LCAweDg3LCAweDAzLCAweDE4LAoJCTB4YWMsIDB4M2MsIDB4NzEsIDB4MWYsIDB4YTAsIDB4ZDUsIDB4MWYsIDB4NjgsIDB4MWUsIDB4MDYsIDB4OTUsIDB4NDYsCgkJMHg0ZSwgMHhjMCwgMHgxOCwgMHgxNywgMHg1MywgMHg3OCwgMHhkNywgMHgzYSwgMHg1MywgMHg3MCwgMHg5YiwgMHg1MiwKCQkweDgyLCAweDgxLCAweGU1LCAweDAxLCAweGU5LCAweGE4LCAweGUwLCAweDc5LCAweGNlLCAweDQzLCAweDc0LCAweGE0LAoJCTB4MDEsIDB4Y2UsIDB4MTUsIDB4OTEsIDB4NGUsIDB4MjAsIDB4ZDUsIDB4YTMsIDB4N2MsIDB4ODMsIDB4MDksIDB4MWEsCgl9OwoJcmV0ID0gZGVjcnlwdCgoY2hhciAqKWEpOwoJaWYgKHJldCA9PSAwKSB7CgkJZm9yIChpID0gMHgxMDsgaSA8IDB4ODA7ICsraSkgcHJpbnRmKCIlMDJ4ICIsIGFbaV0pOwoJCXByaW50ZigiXG4iLCByZXQpOwoJfSBlbHNlIHsKCQlwcmludGYoIiUwOHhcbiIsIHJldCk7Cgl9CglyZXR1cm4gMDsKfQo=