1.Java实现RivestCipher4加密算法

97 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

public class RC4 {
    /**
     * RC4算法加密与解密文本
     * @author ArtemisKhryso
     * @param textInput 文本输入
     * @param key 密匙
     * @return
     */
    public static String RivestCipher4(String textInput,String key) {
        // 状态适量S
        int[] S = new int[256];
        // 临时矢量T
        byte[] T = new byte[256];


        // S中元素的值被置为从0~255按升序赋初始值
        for (int i = 0;i<256;i++) {
            S[i] = i;
        }
        /**
         * 如果密钥K的长度为256字节,则将K赋给T。
         * 否则,若密钥长度为keylen个字节,则将K的值赋给T的前keylen个元素,
         * 并循环重复用K的值赋给T剩下的元素,直到T的所有元素都被赋值。
        */
        if(key.length() == 256){
            for (int i = 0;i<256;i++) {
                T[i]=(byte)key.charAt(i);
            }
        }else{
            for (int i = 0;i<256;i++) {
                T[i]=(byte)key.charAt((i % key.length()));
            }
        }
        /**
         * 然后用T产生S的初始置换。从S[0]~S[255],对每个S[i],
         * 根据由T[i]确定的方案,将S[i]置换为S中的另一字节
         */
        int j=0;
        int temp;
        for (int i = 0;i<255;i++) {
            j=(j+S[i]+T[i]) % 256;
            temp = S[i];
            S[i] = S[j];
            S[j] = temp;
        }

        int i=j=0;
        // 输入文本字符数组,加密解密字符数组
        char[] inputChar = textInput.toCharArray();
        char[] outputChar = new char[inputChar.length];
        for(short x = 0;x<inputChar.length;x++) {
            /**
             * 矢量S一旦完成初始化,输入密钥就不再被使用。
             * 密钥流的生成是从S[0]到S[255],对于每个S[i],
             * 根据当前S的值,将S[i]与S的另一字节置换。
             */
            i = (i+1) % 256;
            j = (j+S[i]) % 256;
            temp = S[i];
            S[i]=S[j];
            S[j]=temp;
            // 根据这两个置换的数组元素内容,将其相加
            int t = (S[i]+S[j]) % 256;
            // 取出相加后的数字指向的数组元素内容
            int Y = S[t];
            // 转成字符
            char CY = (char)Y;
            // 加密中,将Key的值与明文字节异或;解密中,将key的值与密文字节异或。
            outputChar[x] =(char)(  CY ^ inputChar[x] ) ;
        }

        return new String(outputChar);
    }
    public static void main(String[] args) {
        String inputStr = "May the Force be with you!";
        String key = "gdupt";

        String str = RivestCipher4(inputStr,key);

        //打印加密后的字符串
        System.out.println("加密后的字符串:" + str);

        //打印解密后的字符串
        System.out.println("解密后的字符串:" + RivestCipher4(str,key));
    }
}

在这里插入图片描述