码迷,mamicode.com
首页 > 其他好文 > 详细

RC4 对称加密

时间:2019-10-06 18:59:54      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:write   cep   tostring   get   ext   NPU   byte   tput   ufs   

public class RC4 {
    byte[] s = new byte[256];
    byte[] key;
    byte keylen;// 4 ~ 16
    int pi = 0;
    int pj = 0;

    public RC4() {
        this.keylen = 16;
        randKey();
        ksa();
    }

    public RC4(byte keylen) {
        this.keylen = keylen;
        randKey();
        ksa();
    }

    public RC4(byte[] key) {
        this.key = key;
        keylen = (byte) key.length;
        ksa();
    }

    private void randKey() {
//        SecureRandom r = new SecureRandom("abc".getBytes());
        Random r = new Random(0xdeadbeef);
        key = new byte[keylen];
        r.nextBytes(key);
    }

    public byte[] getKey() {
        return key;
    }

    private void ksa() {
        for (int i = 0; i < s.length; i++) {
            s[i] = (byte) i;
        }
        int j = 0;
        for (int i = 0; i < s.length; i++) {                    //使用密钥来交换s的元素
            j = ((j + s[i] & 0xff + key[i % keylen] & 0xff) % 256);    //重复使用密钥

            byte tmp = s[i];                                    //交换
            s[i] = s[j];
            s[j] = tmp;
        }
    }

    public byte prgaOneByte(byte in) {
        pi = pi + 1 % 256;
        pj = (pj + s[pi] & 0xff);

        byte tmp = s[pi];
        s[pi] = s[pj];
        s[pj] = tmp;

        int t = (s[pi] & 0xff + s[pj] & 0xff) % 256;
        int k = s[t] & 0xff;
        return (byte) ((k ^ in & 0xff) & 0xff);
    }


    public void prga(InputStream is, OutputStream os) throws IOException {
        int bufsize = 4 * 1024;
        byte[] buffer = new byte[bufsize]; // 4K
        byte[] outBuffer;
        int len = 0;
        while ((len = is.read(buffer, 0, bufsize)) != -1) { //读取一块
            outBuffer = prga(buffer, 0, len);
            os.write(outBuffer);
        }
    }

    public byte[] prga(byte[] buffer, int off, int len) throws IOException {
        byte[] outBuffer = new byte[buffer.length]; // 4K
        for (int i = 0 + off; i < len; i++) {                    //处理这块
            outBuffer[i] = prgaOneByte(buffer[i]);
        }
        return outBuffer;
    }

    public static void main(String[] args) throws IOException {
        String msg = "hello wold!";
        byte[] bmsg = msg.getBytes();
        byte[] key;
        System.out.println("bmsg :" + Arrays.toString(bmsg));   //加密前

        RC4 rc4 = new RC4();
        key = rc4.getKey();
        byte[] ebmsg = rc4.prga(bmsg, 0, bmsg.length);
        System.out.println("ebmsg :" + Arrays.toString(ebmsg)); //加密后

        RC4 rc42 = new RC4(key);
        byte[] debmsg = rc42.prga(ebmsg, 0, ebmsg.length);
        System.out.println("debmsg:" + Arrays.toString(debmsg));//解密后
        System.out.println("debmsg:" + new String(debmsg));
    }
}

 

输出

bmsg :[104, 101, 108, 108, 111, 32, 119, 111, 108, 100, 33]
ebmsg :[-76, 34, -32, -95, -127, 85, -93, -16, -126, 110, -56]
debmsg:[104, 101, 108, 108, 111, 32, 119, 111, 108, 100, 33]
debmsg:hello wold!

 

RC4 对称加密

标签:write   cep   tostring   get   ext   NPU   byte   tput   ufs   

原文地址:https://www.cnblogs.com/cyy12/p/11627756.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!