信息安全·——常用算法(RC4)

发布于:2023-01-18 ⋅ 阅读:(515) ⋅ 点赞:(0)

目录

1.认识RC4算法

2.RC4算法思想

3.RC4算法过程

3.1 初始化S

3.2 建立临时矢量K

3.3用K对S进行初始置换

3.4生成密码流

3.5 加密过程

3.6 解密过程


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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到