RC4算法

RC4算法简介:https://baike.baidu.com/item/RC4%E7%AE%97%E6%B3%95/9686396?fr=aladdin

RC4算法java实现:

/**
 * RC4加解密算法
 * RC4对称性加密解密算法
 */
public class RC4 {

    /**
     * 解密后的数据为String类型
     *
     * @param data
     * @param key
     * @return
     */
    public static String decryRC4Str(byte[] data, String key) {
        if (data == null || key == null) {
            return null;
        }
        return asString(RC4Base(data, key));
    }

    /**
     * 解密后的数据为String类型
     *
     * @param data
     * @param key
     * @return
     */
    public static String decryRC4Str(String data, String key) {
        if (data == null || key == null) {
            return null;
        }
        return new String(RC4Base(hexString2Bytes(data), key));
    }

    /**
     * 解密后的数据为byte[]类型
     *
     * @param data
     * @param key
     * @return
     */
    public static byte[] decryRC4Byte(byte[] data, String key) {
        if (data == null || key == null) {
            return null;
        }
        return RC4Base(data, key);
    }

    /**
     * 加密后的数据为byte[]类型
     *
     * @param data
     * @param key
     * @return
     */
    public static byte[] encryRC4Byte(String data, String key) {
        if (data == null || key == null) {
            return null;
        }
        byte b_data[] = data.getBytes();
        return RC4Base(b_data, key);
    }

    /**
     * 加密后的数据为String类型
     *
     * @param data
     * @param key
     * @return
     */
    public static String encryRC4Str(String data, String key) {
        if (data == null || key == null) {
            return null;
        }
        return toHexString(asString(encryRC4Byte(data, key)));
    }

    /**
     * 将byte[]转化成String类型
     *
     * @param buf
     * @return
     */
    private static String asString(byte[] buf) {
        StringBuffer strbuf = new StringBuffer(buf.length);
        for (int i = 0; i < buf.length; i++) {
            strbuf.append((char) buf[i]);
        }
        return strbuf.toString();
    }

    /**
     * 初始计算Key
     *
     * @param aKey
     * @return
     */
    private static byte[] prepareKey(String aKey) {
        byte[] b_key = aKey.getBytes();
        byte state[] = new byte[256];

        for (int i = 0; i < 256; i++) {
            state[i] = (byte) i;
        }
        int index1 = 0;
        int index2 = 0;
        if (b_key == null || b_key.length == 0) {
            return null;
        }
        for (int i = 0; i < 256; i++) {
            index2 = ((b_key[index1] & 0xff) + (state[i] & 0xff) + index2) & 0xff;
            byte tmp = state[i];
            state[i] = state[index2];
            state[index2] = tmp;
            index1 = (index1 + 1) % b_key.length;
        }
        return state;
    }

    /**
     * 将String转化成16进制的String
     *
     * @param s
     * @return
     */
    private static String toHexString(String s) {
        String str = "";
        for (int i = 0; i < s.length(); i++) {
            int ch = (int) s.charAt(i);
            String s4 = Integer.toHexString(ch & 0xFF);
            if (s4.length() == 1) {
                s4 = ‘0‘ + s4;
            }
            str = str + s4;
        }
        return str;// 0x表示十六进制
    }

    /**
     * 将String转换成byte[]
     *
     * @param src
     * @return
     */
    private static byte[] hexString2Bytes(String src) {
        int size = src.length();
        byte[] ret = new byte[size / 2];
        byte[] tmp = src.getBytes();
        for (int i = 0; i < size / 2; i++) {
            ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
        }
        return ret;
    }

    /**
     * byte的异或
     *
     * @param src0
     * @param src1
     * @return
     */
    private static byte uniteBytes(byte src0, byte src1) {
        char _b0 = (char) Byte.decode("0x" + new String(new byte[]{src0})).byteValue();
        _b0 = (char) (_b0 << 4);
        char _b1 = (char) Byte.decode("0x" + new String(new byte[]{src1})).byteValue();
        byte ret = (byte) (_b0 ^ _b1);
        return ret;
    }

