您的位置:首页 > 其它

AES,SHA,SHA1,MD5加密及解密技术

2017-12-11 09:59 357 查看
package com.gant.encrypt;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
* @ClassName Encrypt
* @Description 加密技术
* @author chao
* @date 2017年12月11日
* @version 1.0
*/
public class Encrypt {

public static void main(String[] args) {
encryptSHA1("彭超");
encryptMD5("彭超");
getMD5("彭");
}

/**
* @Description AES加密方式
* @param str
*            待加密的字符串
* @param secretKeyBase
*            用于生成秘钥的基础字符串
* @return byte[] 加密字节数组
*/
public static byte[] encryptAES(String str, String secretKeyBase) {
try {
KeyGenerator keyGenerator;
keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128, new SecureRandom(secretKeyBase.getBytes()));
SecretKey secretKey = keyGenerator.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec sks = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES"); // 创建密码器
byte[] byteContent = str.getBytes("UTF-8");
cipher.init(Cipher.ENCRYPT_MODE, sks); // 初始化
byte[] result = cipher.doFinal(byteContent);
System.out.println("加密后的结果是:" + result);
return result;
} catch (IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}

/**
* @Description AES解密
* @param bytes
*            待解密的字节数组
* @param secretKeyBase
*            用于生成密钥的基础字符串, 需要注意的是AES是对称加密,所以secretKeyBase在加密解密时要一样的
* @return 解密后的字符串
*/
public static String decryptAES(byte[] bytes, String secretKeyBase) {
try {
KeyGenerator keGenerator = KeyGenerator.getInstance("AES");
keGenerator.init(128, new SecureRandom(secretKeyBase.getBytes()));
SecretKey secretKey = keGenerator.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec sks = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES"); // 创建密码器
cipher.init(Cipher.DECRYPT_MODE, sks); // 初始化
String result = n
4000
ew String(cipher.doFinal(bytes), "UTF-8");
System.out.println("解密后的结果为:" + result.toUpperCase());
return result.toUpperCase();
} catch (UnsupportedEncodingException | IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}

/**
* @Description SHA,SHA1加密(不可逆,不能解密)
* @param str
*            待加密的字符串
* @return String 加密后的字符串
*/
public static String encryptSHA1(String str) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1"); // 如果是SHA加密只需将"SHA-1"改成"SHA"
messageDigest.update(str.getBytes());
byte messageDigestArray[] = messageDigest.digest();
StringBuffer hexStr = new StringBuffer();
// 以下是将字节数组转换为16进制数组
for (int i = 0; i < messageDigestArray.length; i++) {
String shaHex = Integer.toHexString(messageDigestArray[i] & 0xFF); // & 0xFF解释
// :计算机存储数据机制:正数存储的二进制原码,负数存储的是二进制的补码
if (shaHex.length() < 2) {
hexStr.append(0);
}
hexStr.append(shaHex);
}
System.out.println("SHA1加密后的结果是:" + hexStr.toString().toUpperCase());
return hexStr.toString().toUpperCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

return str;
}

/**
* @Description MD5加密(不可逆,不能解密)
* @param str
*            待加密字符串
* @return String 加密后的字符串
*/
public static String encryptMD5(String str) {
try {
// 获取MD5摘要算法的 MessageDigest对象
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
// 使用指定的字节更新摘要
messageDigest.update(str.getBytes("UTF-8"));
// 获取密文
byte md[] = messageDigest.digest();
// 把密文转换为16进制的字符串
StringBuffer hexString = new StringBuffer();
// 字节数组转换为16进制数
for (int i = 0; i < md.length; i++) {
String mdHex = Integer.toHexString(md[i] & 0xFF);
if (mdHex.length() < 2) {
hexString.append(0);
}
hexString.append(mdHex);
}
System.out.println("MD5加密后的结果是:" + hexString.toString().toUpperCase());
return hexString.toString().toUpperCase();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: