您的位置:首页 > 编程语言 > Java开发

java_加密解密

2015-07-22 16:59 375 查看
/**
* 加密解密(使用方法直接看最下面的main方法)
* @author liupeng
*
*/
public class LiupengEnDe
{
private static final String liupengKey = "lp_294333475";
private static boolean InitRC4(byte[] pRC4Table, byte[] pKeyTable)
{
int i;
int b=0;
int Temp;
int KeyLen = pKeyTable.length;
//置初值
for(i=0;i<256;i++){
pRC4Table[i]= (byte)i;
}
//变值
for(i=0;i<256;i++)
{
b = (b + (pRC4Table[i]& 0x0FF) + (pKeyTable[i % KeyLen]& 0x0ff)) % 256;
Temp = (int)pRC4Table[i];
pRC4Table[i] = pRC4Table[b];
pRC4Table[b] = (byte)Temp;
}
return true;
}

private static boolean InitBase64(byte[] pDecodeTable, byte[] pBase64Tab)
{
byte[] tDecodeTable ={
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, 62 , (byte)255, (byte)255,
(byte)255, 63 , 52 , 53 ,
54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , (byte)255, (byte)255,
(byte)255, 64 , (byte)255, (byte)255, (byte)255, 0  , 1  , 2  , 3  , 4  ,
5  , 6  , 7  , 8  , 9  , 10 , 11 , 12 , 13 , 14 ,
15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 ,
25 , (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, 26 , 27 , 28 ,
29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 ,
39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 ,
49 , 50 , 51 , (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255,(byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255,(byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)55, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255,
(byte)255, (byte)255, (byte)255, (byte)255};
int iLoop;
for(iLoop=0;iLoop<234;iLoop++)
pDecodeTable[iLoop] = tDecodeTable[iLoop];
for(iLoop=65;iLoop<=90;iLoop++)
pBase64Tab[iLoop - 65] = (byte)iLoop;
for(iLoop=97;iLoop<=122;iLoop++)
pBase64Tab[iLoop - 71] = (byte)iLoop;
for(iLoop=0;iLoop<=9;iLoop++)
pBase64Tab[iLoop + 52] =(byte)(48+iLoop);
pBase64Tab[62] = 43;
pBase64Tab[63] = 47;
return true;
}

public static byte[] Base64EncryptByte(byte[] DataIn)
{
byte[] Base64Tab=new byte[64];
byte[] DecodeTable=new byte[234];
InitBase64(DecodeTable,Base64Tab);

byte[] DataTemp = new byte[4];
int iTemp=0;
int iLoop=0;
int BytesDataIn=0;
int BytesDataOut=0;
int ExtraBytes=0;
byte[] DataOut = null;

//      BytesDataIn = _mbslen(DataIn);
BytesDataIn = DataIn.length;
ExtraBytes = BytesDataIn % 3;
if(ExtraBytes == 0)
BytesDataOut = (BytesDataIn / 3) * 4;
else
BytesDataOut = ((int)(BytesDataIn / 3) + 1) * 4;
DataOut = new byte[BytesDataOut];

for(iLoop = 0;iLoop<=(BytesDataIn - ExtraBytes - 1);iLoop+=3)
{
DataOut[iTemp] = Base64Tab[((int)((DataIn[iLoop] & 0x0ff) / 4) & 0x03F)];
DataOut[iTemp + 1] = Base64Tab[(DataIn[iLoop] & 0x003) * 16 | ((int)((DataIn[iLoop + 1]&0x0ff) / 16)) & 0x0F];
DataOut[iTemp + 2] = Base64Tab[(DataIn[iLoop + 1] & 0x00F) * 4 | ((int)((DataIn[iLoop + 2]&0x0ff) / 64)) & 0x03];
DataOut[iTemp + 3] = Base64Tab[DataIn[iLoop + 2] & 0x03F];
iTemp += 4;
}

if(ExtraBytes == 1)
{
DataTemp[0] = DataIn[BytesDataIn-1];
DataTemp[1] = 0;
DataTemp[2] = 0;
DataOut[BytesDataOut - 4] = Base64Tab[(int)((DataTemp[0]& 0x0ff) / 4) & 0x3F];
DataOut[BytesDataOut - 3] = Base64Tab[(DataTemp[0] & 0x003) * 16 | (int)((DataTemp[1] & 0x0ff) / 16) & 0x0F];
DataOut[BytesDataOut - 2] = 61;
DataOut[BytesDataOut - 1] = 61;
}
else if (ExtraBytes == 2)
{
DataTemp[0] = DataIn[BytesDataIn - 2];
DataTemp[1] = DataIn[BytesDataIn - 1];
DataTemp[2] = 0;
DataOut[BytesDataOut - 4] = Base64Tab[(int)((DataTemp[0]&0x0ff)/ 4) & 0x3F];
DataOut[BytesDataOut - 3] = Base64Tab[(DataTemp[0] & 0x003) * 16 | (int)((DataTemp[1] & 0x0ff) / 16) & 0x0F];
DataOut[BytesDataOut - 2] = Base64Tab[(DataTemp[1] & 0x00F) * 4 | (int)((DataTemp[2]&0x0ff) / 64) & 0x03];
DataOut[BytesDataOut - 1] = 61;
}
return DataOut;
}

public static byte[] Base64DecryptByte(byte[] DataIn) throws Exception
{
byte[] Base64Tab=new byte[64];
byte[] DecodeTable=new byte[234];
byte[] DataOut = null;
InitBase64(DecodeTable,Base64Tab);

byte[] DataTemp = new byte[4];
int iTemp=0;
int iLoop=0;
int BytesDataIn=0;
int ExtraBytes=0;

BytesDataIn = DataIn.length;
if(DataIn[BytesDataIn-1] == 61){
ExtraBytes = 1;
if(DataIn[BytesDataIn-2] == 61)
ExtraBytes = 2;
}

int BytesDataOut = (int)((BytesDataIn * 0.75) - ExtraBytes);
DataOut = new byte[BytesDataOut];
try{
for(iLoop = 0;iLoop<(BytesDataIn - 5);iLoop+=4){
//DataTemp[0] = DecodeTable[DataIn[iLoop]];
DataTemp[1] = DecodeTable[DataIn[iLoop + 1]];
DataTemp[2] = DecodeTable[DataIn[iLoop + 2]];
//DataTemp[3] = DecodeTable[DataIn[iLoop + 3]];
DataOut[iTemp] = (byte) ((DecodeTable[DataIn[iLoop]] * 4) | ((int)(DataTemp[1] / 16) & 0x03));
DataOut[iTemp + 1] = (byte) (((DataTemp[1] & 0x0F) * 16) | ((int)(DataTemp[2] / 4) & 0x0F));
DataOut[iTemp + 2] = (byte) (((DataTemp[2] & 0x03) * 64) | DecodeTable[DataIn[iLoop + 3]]);
iTemp += 3;
}
} catch (Exception e){
throw new Exception("It is not BASE64 encode string");
}

DataTemp[0] = DecodeTable[DataIn[iLoop]];
DataTemp[1] = DecodeTable[DataIn[iLoop + 1]];
DataTemp[2] = DecodeTable[DataIn[iLoop + 2]];
DataTemp[3] = DecodeTable[DataIn[iLoop + 3]];

if(DataTemp[3] == 64 || DataTemp[2] == 64){
if(DataTemp[3] == 64 && DataTemp[2] != 64){
DataTemp[0] = DecodeTable[DataIn[iLoop]];
DataTemp[1] = DecodeTable[DataIn[iLoop + 1]];
DataTemp[2] = DecodeTable[DataIn[iLoop + 2]];
DataOut[iTemp] = (byte) ((DataTemp[0] * 4) | ((int)(DataTemp[1] / 16) & 0x03));
DataOut[iTemp + 1] = (byte) (((DataTemp[1] & 0x0F) * 16) | ((int)(DataTemp[2] / 4) & 0x0F));
return DataOut;
}else if(DataTemp[2] == 64){
DataTemp[0] = DecodeTable[DataIn[iLoop]];
DataTemp[1] = DecodeTable[DataIn[iLoop + 1]];
DataOut[iTemp] = (byte) ((DataTemp[0] * 4) | ((int)(DataTemp[1] / 16) & 0x03));
return DataOut;
}
}

DataOut[iTemp] = (byte) ((DataTemp[0] * 4) | ((int)(DataTemp[1] / 16) & 0x03));
DataOut[iTemp + 1] = (byte) (((DataTemp[1] & 0x0F) * 16) | ((int)(DataTemp[2] / 4) & 0x0F));
DataOut[iTemp + 2] = (byte) (((DataTemp[2] & 0x03) * 64) | DataTemp[3]);
return DataOut;
}

public static boolean RC4EnDecryptByte(byte[] Key, byte[] EnDecryptData)
{
//初始化
byte[] pRC4Table=new byte[256];
InitRC4(pRC4Table,Key);
int i,j;
int iLoop;
int Temp;
int EnDecryptDataLen = EnDecryptData.length;

//加密数据
i=0;
j=0;
for(iLoop=0;iLoop<(int)EnDecryptDataLen;iLoop++) {
i = (i + 1) % 256;
j = (j + pRC4Table[i] & 0x0ff) % 256;
Temp = (int)pRC4Table[i];
pRC4Table[i]=pRC4Table[j];
pRC4Table[j]=(byte)Temp;
EnDecryptData[iLoop]=(byte)( EnDecryptData[iLoop] ^ (pRC4Table[((pRC4Table[i] & 0x0ff) + (pRC4Table[j] & 0x0ff)) % 256]));
}
return true;
}

public static String LiupengEncryptString(String dataIn)
{
byte[] dataInBytes = dataIn.getBytes();
RC4EnDecryptByte(liupengKey.getBytes(), dataInBytes);
byte[] base64Bytes = Base64EncryptByte(dataInBytes);
String retString = new String(base64Bytes);
return retString;
}

public static String LiupengEncryptBytes(byte[] dataIn)
{
RC4EnDecryptByte(liupengKey.getBytes(), dataIn);
byte[] base64Bytes = Base64EncryptByte(dataIn);
String retString = new String(base64Bytes);
return retString;
}

public static String LiupengDecryptString(String dataIn) throws Exception
{
byte[] dataInBase64 = Base64DecryptByte(dataIn.getBytes());
RC4EnDecryptByte(liupengKey.getBytes(), dataInBase64);
String retString = new String(dataInBase64);
return retString;
}

public static byte[] LiupengDecryptToBytes(String dataIn) throws Exception
{
byte[] dataInBase64 = Base64DecryptByte(dataIn.getBytes());
RC4EnDecryptByte(liupengKey.getBytes(), dataInBase64);
return dataInBase64;
}

public static String LiupengEncryptString(String dataIn, String userKey)
{
byte[] dataInBytes = dataIn.getBytes();
StringBuilder sb = new StringBuilder();
sb.append(userKey).append(liupengKey).append(userKey);
RC4EnDecryptByte(sb.toString().getBytes(), dataInBytes);
byte[] base64Bytes = Base64EncryptByte(dataInBytes);
String retString = new String(base64Bytes);
return retString;
}

public static String LiupengDecryptString(String dataIn, String userKey) throws Exception
{
byte[] dataInBase64 = Base64DecryptByte(dataIn.getBytes());
StringBuilder sb = new StringBuilder();
sb.append(userKey).append(liupengKey).append(userKey);
RC4EnDecryptByte(sb.toString().getBytes(), dataInBase64);
String retString = new String(dataInBase64);
return retString;
}

public static void main(String[] args) throws Exception{
String JPwd = LiupengEnDe.LiupengEncryptString("1234", "liupeng");
System.out.println(JPwd);//eI8snA==
String OPwd = LiupengEnDe.LiupengDecryptString("eI8snA==", "liupeng");
System.out.println(OPwd);//1234

String test = LiupengEnDe.LiupengEncryptString("1234");
System.out.println(test);//WOGKxg==
String test1 = LiupengEnDe.LiupengDecryptString("WOGKxg==");
System.out.println(test1);//1234
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: