java加密

概述:
出于安全考虑,网络的传输中经常对传输数据做加密和编码处理,其中涉及以下几种:
1、md5加密,该加密算法是单向加密,即加密的数据不能再通过解密还原。相关类包含在java.security.MessageDigest包中。
2、3-DES加密,该加密算法是可逆的,解密方可以通过与加密方约定的密钥匙进行解密。相关类包含在javax.crypto.*包中。
3、base64编码,是用于传输8bit字节代码最常用的编码方式。相关类在sun.misc.BASE64Decoder 和sun.misc.BASE64Encoder 中。
4、URLEncoder编码,是一种字符编码,保证被传送的参数由遵循规范的文本组成。相关类在java.net.URLEncoder包中。
细节:
1、进行MD5加密,得到byte[]

private byte[] md5(String strSrc)
{
byte[] returnByte = null;
try
{
MessageDigest md5 = MessageDigest.getInstance("MD5");
returnByte = md5.digest(strSrc.getBytes("GBK"));
}
catch(Exception e)
{
e.printStackTrace();
}
return returnByte;
}
2、得到3-DES的密钥匙

private byte[] getEnKey(String spKey)
{
byte[] desKey=null;
try
{
byte[] desKey1 = md5(spKey);
desKey = new byte[24];
int i = 0;
while (i < desKey1.length && i < 24) {
desKey[i] = desKey1[i];
i++;
}
if (i < 24) {
desKey[i] = 0;
i++;
}
}
catch(Exception e){
e.printStackTrace();
}
return desKey;
}
3、3-DES加密

public byte[] Encrypt(byte[] src,byte[] enKey)
{
byte[] encryptedData = null;
try
{
DESedeKeySpec dks = new DESedeKeySpec(enKey);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey key = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, key);
encryptedData = cipher.doFinal(src);
}
catch(Exception e)
{
e.printStackTrace();
}
return encryptedData;
}
4、对字符串进行Base64编码


public String getBase64Encode(byte[] src)
{
String requestValue="";
try{
  BASE64Encoder base64en = new BASE64Encoder();
  requestValue=base64en.encode(src);
  //System.out.println(requestValue);
}
catch(Exception e){
  e.printStackTrace();
}

return requestValue;
}

5、根据需要可以去掉字符串的换行符号


private String filter(String str)
{
String output = null;
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); i++)
{
int asc = str.charAt(i);
if(asc != 10 && asc != 13)
sb.append(str.subSequence(i, i + 1));
}
output = new String(sb);
return output;
}

6、对字符串进行URLDecoder.encode(strEncoding)编码


public String getURLEncode(String src)
{
String requestValue="";
try{
requestValue = URLEncoder.encode(src);
}
catch(Exception e){
  e.printStackTrace();
}
return requestValue;
}

7、对字符串进行URLDecoder.decode(strEncoding)解码

public String getURLDecoderdecode(String src)
{
String requestValue="";
try{

requestValue = URLDecoder.decode(src);
}
catch(Exception e){
  e.printStackTrace();
}

return requestValue;
}
8、进行3-DES解密(密钥匙等同于加密的密钥匙)

