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