目录
1.认识RC4算法
- 可变密钥长度的,面向字节操作的流密码:8到2048位可变
- 在SSL/TLS和IEEE 802.11无线网中应用: WEP协议
2.RC4算法思想
- 用可变长度密钥初始化长度为256字节的矢量S: S[1],S[2],S[3],......S[255]
- 矢量S形成算法的内部状态
- 密码流字节K由S中255个元素按照一定方式选出一个元素来生成
- 每生成一个子密码,S中的元素就被重新置换一次
3.RC4算法过程
3.1 初始化S
- 初始条件:密钥种子key[],密钥初始化向量S
- 初始化S: S中元素被置为按升序从0到255(S[0]=0,S[1]=1,.....,S[255]=255)
3.2 建立临时矢量K
- 如果密钥种子Key[]的长度为256字节,则将Key赋值给K
- 否则将Key[]的值赋给K的前N个元素(N为密钥Key[]的长度)
- 循环重复用Key[]的值赋给K剩下的元素,直到K的所有元素都被赋值
3.3用K对S进行初始置换
从S[0]到S[255],对每个S[i],根据由K[i]确定的方案,将S[i]置换为S中的其他一个字节
class codeTransction{
public void permutation(Integer S[],Integer T[],char K[]){
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;//交换S[i] 和 S[j]
int temp;
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
}
3.4生成密码流
密码流KeyStramByte的生成是从S[]选择一个元素
public void GenerateKeys(Integer S[],int n,char keys[]){
int i=0,j=0,t;
for(int k=0;k<n;k++){
i = (i+1)%256;
j = (j+S[i])%256;
int temp;
temp = S[i];
S[i] = S[j];
S[j] = temp;
t = (S[i]+S[j])%256;
keys[k] = (char) S[t].intValue();
}
}
3.5 加密过程
将Keys和下一个明文字节进行异或运算
public String encrupt(char keys[],char P[],char C[],int n){
for(int i=0;i<n;i++){
int result;
result = P[i]^keys[i];
C[i] = (char)result;
}
String o = new String(C);
return o;
}
3.6 解密过程
- 接收方按照相同的方法生成keys值
- 将Keys值与下一个密文字节异或
public String decrypt(char keys[],int n,char C[]){
char D[] = new char[256];
for(int i=0;i<n;i++){
int result;
result = C[i]^keys[i];
D[i] = (char)result;
}
String o = new String(D);
return o;
}
import java.util.Scanner;
public class RC4 {
public static void main(String args[]){
codeTransction c1 = new codeTransction();
Scanner sc = new Scanner(System.in);
System.out.println("密钥:");
String k1 = sc.next();
int len = k1.length();
char K[] = new char[len];//密钥空间
for(int i=0;i<len;i++){
K[i] = k1.charAt(i);
}
Integer S[] = new Integer[256];
Integer T[] = new Integer[256];
c1.permutation(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 cc = c1.encrupt(keys,P,C,n);
System.out.println("密文:");
System.out.println(cc);
for(int i=0;i<n;i++){
C[i] = cc.charAt(i);
}
System.out.println("--------");
String pp = c1.decrypt(keys,n,C);
System.out.println("明文:");
System.out.println(pp);
}
}
class codeTransction{
public void permutation(Integer S[],Integer T[],char K[]){
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;//交换S[i] 和 S[j]
int temp;
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
}
public void GenerateKeys(Integer S[],int n,char keys[]){
int i=0,j=0,t;
for(int k=0;k<n;k++){
i = (i+1)%256;
j = (j+S[i])%256;
int temp;
temp = S[i];
S[i] = S[j];
S[j] = temp;
t = (S[i]+S[j])%256;
keys[k] = (char) S[t].intValue();
}
}
public String encrupt(char keys[],char P[],char C[],int n){
for(int i=0;i<n;i++){
int result;
result = P[i]^keys[i];
C[i] = (char)result;
}
String o = new String(C);
return o;
}
public String decrypt(char keys[],int n,char C[]){
char D[] = new char[256];
for(int i=0;i<n;i++){
int result;
result = C[i]^keys[i];
D[i] = (char)result;
}
String o = new String(D);
return o;
}
}
本文含有隐藏内容,请 开通VIP 后查看