RC4算法
RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码。
RC4算法特点:(1)、算法简洁易于软件实现,加密速度快,安全性比较高;
(2)、密钥长度可变,一般用256个字节。
对称密码算法的工作方式有四种:电子密码本(ECB, electronic codebook)方式、密码分组链接(CBC, cipherblock chaining)方式、密文反馈(CFB, cipher-feedback)方式、输出反馈(OFB, output-feedback)方式。
RC4算法采用的是输出反馈工作方式,所以可以用一个短的密钥产生一个相对较长的密钥序列。
OFB方式的最大的优点是消息如果发生错误(这里指的是消息的某一位发生了改变,而不是消息的某一位丢失),错误不会传递到产生的密钥序列上;缺点是对插入攻击很敏感,并且对同步的要求比较高。
步骤:1. S、T初始化
2. 数据表S的初始置换
3. 密钥流生成 ---- 伪随机数生成方法(PGRA)
4. 加密 ---异或
5. 解密 ---异或
1、初始化S和T
for i=0 to 255 do
S[i]=i;
T[i]=K[ imod keylen ];
2、初始排列S
j=0;
for i=0 to 255 do
j= ( j+S[i]+T[i])mod256;
swap(S[i],S[j]);//循环执行完成后,数据表S被伪随机化;
3、产生密钥流
i,j=0;
for r=0 to len do //r为明文长度,r字节
i=(i+1) mod 256;
j=(j+S[i])mod 256;
swap(S[i],S[j]);
t=(S[i]+S[j])mod 256;
k[r]=S[t];
import java.util.Scanner;
public class RC4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
codebooksc c1 = new codebooksc();
Scanner sc =new Scanner(System.in);
System.out.println("密钥:");
String k1 = sc.next();
int m = k1.length();//密钥长度
char K[] = new char[m];//密钥空间
for(int i=0;i<m;i++)
{
K[i] = k1.charAt(i);
}
Integer S[] = new Integer [256];//S表
Integer T[] = new Integer [256];//T表
c1.permutateS(S, T, K);//S表排序
System.out.println("明文:");
String p = sc.next();
int n = p.length();
char P[] = new char[n];//明文空间;
for(int i=0;i<n;i++) {
P[i]=p.charAt(i);
}
char keys[] = new char[n];//密钥流;
c1.GenerateKeys(S, n,keys);//产生密钥流
char C[] = new char[n];//密文空间;
System.out.println();
String ccc = c1.encrypt(keys, n, P,C);
System.out.println("密文:");
System.out.print(ccc);
for(int i=0;i<n;i++)
{
C[i] = ccc.charAt(i);
}
System.out.println();
String pp =c1.decrypt( keys, n, C);
System.out.println("明文是:");
System.out.println(pp);
}
}
class codebooksc{
public void permutateS(Integer S[],Integer T[],char K[]) {//初始排列S表;
for(int i=0;i<256;i++) {
S[i] = i;
}
int t[] = new int[256];
for(int i=0;i<256;i++) {
t[i] = K[i%K.length ];
T[i] = t[i];
}
int j=0;
for(int i=0;i<255;i++)
{
j = (j+S[i]+T[i])%256;
int temp; //交换S【i】与S【j】;
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
}
public void GenerateKeys(Integer S[],int n,char keys[]) {//产生密钥流
int i=0,j=0,r;
for(int u=0;u<n;u++)
{
i = (i+1)%256;
j = (j+S[i])%256;
int temp;
temp = S[i];
S[i] = S[j];
S[j] = temp;
r = (S[i]+S[j])%256;
keys[u] =(char) S[r].intValue();
}
System.out.println("密钥流:");
System.out.print(keys);
}
public String encrypt(char keys[],int n,char P[],char C[]) {//加密
for(int i=0;i<n;i++)
{
int op;
op= P[i] ^ keys[i];
C[i] = (char)op;
//System.out.println("op"+op);
//System.out.println("C[i]"+C[i]);
}
String o4 = new String(C);
return o4;
}
public String decrypt(char keys[],int n,char C[]) {//解密
char D[] = new char[256];
for(int i=0;i<n;i++)
{
int op;
op= C[i] ^ keys[i];
D[i] = (char)op;
}
String o4 = new String(D);
return o4;
}
}
运行结果