/**
* @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();
}
}
RC4 16进制字符串加解密
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.