    /**
     * RC4算法核心
     *
     * @param input
     * @param mKkey
     * @return
     */
    private static byte[] RC4Base(byte[] input, String mKkey) {
        int x = 0;
        int y = 0;
        byte key[] = prepareKey(mKkey);
        int xorIndex;
        byte[] result = new byte[input.length];
        for (int i = 0; i < input.length; i++) {
            x = (x + 1) & 0xff;
            y = ((key[x] & 0xff) + y) & 0xff;
            byte tmp = key[x];
            key[x] = key[y];
            key[y] = tmp;
            xorIndex = ((key[x] & 0xff) + (key[y] & 0xff)) & 0xff;
            result[i] = (byte) (input[i] ^ key[xorIndex]);
        }
        return result;
    }
}

原文地址:https://www.cnblogs.com/huzi007/p/11751447.html

时间: 2024-11-01 12:45:04

RC4算法的相关文章

流密码(序列密码)与Rc4算法

"流密码(序列密码)与Rc4算法" Rc4是一种序列密码,它是一种可变密钥长度.面向字节操作的序列密码,一个明文字节与一个密钥字节相异或产生一个密文字节. 算法原理:对于n = 8位长的字,即以一个字节为单位,此时N = 256,用从1到256个字节的可变长度密钥初始化一个256个字节的状态矢量arr,arr中的元素arr[0],arr[1],,,arr[255],自始至终置换后的arr包含0~255的所有8比特数,密钥流中的密钥key由arr中256个元素按一定方式选出一个元素来充当

lua rc4算法实现

由于项目需要,用python django写restful接口遇到瓶颈,python django+uwsgi处理请求是会阻塞的, 如果阻塞请求不及时处理,会卡住越来越多的其它的请求,导致越来越多的502.所以将请求处理频繁的,会阻 塞长时间的接口用lua实现,lua放在nginx里跑,还是很快的. 呵呵,费话少说了! 项目因用 到rc4加密算法,但网上实现lua rc4算法的很少,有的要依赖lua第三方库,很不方便.根据wiki实 现自己的算法: -- RC4 -- http://en.wik

【安全牛学习笔记】WEP加密、RC4算法

WEP加密                                                            使用Rivest Cipher 4 (RC4)算法加密流量内容,实现机密性               CRC32算法检查数据完整性                                             标准采用使用24位initialization vector (IV)                          受美国加密技术出口限制法律

RC4算法的Python实现详注

刚对RC4算法进行了学习,网上发现https://ju.outofmemory.cn/entry/46753 中作者展示了RC4的python实现,但代码缺乏注释,较为晦涩,因此本文对部分代码进行了注释,希望能对学习RC4算法的pythoner有所帮助. 1 #/usr/bin/python 2 #coding=utf-8 3 import sys,os,hashlib,time,base64 4 def rc4(string, op = 'encode', public_key = 'ddd'

c# rc4算法,加密解密类

rc4.. 1 /* 2 * 由SharpDevelop创建. 3 * 用户: YISH 4 * 日期: 04/04/2015 5 * 时间: 03:01 6 * 7 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 8 */ 9 using System; 10 11 namespace Libraries 12 { 13 /// <summary> 14 /// Description of CryptoGraphy. 15 /// </summary> 16 p

听说是rc4算法

题目内容: key welcometoicqedu 密文UUyFTj8PCzF6geFn6xgBOYSvVTrbpNU4OF9db9wMcPD1yDbaJw== 看到题目就知道是rc4加密了,直接解可得flag flag:flag{rc4_l_keepgoing} 总结:rc4 原文地址:https://www.cnblogs.com/zaixialongaotian/p/10298936.html

RC4加密解密算法原理与完整源代码实例演示

RC4加密算法 RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇.之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节.该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性.RC4起初是用于保护商业机密的.但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了.RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法. 原理 R

对称加密算法之RC4介绍及OpenSSL中RC4常用函数使用举例

RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码. RC4是流密码streamcipher中的一种,为序列密码.RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇.起初该算法是商业机密,直到1994年,它才公诸于众.由于RC4具有算法简单,运算速度快,软硬件实现都十分容易等优点,使其在一些协议和标准里得到了广泛应用. 流密码也属于对称密码,但与分组加密算法不同的是,流密码不对明

RC4加密算法的原理及实现

RC4于1987年提出,和DES算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥).但不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密. RC4算法的特点是算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048比特),在如今技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以可以预见RC4的密钥范围任然可以在今后相当长的时间里抵御暴力搜