public String deCrypt(byte[] debase64,String spKey)
{
String strDe = null;
Cipher cipher = null;
try
{
cipher=Cipher.getInstance("DESede");
byte[] key = getEnKey(spKey);
DESedeKeySpec dks = new DESedeKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey sKey = keyFactory.generateSecret(dks);
cipher.init(Cipher.DECRYPT_MODE, sKey);
byte ciphertext[] = cipher.doFinal(debase64);
strDe = new String(ciphertext,"UTF-16LE");
}
catch(Exception ex)
{
  strDe = "";
  ex.printStackTrace();
}
return strDe;
经过以上步骤就可以完成MD5加密,3-DES加密、base64编码传输、base64解码、3-DES解密得到原文。
程序全文如下:
package com.neusoft.test.util.crypt;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Endecrypt {


private byte[] md5(String strSrc)
{
byte[] returnByte = null;
try
{
MessageDigest md5 = MessageDigest.getInstance("MD5");
returnByte = md5.digest(strSrc.getBytes("GBK"));
}
catch(Exception e)
{
e.printStackTrace();
}
return returnByte;
}




private byte[] getEnKey(String spKey)
{
byte[] desKey=null;
try
{
byte[] desKey1 = md5(spKey);
desKey = new byte[24];
int i = 0;
while (i < desKey1.length && i < 24) {
desKey[i] = desKey1[i];
i++;
}
if (i < 24) {
desKey[i] = 0;
i++;
}
}
catch(Exception e){
e.printStackTrace();
}
return desKey;
}


public byte[] Encrypt(byte[] src,byte[] enKey)
{
byte[] encryptedData = null;
try
{
DESedeKeySpec dks = new DESedeKeySpec(enKey);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey key = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, key);
encryptedData = cipher.doFinal(src);
}
catch(Exception e)
{
e.printStackTrace();
}
return encryptedData;
}

public String getBase64Encode(byte[] src)
{
String requestValue="";
try{
  BASE64Encoder base64en = new BASE64Encoder();
  requestValue=base64en.encode(src);
  //System.out.println(requestValue);
}
catch(Exception e){
  e.printStackTrace();
}

return requestValue;
}

private String filter(String str)
{
String output = null;
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); i++)
{
int asc = str.charAt(i);
if(asc != 10 && asc != 13)
sb.append(str.subSequence(i, i + 1));
}
output = new String(sb);
return output;
}

public String getURLEncode(String src)
{
String requestValue="";
try{
requestValue = URLEncoder.encode(src);
}
catch(Exception e){
  e.printStackTrace();
}
return requestValue;
}

public String get3DESEncrypt(String src,String spkey)
{
String requestValue="";
try{
//得到3-DES的密钥匙
  byte[] enKey = getEnKey(spkey);
  //要进行3-DES加密的内容在进行"UTF-16LE"取字节
  byte[] src2 = src.getBytes("UTF-16LE");
  //进行3-DES加密后的内容的字节
  byte[] encryptedData = Encrypt(src2,enKey);
//进行3-DES加密后的内容进行BASE64编码
  String base64String = getBase64Encode(encryptedData);
//BASE64编码去除换行符后
  String base64Encrypt = filter(base64String);
 
  //对BASE64编码中的HTML控制码进行转义的过程
  requestValue=getURLEncode(base64Encrypt);
  //System.out.println(requestValue);
}
catch(Exception e){
  e.printStackTrace();
}
return requestValue;
}

public String getURLDecoderdecode(String src)
{
String requestValue="";
try{
requestValue = URLDecoder.decode(src);
}
catch(Exception e){
  e.printStackTrace();
}
return requestValue;
}

public String deCrypt(byte[] debase64,String spKey)
{
String strDe = null;
Cipher cipher = null;
try
{
cipher=Cipher.getInstance("DESede");
byte[] key = getEnKey(spKey);
DESedeKeySpec dks = new DESedeKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey sKey = keyFactory.generateSecret(dks);
cipher.init(Cipher.DECRYPT_MODE, sKey);
byte ciphertext[] = cipher.doFinal(debase64);
strDe = new String(ciphertext,"UTF-16LE");
}
catch(Exception ex)
{
  strDe = "";
  ex.printStackTrace();
}
return strDe;
}

public String get3DESDecrypt(String src,String spkey)
{
String requestValue="";
try{
//得到3-DES的密钥匙
//URLDecoder.decodeTML控制码进行转义的过程
  String URLValue=getURLDecoderdecode(src);
 
  //进行3-DES加密后的内容进行BASE64编码
BASE64Decoder base64Decode = new BASE64Decoder();
byte[] base64DValue = base64Decode.decodeBuffer(URLValue);
//要进行3-DES加密的内容在进行"UTF-16LE"取字节
requestValue = deCrypt(base64DValue,spkey);
}
catch(Exception e){
  e.printStackTrace();
}
return requestValue;
}

public static void main(String[] args) {
Endecrypt test = new Endecrypt();
String oldString = "毒素发";
String SPKEY = "1234";
System.out.println("1。分配的SPKEY为: "+SPKEY);
System.out.println("2。的内容为: "+oldString);
String reValue = test.get3DESEncrypt(oldString,SPKEY);
reValue = reValue.trim().intern();
System.out.println("进行3-DES加密后的内容: "+reValue);
String reValue2 = test.get3DESDecrypt(reValue,SPKEY);
System.out.println("进行3-DES解密后的内容: "+reValue2);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值