JAVA各种加密与解密⽅式(精挑版)
⼩伙伴们不难发现市⾯上有好多种加密解密⽅式,为此我特地研究⼀番,在这⾥整理了⼀下,希望能帮助到⼤家!
⽬录
1.BASE64加密/解密
2.MD5(Message Digest Algorithm)加密
3.DES(Data Encryption Standard)对称加密/解密
4.AES(Advanced Encryption Standard) 加密/解密
5.HMAC(Hash Message Authentication Code,散列消息鉴别码)
6.恺撒加密
7.SHA(Secure Hash Algorithm,安全散列算法)
8.RSA 加密/解密
9.PBE 加密/解密
1.BASE64加密/解密
Base64 编码是我们程序开发中经常使⽤到的编码⽅法,它⽤ 64 个可打印字符来表⽰⼆进制数据。这 64 个字符是:⼩写字母 a-z、⼤写字母 A-Z、数字 0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是 65 个字符),其他所有符号都转换成这个字符集中的字符。Base64 编码通常⽤作存储、传输⼀些⼆进制数据编码⽅法,所以说它本质上是⼀种将⼆进制数据转成⽂本数据的⽅案。
通常⽤作对⼆进制数据进⾏加密,⽰例:
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class Base64Util {
/
***
* BASE64解密
* @param key
* @return
* @throws Exception
*/
public static byte[] decryBASE64(String key) throws Exception{
return (new BASE64Decoder()).decodeBuffer(key);
}
/***
* BASE64加密
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception{
return (new BASE64Encoder()).encode(key);
}
}
2.MD5(Message Digest Algorithm)加密
MD5 是将任意长度的数据字符串转化成短⼩的固定长度的值的单向操作,任意两个字符串不应有相同的散列值。因此 MD5 经常⽤于校验字符串或者⽂件,因为如果⽂件的 MD5 不⼀样,说明⽂件内容也是不⼀样的,如果发现下载的⽂件和给定的 MD5 值不⼀样,就要慎重使⽤。
MD5 主要⽤做数据⼀致性验证、数字签名和安全访问认证,⽽不是⽤作加密。⽐如说⽤户在某个⽹站注册账户时,输⼊的密码⼀般经过MD5 编码,更安全的做法还会加⼀层盐(salt),这样密码就具有不可逆性。然后把编码后的密码存⼊数据库,下次登录的时候把密码MD5 编码,然后和数据库中的作对⽐,这样就提升了⽤户账户的安全性。
是⼀种单向加密算法,只能加密不能解密,⽰例:
import java.security.MessageDigest;
public class MD5Util {
public static final String KEY_MD5 = "MD5";
/***
* MD5加密(⽣成唯⼀的MD5值)
* @param data
* @return
* @throws Exception
*/
public static byte[] encryMD5(byte[] data) throws Exception {
MessageDigest md5 = Instance(KEY_MD5);
md5.update(data);
return md5.digest();
}
}
3.DES(Data Encryption Standard)对称加密/解密
DES 是⼀种对称加密算法,所谓对称加密算法就是:加密和解密使⽤相同密钥的算法。DES 加密算法出⾃ IBM 的研究,后来被美国政府正式采⽤,之后开始⼴泛流传。但近些年使⽤越来越少,因为 DES 使⽤ 56 位密钥,以现代的计算能⼒,24 ⼩时内即可被破解。
顺便说⼀下 3DES(Triple DES),它是 DES 向 AES 过渡的加密算法,使⽤ 3 条 56 位的密钥对数据进⾏三次加密。是 DES 的⼀个更安全的变形。它以 DES 为基本模块,通过组合分组⽅法设计出分组加密算法。⽐起最初的 DES,3DES 更为安全。
使⽤ Java 实现 DES 加密解密,注意密码长度要是 8 的倍数。加密和解密的 Cipher 构造参数⼀定要相同,不然会报错。
数据加密标准算法,和BASE64最明显的区别就是有⼀个⼯作密钥,该密钥既⽤于加密、也⽤于解密,并且要求密钥是⼀个长度⾄少⼤于8位的字符串,⽰例:
import java.security.Key;
import java.security.SecureRandom;
pto.Cipher;
pto.KeyGenerator;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
java源代码加密public class DesUtil {
private static Key key;
private static String KEY_STR="myKey";
private static String CHARSETNAME="UTF-8";
private static String ALGORITHM="DES";
static {
try {
//⽣成DES算法对象
KeyGenerator Instance(ALGORITHM);
//运⽤SHA1安全策略
SecureRandom Instance("SHA1PRNG"); //设置上密钥种⼦
secureRandom.setSeed(Bytes());
//初始化基于SHA1的算法对象
generator.init(secureRandom);
//⽣成密钥对象
ateKey();
generator=null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/***
* 获取加密的信息
* @param str
* @return
*/
public static String getEncryptString(String str) {
//基于BASE64编码,接收byte[]并转换成String
BASE64Encoder encoder = new BASE64Encoder();
try {
//按utf8编码
byte[] bytes = Bytes(CHARSETNAME);
//获取加密对象
Cipher cipher = Instance(ALGORITHM);
//初始化密码信息
cipher.init(Cipher.ENCRYPT_MODE, key);
//加密
byte[] doFinal = cipher.doFinal(bytes);
//byte[]to encode好的String 并返回
de(doFinal);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/
***
* 获取解密之后的信息
* @param str
* @return
*/
public static String getDecryptString(String str) {
BASE64Decoder decoder = new BASE64Decoder();
try {
//将字符串decode成byte[]
byte[] bytes = decoder.decodeBuffer(str);
//获取解密对象
Cipher cipher = Instance(ALGORITHM);
//初始化解密信息
cipher.init(Cipher.DECRYPT_MODE, key);
//解密
byte[] doFial = cipher.doFinal(bytes);
return new String(doFial, CHARSETNAME);
} catch (Exception e) {
throw new RuntimeException(e);
throw new RuntimeException(e);
}
}
}
4.AES(Advanced Encryption Standard) 加密/解密
⾼级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中⼜称 Rijndael 加密法,是美国联邦政府采⽤的⼀种区块加密标准。这个标准⽤来替代原先的 DES,已经被多⽅分析且⼴为全世界所使⽤。简单说就是 DES 的增强版,⽐ DES 的加密强度更⾼。
AES 与 DES ⼀样,⼀共有四种加密模式:电⼦密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)。关于加密模式的介绍,推荐这篇⽂章:⾼级加密标准AES的⼯作模式(ECB、CBC、CFB、OFB)
⽰例代码:
pto.Cipher;
pto.spec.IvParameterSpec;
pto.spec.SecretKeySpec;
public class AESUtil {
public static final String algorithm = "AES";
// AES/CBC/NOPaddin
// AES 默认模式
// 使⽤CBC模式, 在初始化Cipher对象时, 需要增加参数, 初始化向量IV : IvParameterSpec iv = new
// Bytes());
// NOPadding: 使⽤NOPadding模式时, 原⽂长度必须是8byte的整数倍
public static final String transformation = "AES/CBC/NOPadding";
public static final String key = "1234567812345678";
/***
* 加密
* @param original 需要加密的参数(注意必须是16位)
* @return
* @throws Exception
*/
public static String encryptByAES(String original) throws Exception {
// 获取Cipher
Cipher cipher = Instance(transformation);
// ⽣成密钥
SecretKeySpec keySpec = new Bytes(), algorithm);
// 指定模式(加密)和密钥
// 创建初始化向量
IvParameterSpec iv = new Bytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
// cipher.init(Cipher.ENCRYPT_MODE, keySpec);
// 加密
byte[] bytes = cipher.Bytes());
ptBASE64(bytes);
}
/**
* 解密
* @param encrypted 需要解密的参数
* @return
* @throws Exception
*/
public static String decryptByAES(String encrypted) throws Exception {
// 获取Cipher
Cipher cipher = Instance(transformation);
// ⽣成密钥
SecretKeySpec keySpec = new Bytes(), algorithm);
// 指定模式(解密)和密钥
// 创建初始化向量
IvParameterSpec iv = new Bytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
// cipher.init(Cipher.DECRYPT_MODE, keySpec);
/
/ 解密
byte[] bytes = cipher.doFinal(Base64Util.decryBASE64(encrypted));
return new String(bytes);
}
}5.HMAC(Hash Message Authentication Code,散列消息鉴别码)
5.HMAC(Hash Message Authentication Code,散列消息鉴别码)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论