RC4加密算法实现

原理

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值