搜狗在线测评(加密解密)

#include  <stdio.h> 
#include  <stdlib.h> 
//#include  <stdint.h> 
#include  <assert.h> 
#include  <string.h> 

typedef unsigned char uint8_t;
typedef unsigned int uint32_t;

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  ^  0xbf9c7264u; 
	for  (size_t  i  =  0  ;  i  <  len;  ++i)  { 
		uint8_t  a  =  (  in[i]  ^  seed  )  >>  5; 
		uint8_t  b  =  (  (  ((uint32_t)in[i])  <<  15  )  ^  seed  )  >>  (15-3); 
		a  &=  7; 
		b  &=  248; 
		a  =  7  &  (  a  ^  (b  <<  3)); 
		out[i]  =  a  |  b; 
		seed  =  ((seed  ^  out[i])  *  129491  +  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  ^  0xbf9c7264u; 
	for  (size_t  i  =  0  ;  i  <  len;  ++i)  { 
	//  请在此处补全代码 
			//out[i]  =  a  |  b; 
			uint8_t a = ( in[i] & 7);
			uint8_t b = ( in[i] & 248);

			//a  =  7  &  (  a  ^  (b  <<  3)); 
			a = (a  ^  (b  <<  3));
			a = (a << 5) ^ seed;

			//uint8_t  b  =  (  (  ((uint32_t)in[i])  <<  15  )  ^  seed  )  >>  (15-3); 
			b = ((((uint32_t)b<<12))^seed )>>15;

			//uint8_t  a  =  (  in[i]  ^  seed  )  >>  1; 
			a = a & 0xe0;//高3位
			b = b & 0x1f;//低5位

			out[i]  =  a  |  b; 

			seed  =  ((seed  ^  in[i])  *  129491  +  in[i]); 
	} 
	return 0;
} 
int  main() 
{ 
	const  uint8_t  buf1[]  =  {0x0b,  0xf1,  0x3f,  0x87,  0xd2,  0xa4,  0x08,  0xb9,  0x28,  0x2d,  0x3c,  0xd9,  0x9a,  0xec,  0x3b,  0xe9,  0x42,  0xa5,  0xea,  0x2b,  0xa9,  0x7b,  0xe3,  0x45,  0xd3,  0x45,  0x64,  0x16,  0x66,  0x42,  0xff,  0x5b,  0xb6,  0xe3,  0x7a,  0x6d,  0x7e,  0x6d,  0x5a,  0xf1,  0xa1,  0x5b,  0x5b,  0x71,  0x27,  0x5c,  0xb9,  0x30,  0x55,  0x0b  }; 
	uint8_t  buf2[100]  =  {0}; 
	const  uint32_t  password  =  0xc67911cfu; 
	const  size_t  len  =  sizeof(buf1); 
	decode(buf1,  buf2,  password,  len); 
	printf("%s\n",  buf2); 

	return 1;
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值