Java实现DES加密与解密,md5加密以及Java实现MD5加密解密类
很多时候要对秘要进行持久化加密,此时的加密采用md5。采用对称加密的时候就采用DES方法了
importjava.io.IOException;
importjava.security.MessageDigest;
importjava.security.SecureRandom;
importjavax.crypto.Cipher;
importjavax.crypto.SecretKey;
importjavax.crypto.SecretKeyFactory;
importjavax.crypto.spec.DESKeySpec;
importsun.misc.BASEDecoder;
importsun.misc.BASEEncoder;
/**
*密匙工具类(包含des加密与md加密)
*@authormingge
*
*/
publicclassKeysUtil{
privatefinalstaticStringDES="DES";
privatefinalstaticStringMD="MD";
privatefinalstaticStringKEY="opeddsaeaddadbcabf";
/**
*MD加密算法
*@paramdata
*@return
*/
publicstaticStringmdEncrypt(Stringdata){
StringresultString=null;
try{
resultString=newString(data);
MessageDigestmd=MessageDigest.getInstance(MD);
resultString=bytehexString(md.digest(resultString.getBytes()));
}catch(Exceptionex){
}
returnresultString;
}
privatestaticStringbytehexString(byte[]bytes){
StringBufferbf=newStringBuffer(bytes.length*);
for(inti=;i<bytes.length;i++){
if((bytes[i]&xff)<x){
bf.append("T");
}
bf.append(Long.toString(bytes[i]&xff,));
}
returnbf.toString();
}
/**
*Description根据键值进行加密
*@paramdata
*@paramkey加密键byte数组
*@return
*@throwsException
*/
publicstaticStringdesEncrypt(Stringdata,Stringkey)throwsException{
if(key==null){
key=KEY;
}
byte[]bt=encrypt(data.getBytes(),key.getBytes());
Stringstrs=newBASEEncoder().encode(bt);
returnstrs;
}
/**
*Description根据键值进行解密
*@paramdata
*@paramkey加密键byte数组
*@return
*@throwsIOException
*@throwsException
*/
publicstaticStringdesDecrypt(Stringdata,Stringkey)throwsIOException,
Exception{
if(data==null){
returnnull;
}
if(key==null){
key=KEY;
}
BASEDecoderdecoder=newBASEDecoder();
byte[]buf=decoder.decodeBuffer(data);
byte[]bt=decrypt(buf,key.getBytes());
returnnewString(bt);
}
/**
*Description根据键值进行加密
*@paramdata
*@paramkey加密键byte数组
*@return
*@throwsException
*/
privatestaticbyte[]encrypt(byte[]data,byte[]key)throwsException{
//生成一个可信任的随机数源
SecureRandomsr=newSecureRandom();
//从原始密钥数据创建DESKeySpec对象
DESKeySpecdks=newDESKeySpec(key);
//创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(DES);
SecretKeysecurekey=keyFactory.generateSecret(dks);
//Cipher对象实际完成加密操作
Ciphercipher=Cipher.getInstance(DES);
//用密钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE,securekey,sr);
returncipher.doFinal(data);
}
/**
*Description根据键值进行解密
*@paramdata
*@paramkey加密键byte数组
*@return
*@throwsException
*/
privatestaticbyte[]decrypt(byte[]data,byte[]key)throwsException{
//生成一个可信任的随机数源
SecureRandomsr=newSecureRandom();
//从原始密钥数据创建DESKeySpec对象
DESKeySpecdks=newDESKeySpec(key);
//创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(DES);
SecretKeysecurekey=keyFactory.generateSecret(dks);
//Cipher对象实际完成解密操作
Ciphercipher=Cipher.getInstance(DES);
//用密钥初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE,securekey,sr);
returncipher.doFinal(data);
}
}
下面在给大家介绍一段代码关于Java实现MD5加密解密类
Java实现MD5加密以及解密类,附带测试类,具体见代码。
MD5加密解密类——MyMD5Util,代码如下:
packagecom.zyg.security.md5;
importjava.io.UnsupportedEncodingException;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjava.security.SecureRandom;
importjava.util.Arrays;
publicclassMyMD5Util{
privatestaticfinalStringHEX_NUMS_STR="0123456789ABCDEF";
privatestaticfinalIntegerSALT_LENGTH=12;
/**
*将16进制字符串转换成字节数组
*@paramhex
*@return
*/
publicstaticbyte[]hexStringToByte(Stringhex){
intlen=(hex.length()/2);
byte[]result=newbyte[len];
char[]hexChars=hex.toCharArray();
for(inti=0;i<len;i++){
intpos=i*2;
result[i]=(byte)(HEX_NUMS_STR.indexOf(hexChars[pos])<<4
|HEX_NUMS_STR.indexOf(hexChars[pos+1]));
}
returnresult;
}
/**
*将指定byte数组转换成16进制字符串
*@paramb
*@return
*/
publicstaticStringbyteToHexString(byte[]b){
StringBufferhexString=newStringBuffer();
for(inti=0;i<b.length;i++){
Stringhex=Integer.toHexString(b[i]&0xFF);
if(hex.length()==1){
hex='0'+hex;
}
hexString.append(hex.toUpperCase());
}
returnhexString.toString();
}
/**
*验证口令是否合法
*@parampassword
*@parampasswordInDb
*@return
*@throwsNoSuchAlgorithmException
*@throwsUnsupportedEncodingException
*/
publicstaticbooleanvalidPassword(Stringpassword,StringpasswordInDb)
throwsNoSuchAlgorithmException,UnsupportedEncodingException{
//将16进制字符串格式口令转换成字节数组
byte[]pwdInDb=hexStringToByte(passwordInDb);
//声明盐变量
byte[]salt=newbyte[SALT_LENGTH];
//将盐从数据库中保存的口令字节数组中提取出来
System.arraycopy(pwdInDb,0,salt,0,SALT_LENGTH);
//创建消息摘要对象
MessageDigestmd=MessageDigest.getInstance("MD5");
//将盐数据传入消息摘要对象
md.update(salt);
//将口令的数据传给消息摘要对象
md.update(password.getBytes("UTF-8"));
//生成输入口令的消息摘要
byte[]digest=md.digest();
//声明一个保存数据库中口令消息摘要的变量
byte[]digestInDb=newbyte[pwdInDb.length-SALT_LENGTH];
//取得数据库中口令的消息摘要
System.arraycopy(pwdInDb,SALT_LENGTH,digestInDb,0,digestInDb.length);
//比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同
if(Arrays.equals(digest,digestInDb)){
//口令正确返回口令匹配消息
returntrue;
}else{
//口令不正确返回口令不匹配消息
returnfalse;
}
}
/**
*获得加密后的16进制形式口令
*@parampassword
*@return
*@throwsNoSuchAlgorithmException
*@throwsUnsupportedEncodingException
*/
publicstaticStringgetEncryptedPwd(Stringpassword)
throwsNoSuchAlgorithmException,UnsupportedEncodingException{
//声明加密后的口令数组变量
byte[]pwd=null;
//随机数生成器
SecureRandomrandom=newSecureRandom();
//声明盐数组变量
byte[]salt=newbyte[SALT_LENGTH];
//将随机数放入盐变量中
random.nextBytes(salt);
//声明消息摘要对象
MessageDigestmd=null;
//创建消息摘要
md=MessageDigest.getInstance("MD5");
//将盐数据传入消息摘要对象
md.update(salt);
//将口令的数据传给消息摘要对象
md.update(password.getBytes("UTF-8"));
//获得消息摘要的字节数组
byte[]digest=md.digest();
//因为要在口令的字节数组中存放盐,所以加上盐的字节长度
pwd=newbyte[digest.length+SALT_LENGTH];
//将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐
System.arraycopy(salt,0,pwd,0,SALT_LENGTH);
//将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节
System.arraycopy(digest,0,pwd,SALT_LENGTH,digest.length);
//将字节数组格式加密后的口令转化为16进制字符串格式的口令
returnbyteToHexString(pwd);
}
}
测试类——Client,代码如下:
packagecom.zyg.security.md5;
importjava.io.UnsupportedEncodingException;
importjava.security.NoSuchAlgorithmException;
importjava.util.HashMap;
importjava.util.Map;
publicclassClient{
privatestaticMapusers=newHashMap();
publicstaticvoidmain(String[]args){
StringuserName="zyg";
Stringpassword="123";
registerUser(userName,password);
userName="changong";
password="456";
registerUser(userName,password);
StringloginUserId="zyg";
Stringpwd="1232";
try{
if(loginValid(loginUserId,pwd)){
System.out.println("欢迎登陆!!!");
}else{
System.out.println("口令错误,请重新输入!!!");
}
}catch(NoSuchAlgorithmExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(UnsupportedEncodingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/**
*注册用户
*
*@paramuserName
*@parampassword
*/
publicstaticvoidregisterUser(StringuserName,Stringpassword){
StringencryptedPwd=null;
try{
encryptedPwd=MyMD5Util.getEncryptedPwd(password);
users.put(userName,encryptedPwd);
}catch(NoSuchAlgorithmExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(UnsupportedEncodingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/**
*验证登陆
*
*@paramuserName
*@parampassword
*@return
*@throwsUnsupportedEncodingException
*@throwsNoSuchAlgorithmException
*/
publicstaticbooleanloginValid(StringuserName,Stringpassword)
throwsNoSuchAlgorithmException,UnsupportedEncodingException{
StringpwdInDb=(String)users.get(userName);
if(null!=pwdInDb){//该用户存在
returnMyMD5Util.validPassword(password,pwdInDb);
}else{
System.out.println("不存在该用户!!!");
returnfalse;
}
}
}