首页
社区
课程
招聘
[求助]有人能看出这是什么算法吗
发表于: 2009-8-15 02:41 6465

[求助]有人能看出这是什么算法吗

2009-8-15 02:41
6465
Encode

static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

int base64_encode(const void *data, int size, char **str)
{
  char *s, *p;
  int i;
  int c;
  const unsigned char *q;

  p = s = (char*)malloc(size*4/3+4);
  if (p == NULL)
      return -1;
  q = (const unsigned char*)data;
  i=0;
  for(i = 0; i < size;){
    c=q[i++];
    c*=256;
    if(i < size)
      c+=q[i];
    i++;
    c*=256;
    if(i < size)
      c+=q[i];
    i++;
    p[0]=base64[(c&0x00fc0000) >> 18];
    p[1]=base64[(c&0x0003f000) >> 12];
    p[2]=base64[(c&0x00000fc0) >> 6];
    p[3]=base64[(c&0x0000003f) >> 0];
    if(i > size)
      p[3]='=';
    if(i > size+1)
      p[2]='=';
    p+=4;
  }
  *p=0;
  *str = s;
  return strlen(s);
}

char* OnEncode(char *str)
{
	int		i, len;
	char	*s, *data;
	len = strlen(str) + 1;
	s = (char *)malloc(len);
	memcpy(s, str, len);
	for (i = 0; i < len; i++)
	{
		s[i] ^= 0x19;
		s[i] += 0x86;
	}
	base64_encode(s, len, &data);
	free(s);
	return data;
}


Decode
static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

static int pos(char c)
{
  char *p;
  for(p = base64; *p; p++)
    if(*p == c)
      return p - base64;
  return -1;
}

int base64_decode(const char *str, char **data)
{
  const char *s, *p;
  unsigned char *q;
  int c;
  int x;
  int done = 0;
  int len;
  s = (const char *)malloc(strlen(str));
  q = (unsigned char *)s;
  for(p=str; *p && !done; p+=4){
	  x = pos(p[0]);
	  if(x >= 0)
		  c = x;
	  else{
		  done = 3;
		  break;
	  }
	  c*=64;
	  
	  x = pos(p[1]);
	  if(x >= 0)
		  c += x;
	  else
		  return -1;
	  c*=64;
	  
	  if(p[2] == '=')
		  done++;
	  else{
		  x = pos(p[2]);
		  if(x >= 0)
			  c += x;
		  else
			  return -1;
	  }
	  c*=64;
	  
	  if(p[3] == '=')
		  done++;
	  else{
		  if(done)
			  return -1;
		  x = pos(p[3]);
		  if(x >= 0)
			  c += x;
		  else
			  return -1;
	  }
	  if(done < 3)
		  *q++=(c&0x00ff0000)>>16;
	  
	  if(done < 2)
		  *q++=(c&0x0000ff00)>>8;
	  if(done < 1)
		  *q++=(c&0x000000ff)>>0;
  }

  len = q - (unsigned char*)(s);

  *data = (char*)realloc((void *)s, len);

  return len;
}

char* OnDecode(char *str)
{
	int		i, len;
	char	*data = NULL;
	len = base64_decode(str, &data);
	
	for (i = 0; i < len; i++)
	{
		data[i] -= 0x86;
		data[i] ^= 0x19;
	}
	return data;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 74
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
就叫 BASE64 Encode 嘛

只是不明白为什么在Encode前要做这两步
    s[i] ^= 0x19;
    s[i] += 0x86;
2009-8-15 05:20
0
雪    币: 66
活跃值: (950)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=techie;671392]就叫 BASE64 Encode 嘛

只是不明白为什么在Encode前要做这两步
    s[i] ^= 0x19;
    s[i] += 0x86;[/QUOTE]

关键就是多了这一步,
2009-8-15 17:10
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
4
加密而己啊.
2009-8-15 22:55
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
5
算法名叫:xor19add86
2009-8-15 23:06
0
雪    币: 74
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
又想了想 OnEncode()是不可逆的,^0x19说明只希望保留第0,3,4位的值, 不应该是用来整个加密和解密的.

所以问题是OnEncode()到底是什么情况才会被调用.
2009-8-15 23:43
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7
为什么不可逆?
2009-8-16 00:01
0
雪    币: 66
活跃值: (950)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
OnEncode() 是可以逆

比如

CString stradd = "192.168.0.1:80";

OnEncode(stradd);

AfxMessageBox(stradd);
2009-8-16 18:34
0
雪    币: 66
活跃值: (950)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
baidu 了一下没有找到和这个相同名字的算法。
2009-8-16 18:37
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
google强一点, 有找到一篇
2009-8-16 19:22
0
雪    币: 66
活跃值: (950)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
google.com 我也没有找到 xor19add86
2009-8-18 09:29
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我在GOOGLE上找到一篇了,不过是抄LZ的
2009-8-18 17:34
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这是变异(加密)的base64编码。
2009-8-19 11:06
0
游客
登录 | 注册 方可回帖
返回
//