RC4 16進制字符串加解密

/**
 * @Project_Name tools
 * @Package org.david.tools
 * @Author David.Lee
 * @Date 2018年2月9日 下午2:41:20
 */
package org.david.tools;


/**
 * @File_Name RC4.java
 * @Author David.Lee
 * @Date 2018年2月9日 下午2:41:20
 * @Copyright 2018 www.zhihu.com/people/david.lee9 Inc. All rights reserved.
 * @Description
 */
public class RC4 {
	
	/**
	 * @Title encry_RC4_byte
	 * @Description 加密數據返回byte[]
	 * @param data  要加密的16進制字符串
	 * @param key   祕鑰
	 * @return
	 */
	public static byte[] encry_RC4_byte(String data, String key) {
        if (data == null || key == null) {
            return null;
        }
        byte b_data[] = hexStringToByteArray(data);
        return RC4Base(b_data, key);
    }


	/**
	 * @Title encry_RC4_byte
	 * @Description 加密數據
	 * @param data  要加密的16進制字符串
	 * @param key   祕鑰
	 * @param offset  偏移量
	 * @return
	 */
    public static byte[] encry_RC4_byte(String data, String key, int offset) {
        if (data == null || key == null) {
            return null;
        }
        byte b_data[] = hexStringToByteArray(data);
        return RC4Base(b_data, key, offset);
    }
    
    
    /**
     * @Title encry_RC4_string
     * @Description  加密數據返回結果字符串
     * @param data
     * @param key
     * @return
     */
    public static String encry_RC4_string(String data, String key) {
        if (data == null || key == null) {
            return null;
        }
        return toHexString(encry_RC4_byte(data, key));
    }


    /**
     * @Title encry_RC4_string
     * @Description 加密數據
     * @param data
     * @param key
     * @param offset
     * @return
     */
    public static String encry_RC4_string(String data, String key, int offset) {
        if (data == null || key == null) {
            return null;
        }
        return toHexString(encry_RC4_byte(data, key, offset));
    }


    /**
     * @Title initKey
     * @Description 根據祕鑰生成S-box
     * @param aKey
     * @return
     */
    private static byte[] initKey(String aKey) {
    	byte[] b_key = hexStringToByteArray(aKey);
        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;
    }




    
    /**
     * @Title RC4Base
     * @Description 加密數據
     * @param input
     * @param mKkey
     * @return
     */
    private static byte[] RC4Base(byte[] input, String mKkey) {
        int x = 0;
        int y = 0;
        byte key[] = initKey(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;
    }
    
    /**
     * @Title RC4Base
     * @Description  加密數據
     * @param input
     * @param mKkey
     * @param offset
     * @return
     */
    private static byte[] RC4Base(byte[] input, String mKkey, int offset) {
        int x = offset;
        int y = offset;
        byte key[] = initKey(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;
    }


    /**
     * @Title hexStringToByteArray
     * @Description 16進制字符串轉byte[]
     * @param hexStr
     * @return
     */
    public static byte[] hexStringToByteArray(String hexStr) {
        int len = hexStr.length();
        byte[] b = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            // 兩位一組,表示一個字節,把這樣表示的16進制字符串,還原成一個字節
            b[i / 2] = (byte) ((Character.digit(hexStr.charAt(i), 16) << 4) + Character
                    .digit(hexStr.charAt(i + 1), 16));
        }
        return b;
    }


    /**
     * 字節數組轉成16進製表示格式的字符串
     *
     * @param byteArray 要轉換的字節數組
     * @return 16進製表示格式的字符串
     **/
    public static String toHexString(byte[] byteArray) {
        if (byteArray == null || byteArray.length < 1)
            throw new IllegalArgumentException("this byteArray must not be null or empty");




        final StringBuilder hexString = new StringBuilder();
        for (int i = 0; i < byteArray.length; i++) {
            if ((byteArray[i] & 0xff) < 0x10)//0~F前面不零
                hexString.append("0");
            hexString.append(Integer.toHexString(0xFF & byteArray[i]));
        }
        return hexString.toString().toLowerCase();
    }
    
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章