RC4加密算法实现

来源:互联网 发布:美利达怎么样知乎 编辑:程序博客网 时间:2024/06/13 19:36

原理

RC4产生一个伪随机比特流,加密的时候把它跟明文进行异或处理得到密文,解密的时候将密文与产生的流再次异或得到明文。
主要过程为以下三大步:
1、初始化S和T
for i=0 to 255 do
S[i]=i;
T[i]=K[ i mod keylen ];
2、初始排列S
j=0;
for i=0 to 255 do
j= ( j+S[i]+T[i])mod256;
swap(S[i],S[j]);
3、产生密钥流
i,j=0;
for r=0 to len do //len为明文长度
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];

java实现

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.util.Scanner;public class RC4 {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        String plaintext = new String(); //明文        String ciphertest = new String(); //密文        String key = "123"; //秘钥        int[] s = new int[256];        Init_rc4(s, key); //初始化        int[] s2 = new int[256];        for(int i = 0; i < 256; i++){//保存初始值            s2[i] = s[i];        }        while(scanner.hasNext()) {            if("RC4 -enc".equals(scanner.nextLine())){                //读取明文                plaintext = ReadText2String(new File("src/com/hp/rc4/plaintext.txt"));                System.out.println("读入的明文是:\n" + plaintext);                ciphertest = Encry_code_rc4(s, plaintext, key);                //将密文写入文件                WriteText2String(ciphertest, new File("src/com/hp/rc4/ciphertext.txt"));                 System.out.println("加密后的密文是:\n" + ciphertest);            }            if("RC4 -dec".equals(scanner.nextLine())){                //读取密文                ciphertest = ReadText2String(new File("src/com/hp/rc4/ciphertext.txt"));                System.out.println("读入的密文是:\n" + ciphertest);                plaintext = Encry_code_rc4(s2, ciphertest, key); //解密                //将明文写入文件                WriteText2String(plaintext, new File("src/com/hp/rc4/plaintext.txt"));                 System.out.println("解密后的明文是:\n" + plaintext);            }        }    }    public static void WriteText2String(String output, File file) {        try {            FileOutputStream fout = new FileOutputStream(file);            OutputStreamWriter out = new OutputStreamWriter(fout, "utf-8");            out.write(output);            out.close();        } catch (Exception e) {            e.printStackTrace();        }    }    public static String ReadText2String(File file){        StringBuilder result = new StringBuilder();        try{            FileInputStream fin = new FileInputStream(file);            InputStreamReader input = new InputStreamReader(fin, "utf-8");            int content = 0;            while((content = input.read())!=-1){                result.append((char)content);            }            input.close();        }catch(Exception e){            e.printStackTrace();        }        return result.toString();    }    private static void Init_rc4(int[] s, String key) {        byte[] k = new byte[256];        //初始化        for(int i = 0; i < 256; i++){            s[i] = i;            k[i] = (byte)key.charAt(i % key.length());        }        //s的初始置换        int j = 0;        for(int i = 0; i < 256; i++){            j = (j + s[i] + k[i]) % 256;            int temp = s[i];            s[i] = s[j];            s[j] = temp;        }    }    private static String Encry_code_rc4(int[] s, String input, String key) {        char[] input_char = input.toCharArray();        char[] output_char = new char[input_char.length];        int i = 0, j = 0;        for(int k = 0; k < input_char.length; k++){            i = (i + 1) % 256;            j = (j + s[i]) % 256;            int temp = s[i];            s[i] = s[j];            s[j] = temp;            int t = (s[i] + s[j]) % 256;            //加密时:将s[t]与明文相应的字节异或产生密文            //解密时:将s[t]与密文相应的字节异或恢复明文            output_char[k] = (char) (input_char[k] ^ (char)s[t]);        }        return new String(output_char);    }}

结果
RC4

原创粉丝点击