RC4序列密码
在密码学中,RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。
RC4密码与基于移位寄存器的序列密码不同,它是一种基于非线性数据表变换的序列密码。它以一个足够大的数据表为基础,对表进行非线性变换,产生非线性的密钥序列。非线性变换的依据即输入密钥。
由于RC4密码算法简单,软件实现容易,加密速度块,因此得到了广泛的应用。目前RC4可能是商用领域应用最广的序列密码。
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//s表的长度取256
#define size 256
unsigned char sbox[257]={0};
//初始化s表
void init_sbox(unsigned char*key){
unsigned int i,j,k;
int tmp;
for(i=0;i<size;i++){
sbox[i]=i;
}
j=k=0;
for(i=0;i<size;i++){
tmp=sbox[i];
j=(j+tmp+key[k])%size;
sbox[i]=sbox[j];
sbox[j]=tmp;
if(++k>=strlen((char*)key))k=0;
}
}
//加解密函数
void enc_dec(unsigned char*key,unsigned char*data){
int i,j,k,R,tmp;
init_sbox(key);
j=k=0;
for(i=0;i<strlen((char*)data);i++){
j=(j+1)%size;
k=(k+sbox[j])%size;
tmp=sbox[j];
sbox[j]=sbox[k];
sbox[k]=tmp;
R=sbox[(sbox[j]+sbox[k])%size];
data[i]^=R;
}
}
int main(){
unsigned char key[100]={0};
unsigned char data[100]={0};
printf("输入你要加密的字符:");
scanf("%100s",data);
printf("输入密钥:");
scanf("%40s",key);
enc_dec(key,data);
printf("enc: %s\n",data);
enc_dec(key,data);
printf("dec: %s\n",data);
return 0;
}
代码效果: