package com.app.common.util;
public class ArcFour {
/**
* 加密解密 参数为String 字符串(String data, String key)
*
* @param data
* @param key
* @return String
* @throws UnsupportedEncodingException
*/
public static final int vactorLen = 256;
private static String encodeAndDecodeStr(String data, String key)
{
// 1.参数检查
if (data != null && data.length() > 0 && key != null
&& key.length() > 0)
{
// 2. 初始化算法
// 2.1定义矢量vactor
int[] vactor = new int[vactorLen];
// 2.2定义临时变量tempk
byte[] tempK = new byte[vactorLen];
// 2.3给vactor赋值ֵ0-255
for (int i = 0; i < vactorLen; i++)
vactor[i] = i;
int j = 1;
// 2.4循环给tempK赋值
for (short i = 0; i < vactorLen; i++)
{
tempK[i] = (byte) key.charAt((i % key.length()));
}
j = 0;
// 2.5 置换vactor值
for (int i = 0; i < 255; i++)
{
j = (j + vactor[i] + tempK[i]) % vactorLen;
int temp = vactor[i];
vactor[i] = vactor[j];
vactor[j] = temp;
}
int i = 0;
j = 0;
// 2.6把data定义成char[]数组dataChar
char[] dataChar = data.toCharArray();
// 2.7计算数组dataChar[]长度,用InputCharLen接收。
int charLen = dataChar.length;
// 2.8 定义 长度为InputCharLen的char数组iOutputChar[]
char[] resultChar = new char[charLen];
// 2.9 加密解密算法
for (short x = 0; x < charLen; x++)
{
i = (i + 1) % vactorLen;
j = (j + vactor[i]) % vactorLen;
int temp = vactor[i];
vactor[i] = vactor[j];
vactor[j] = temp;
char tempChar = (char) vactor[(vactor[i] + (vactor[j] % vactorLen))
% vactorLen];
resultChar[x] = (char) (dataChar[x] ^ tempChar);
}
// 3. 输出结果
return new String(resultChar);
}
return null;
}
/**
* 二进制转换16进制*********
*
* @param buf
* @return
*/
private static String parseByte2HexStr(byte bytes[])
{
// 参数检查
if (bytes != null && bytes.length > 0)
{
// 定义b长度为bLenth
int bLenth = bytes.length;
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < bLenth; i++)
{
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1)
{
hex = '0' + hex;
}
stringBuffer.append(hex.toUpperCase());
}
return stringBuffer.toString();
}
return null;
}
// 测试**************
public static void main(String[] args)
{
// String data = "梦想还是要有的,万一实现了呢?";
String data = "s.,gKsf发$@($*@¥棥梦想hai¥##@……LSLK";
String key = "abcdefa";
// 原文
System.out.println("加密前:" + data);
// 密文
String str = null;
if (data != null && data.length() > 0)
{
str = encodeAndDecodeStr(data, key);
System.out.println("加密后:" + parseByte2HexStr(str.getBytes()));
// 解密
System.out.println("解密后:"
+ new String(encodeAndDecodeStr(str, key)));
}
}
}