#include <stdio.h>
#include <string.h>
void main( void ) {
unsigned int i = 0;
unsigned int j = 0;
unsigned char S1[256] = {0};
unsigned char S2[256] = {0};
unsigned char T[256] = {0};
unsigned char key[256] = {"0123789abcdef"};
unsigned int len = strlen(key);
//待加密的字符串
unsigned char *str = "qwertyuiop";
unsigned char data[256] = {0};
unsigned int slen = strlen(str);
sprintf(data,"%s",str);
printf("str=%s\n",data);
unsigned char tmp;
// 初始化 S T
for( i=0; i<256; i++ ) {
S1[i] = i;
T[i] = key[i%len];
}
// 初始排列 S
for( i=0; i<256; i++ ) {
j = (j+S1[i]+T[i])% 256;
tmp = S1[i];
S1[i] = S1[j];
S1[j] = tmp;
}
// 保存Sbox用于加解密
// 以防Sbox在加密过程中改变
memcpy(S2,S1,sizeof(S1));
// 加密
unsigned int x = 0;
unsigned int y = 0;
unsigned int k = 0;
for( i=0; i<slen; i++ ) {
x = (x+1)%256;
y = (y+S1[x])%256;
tmp = S1[x];
S1[x] = S1[y];
S1[y] = tmp;
k = (S1[x] + S1[y]) %256;
data[i] ^= S1[k];
}
printf("enc:%s\n",data);
// 解密
x = 0;
y = 0;
k = 0;
for( i=0; i<slen; i++ ) {
x = (x+1)%256;
y = (y+S2[x])%256;
tmp = S2[x];
S2[x] = S2[y];
S2[y] = tmp;
k = (S2[x] + S2[y]) %256;
data[i] ^= S2[k];
}
printf("dec:%s\n",data);
}
LinuxC-RC4流加密
于 2019-06-27 11:23:48 首次发布