首页
社区
课程
招聘
[求助]这个RC4哪里不对?
发表于: 2011-12-3 19:44 4727

[求助]这个RC4哪里不对?

2011-12-3 19:44
4727
void swap(unsigned char& a, unsigned char& b) {
	unsigned char x = a;
	a = b;
	b = x;
}
void key_gen(unsigned char* s, unsigned char* key, int key_len) {
	int i=0, j=0;
	for(i=0; i<256; i++) s[i] = i;

	for(i=0; i<256; i++) {
		j = (j + s[i] + key[i%key_len]) %256;
		swap(s[i], s[j]);
	}
}

void rc4(unsigned char* s, unsigned char* data, int data_len) {
	int i=0, j=0, c=0;
	unsigned k;
	for(c=0; c<data_len; c++) {
		i = (i+1)%256;
		j = (j +s[i])%256;
		swap(s[i], s[j]);

		k = s[(s[i] + s[j]) % 256];
		data[c] ^= k;
	}
}

// void dump(unsigned char* x, int len) {
// 	for(int i=0; i<len; i++) {
// 		if(i%16==0) printf("\n%02X\t", i);
// 		printf("%02X ", x[i]);
// 	}
// 	printf("\n");
// }

int main() {
	unsigned char text[256] = {"Plaintext"};
	unsigned char key[256] = {"Key"};

	unsigned char sbox[256] = {0};
	key_gen(sbox, key, strlen((char*)key));// RC4 init
	// dump(sbox, 256);

	rc4(sbox, text, strlen((char*)text));
	cout << text << endl;
	rc4(sbox, text, strlen((char*)text));
	cout << text << endl;

	return 0;
}

网上搜索了几个算法,都是不对的。。以上代码是参考搜索结果和 http://en.wikipedia.org/wiki/RC4  这篇文章里的伪代码做的,请问哪里不对?为什么加密/解密后就不是 "Plaintext" 了?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
int main() {
  unsigned char text[256] = {"Plaintext"};
  unsigned char key[256] = {"Key"};

  unsigned char sbox[256] = {0};
  key_gen(sbox, key, strlen((char*)key));// RC4 init
  // dump(sbox, 256);

  rc4(sbox, text, strlen((char*)text));
  cout << text << endl;
  key_gen(sbox, key, strlen((char*)key));// RC4 init
  rc4(sbox, text, strlen((char*)text));
  cout << text << endl;

  return 0;
}
2011-12-3 20:13
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
多谢,这样就ok了
2011-12-3 20:41
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
后续问题。。我在网上找了另外一个rc4源码,也能正常工作, 但是key_gen不一样, 相同的输入参数,和以上代码生成的 s-box 不同, 但它也能正常加解密
所以应该是和 s-box 里面元素顺序无关吧,只要加密/解密时候用的是相同的 s-box 就ok了?
于是又测试了下,在生成了s-box 之后,加了一步随机打乱 s-box,然后用这个打乱后的去 加密/解密
在前面的代码基础上,加上

#include <time.h>
void random_sbox(unsigned char* sbox) {
  srand((unsigned)time(NULL));
  int try=0;//打乱100次
  while(try++<100) {
    int x = rand()%256;
    int y = rand()%256;
    if(x != y)
      swap(sbox[x], sbox[y]);
  }
}

int main() {
  unsigned char text[256] = {"Plaintext"};
  unsigned char key[256] = {"Key"};

  unsigned char sbox[256] = {0};
  key_gen(sbox, key, strlen((char*)key)); // RC4 init
  random_sbox(sbox);//打乱次序

  unsigned char sbox_bak[256];
  memcpy(sbox_bak, sbox, 256); //备份sbox,解密时候用

  rc4(sbox, text, strlen((char*)text));//加密

  rc4(sbox_bak, text, strlen((char*)text));//解密
  cout << text << endl;

  return 0;
}

运行几十次,就会出一次错误,比如输出

C:\Windows\system32\cmd.exe /c test.exe
Plaint
Hit any key to close this window...

上面的Plaint 后面就没了

另外怎么改论坛email,控制面板里不管用。
2011-12-3 21:22
0
游客
登录 | 注册 方可回帖
返回
//