做了两次,有木有搞错!!!,汗!!!
本着分享的精神,哥决定把code blog一下下
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define uint8_t unsigned char
#define uint32_t unsigned int
#define size_t unsigned int
int encode(const void* raw_in, void* raw_out, uint32_t password, size_t len)
{
const uint8_t* in = (const uint8_t*)raw_in;
uint8_t* out = (uint8_t*)raw_out;
uint32_t seed = password ^ 0xca3369d3u;
for (size_t i = 0 ; i < len; ++i) {
uint8_t a = ( in[i] ^ seed ) >> 5;
uint8_t b = ( ( ((uint32_t)in[i]) << 10 ) ^ seed ) >> (10-3);
a &= 7;
b &= 248;
a = 7 & ( a ^ (b << 3));
out[i] = a | b;
seed = ((seed ^ out[i]) * 608347 + out[i]);
}
return 0;
}
int decode(const void* raw_in, void* raw_out, uint32_t password, size_t len)
{
const uint8_t* in = (const uint8_t*)raw_in;
uint8_t* out = (uint8_t*)raw_out;
uint32_t seed = password ^ 0xca3369d3u;
for (size_t i = 0 ; i < len; ++i) {
uint8_t a = 7 & in[i];
uint8_t b = 248 & in[i];
//a = 127 & ( a ^ (b << 3));
a = 224 & (( a <<5) ^ seed);
b = 31 & ( ( ( ((uint32_t)b )<<7) ^seed) >> 10);
out[i] = a | b;
seed = ((seed ^ in[i]) * 608347 + in[i]);
}
return 0;
}
int main()
{
const uint8_t buf1[] = {0xe8, 0xd8, 0x44, 0x06, 0xd2, 0xf8, 0xf0, 0xb5, 0xb6, 0xf0, 0xb6, 0x8e, 0xa7, 0xa3, 0x9f, 0xba, 0x57, 0x25, 0x9c, 0x76, 0x31, 0x19, 0x23, 0x44, 0x68, 0xf8, 0x38, 0x99, 0x17, 0x9f, 0xc3, 0x58, 0x5f, 0xe3, };
uint8_t buf2[100] = {};
const uint32_t password = 0xabd0b01cu;
const size_t len = sizeof(buf1);
decode(buf1, buf2, password, len);
printf("%s\n", buf2);
}
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define uint8_t unsigned char
#define uint32_t unsigned int
#define size_t unsigned int
int encode(const void* raw_in, void* raw_out, uint32_t password, size_t len)
{
const uint8_t* in = (const uint8_t*)raw_in;
uint8_t* out = (uint8_t*)raw_out;
uint32_t seed = password ^ 0x7bece1afu;
for (size_t i = 0 ; i < len; ++i) {
uint8_t a = ( in[i] ^ seed ) >> 1;
uint8_t b = ( ( ((uint32_t)in[i]) << 18 ) ^ seed ) >> (18-7);
a &= 127;
b &= 128;
a = 127 & ( a ^ (b << 3));
out[i] = a | b;
seed = (seed * 48475829 ^ seed ^ out[i]);
}
return 0;
}
int decode(const void* raw_in, void* raw_out, uint32_t password, size_t len)
{
const uint8_t* in = (const uint8_t*)raw_in;
uint8_t* out = (uint8_t*)raw_out;
uint32_t seed = password ^ 0x7bece1afu;
for (size_t i = 0 ; i < len; ++i) {
uint8_t a = 127 & in[i];
uint8_t b = 128 & in[i];
//a = 127 & ( a ^ (b << 3));
a = 254 & (( a <<1) ^ seed);
b = 1 & ( ( ( ((uint32_t)b )<< 11) ^seed) >> 18);
out[i] = a | b;
seed = (seed * 48475829 ^ seed ^ in[i]);
}
return 0;
}
int main()
{
const uint8_t buf1[] = {0x21, 0xd3, 0xee, 0xed, 0xac, 0xee, 0x6d, 0x8b, 0xe6, 0xe1, 0xf8, 0xcd, 0x98, 0x9c, 0xc5, 0xcc, 0x25, 0x7a, 0xde, 0x98, 0x8f, 0xd2, 0xc6, 0x21, 0xf5, 0x40, 0xcb, 0xcd, };
uint8_t buf2[100] = {};
const uint32_t password = 0x5b7b8638u;
const size_t len = sizeof(buf1);
decode(buf1, buf2, password, len);
printf("%s\n", buf2);
}
![](http://hi.csdn.net/attachment/201109/17/0_13162421446Th0.gif)