欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java 易懂易用的MD5加密(可直接运行)(2)

程序员文章站 2024-02-19 21:24:16
程序全文如下: 复制代码 代码如下:package com.neusoft.test.util.crypt; import java.io.ioexception...
程序全文如下: 
复制代码 代码如下:

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;
/**
* <p>title:加密解密测试</p>
*
* <p>description: 加密解密</p>
*
*<p>date : 2005-08-11</p>
*
* <p>copyright: copyright (c) 2005 neusoft</p>
*
* <p>company: neusoft</p>
*
* @author mengk
* @version 1.00
*
* <p>------------------------------------------------------------</p>
* <p> 修改历史 </p>
* <p> 序号 日期 修改人 修改原因</p>
* <p> 1 </p>
*/
public class endecrypt {
/**
* 进行md5加密
* @param string 原始的spkey
* @return byte[] 指定加密方式为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;
}
/**
* 得到3-des的密钥匙
* 根据接口规范,密钥匙为24个字节,md5加密出来的是16个字节,因此后面补8个字节的0
* @param string 原始的spkey
* @return byte[] 指定加密方式为md5后的byte[]
*/
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-des加密
* @param byte[] src 要进行3-des加密的byte[]
* @param byte[] enkey 3-des加密密钥
* @return byte[] 3-des加密后的byte[]
*/
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;
}
/**
* 对字符串进行base64编码
* @param byte[] src 要进行编码的字符
*
* @return string 进行编码后的字符串
*/
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;
}
/**
* 去掉字符串的换行符号
* base64编码3-des的数据时,得到的字符串有换行符号
* ,一定要去掉,否则uni-wise平台解析票根不会成功,
* 提示“sp验证失败”。在开发的过程中,因为这个问题让我束手无策,
* 一个朋友告诉我可以问联通要一段加密后 的文字,然后去和自己生成的字符串比较,
* 这是个不错的调试方法。我最后比较发现我生成的字符串唯一不同的 是多了换行。
* 我用c#语言也写了票根请求程序,没有发现这个问题。
*
*/
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;
}
/**
* 对字符串进行urldecoder.encode(strencoding)编码
* @param string src 要进行编码的字符串
*
* @return string 进行编码后的字符串
*/
public string geturlencode(string src)
{
string requestvalue="";
try{

requestvalue = urlencoder.encode(src);
}
catch(exception e){
e.printstacktrace();
}

return requestvalue;
}
/**
* 3-des加密
* @param string src 要进行3-des加密的string
* @param string spkey分配的spkey
* @return string 3-des加密后的string
*/
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;
}
/**
* 对字符串进行urldecoder.decode(strencoding)解码
* @param string src 要进行解码的字符串
*
* @return string 进行解码后的字符串
*/
public string geturldecoderdecode(string src)
{
string requestvalue="";
try{

requestvalue = urldecoder.decode(src);
}
catch(exception e){
e.printstacktrace();
}

return requestvalue;
}
/**
*
*进行3-des解密(密钥匙等同于加密的密钥匙)。
* @param byte[] src 要进行3-des解密byte[]
* @param string spkey分配的spkey
* @return string 3-des解密后的string
*/
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;
}
/**
* 3-des解密
* @param string src 要进行3-des解密的string
* @param string spkey分配的spkey
* @return string 3-des加密后的string
*/
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);
}
}