总结⼀些Java常⽤的加密算法
⽬录
⼀、加密算法分类
⼆、加密算法的应⽤
三、对称加密算法实现
3.1 DES介绍
3.2 IDEA介绍
四、不可逆加密算法
4.1 MD5介绍
4.2 SHA1介绍
4.3 HMAC 介绍
五、⾮对称加密
5.1 RSA介绍
5.2 ECC 介绍
⼀、加密算法分类
加密算法通常分为三类:
对称加密
指加密和解密使⽤相同密钥的加密算法。对称加密算法的优点在于加解密效率⾼且易于实现。
不可逆加密
不可逆加密算法的特征是加密过程不需要密钥,并且经过加密的数据⽆法被解密,只有同样输⼊的输⼊数据经过同样的不可逆算法才能得到同样的加密数据。
⾮对称加密
指加密和解密使⽤不同密钥的加密算法,也称为公私钥加密。
⼆、加密算法的应⽤
1.数字签名:进⾏⾝份认证和数据完整性验证,主要⽤到了⾮对称密钥加密技术与数字摘要技术。
2.数字证书:主要⽤来确保数字签名才是安全有效的,数字证书由独⽴的证书发⾏机构发布。数字证书各不相同,每种证书可提供不同级别的可信度,该证书内包含⽤户的个⼈信息和他的公钥信息,同时还附有认证中⼼的签名信息。你爱我像谁歌词
3.MD5:对⽤户密码进⾏加密并进⾏保存。
4.⽹络数据加密:保障传输的数据安全,即使被截获报⽂,在没有密匙的情况下也⽆法得知报⽂真实内容。
5.SSL协议:在握⼿阶段使⽤的是⾮对称加密,在传输阶段使⽤的是对称加密,也就是说在SSL上传送的数据是使⽤对称密钥加密的。同时HTTPS也是由SSL+HTTP协议构建的可进⾏加密传输、⾝份认证(确认客户端连接的⽬标主机是否是真实正确的主机)的⽹络协议。
三、对称加密算法实现
优点:算法对消息双⽅公开、计算量⼩、加密速度快、加密效率⾼。
缺点:在数据传送前,发送⽅和接收⽅必须商定好秘钥,然后双⽅保存好秘钥。如果⼀⽅的秘钥被泄露,那么加密信息就会被破解。
3.1 DES介绍
DES全称为Data Encryption Standard,即数据加密标准,是⼀种使⽤密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在⾮密级政府通信中使⽤,随后该算法在国际上⼴泛流传开来。不过现在已经有点过时了。
Java代码实现:
import java.io.UnsupportedEncodingException;
import java.curity.SecureRandom;
pto.spec.DESKeySpec;
pto.SecretKeyFactory;
pto.SecretKey;
pto.Cipher;
/**
* DES加密介绍 DES是⼀种对称加密算法,所谓对称加密算法即:加密和解密使⽤相同密钥的算法。DES加密算法出⾃IBM的研究, * 后来被美国政府正式采⽤,之后开始⼴泛流传,但是近些年使⽤越来越少,因为DES使⽤56位密钥,以现代计算能⼒,
* 24⼩时内即可被破解。虽然如此,在某些简单应⽤中,我们还是可以使⽤DES加密算法,本⽂简单讲解DES的JAVA实现。
* 注意:DES加密和解密过程中,密钥长度都必须是8的倍数
*/
public class DesDemo {
public DesDemo() {
}
/
/ 测试
public static void main(String args[]) {
// 待加密内容
String str = "cryptology";
// 密码,长度要是8的倍数
String password = "95880288";
byte[] result;
try {
result = Bytes(), password);
System.out.println("加密后:" + result);
裕德龄byte[] decryResult = DesDemo.decrypt(result, password);
System.out.println("解密后:" + new String(decryResult));
} catch (UnsupportedEncodingException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
} catch (Exception e1) {
e1.printStackTrace();
}
}
// 直接将如上内容解密
/**
* 加密
*
* @param datasource
* byte[]
* @param password
* String
* @return byte[]
*/
public static byte[] encrypt(byte[] datasource, String password) {
try {
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new Bytes());
/
/ 创建⼀个密匙⼯⼚,然后⽤它把DESKeySpec转换成胶枪
SecretKeyFactory keyFactory = Instance("DES");
SecretKey curekey = ateSecret(desKey);
// Cipher对象实际完成加密操作
Cipher cipher = Instance("DES");
// ⽤密匙初始化Cipher对象,ENCRYPT_MODE⽤于将 Cipher 初始化为加密模式的常量
cipher.init(Cipher.ENCRYPT_MODE, curekey, random);
// 现在,获取数据并加密
// 正式执⾏加密操作
return cipher.doFinal(datasource); // 按单部分操作加密或解密数据,或者结束⼀个多部分操作
} catch (Throwable e) {
e.printStackTrace();
热水器安装}
return null;
}
/**
* 解密
*
* @param src
* byte[]
* @param password
* String
* @return byte[]
* @throws Exception
*/
public static byte[] decrypt(byte[] src, String password) throws Exception {
// DES算法要求有⼀个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建⼀个DESKeySpec对象
DESKeySpec desKey = new Bytes());
// 创建⼀个密匙⼯⼚
SecretKeyFactory keyFactory = Instance("DES");// 返回实现指定转换的 // Cipher
// 对象
// 将DESKeySpec对象转换成SecretKey对象
SecretKey curekey = ateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Instance("DES");
// ⽤密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, curekey, random);
// 真正开始解密操作
return cipher.doFinal(src);
梵高的油画}
}
3.2 IDEA介绍
这种算法是在DES算法的基础上发展出来的,类似于三重DES。
发展IDEA也是因为感到DES具有密钥太短等缺点。
DEA的密钥为128位,这么长的密钥在今后若⼲年内应该是安全的。
在实际项⽬中⽤到的很少了解即可。
Java代码实现
import java.curity.Key;
import java.curity.Security;
pto.Cipher;
pto.KeyGenerator;
pto.SecretKey;
pto.spec.SecretKeySpec;
import s.codec.binary.Ba64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class IDEADemo {
public static void main(String args[]) {
bcIDEA();
}
public static void bcIDEA() {
String src = " curity idea";
try {
Security.addProvider(new BouncyCastleProvider());
//⽣成key
KeyGenerator keyGenerator = Instance("IDEA");
keyGenerator.init(128);
SecretKey cretKey = ateKey();
byte[] keyBytes = Encoded();
//转换密钥
Key key = new SecretKeySpec(keyBytes, "IDEA");
//加密
Cipher cipher = Instance("IDEA/ECB/ISO10126Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.Bytes());
System.out.println("bc idea encrypt : " + deBa64String(result));
/
/解密
cipher.init(Cipher.DECRYPT_MODE, key);
result = cipher.doFinal(result);
System.out.println("bc idea decrypt : " + new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、不可逆加密算法
优点:不可逆、易计算、特征化
缺点:可能存在散列冲突
4.1 MD5介绍
MD5的作⽤是让⼤容量信息在⽤数字签名软件签署私⼈密钥前被"压缩"成⼀种保密的格式
(也就是把⼀个任意长度的字节串变换成⼀定长的⼗六进制数字串)。
主要有以下特点:
1.压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2.容易计算:从原数据计算出MD5值很容易。
3.抗修改性:对原数据进⾏任何改动,哪怕只修改1个字节,所得到的MD5值都有很⼤区别。
4.强抗碰撞:已知原数据和其MD5值,想找到⼀个具有相同MD5值的数据(即伪造数据)是⾮常困难的。Java代码实现
import java.curity.MessageDigest;
//利⽤JDK提供java.curity.MessageDigest类实现MD5算法
public class MD5Demo {
public static void main(String[] args) {
System.out.println(getMD5Code("不可逆加密算法"));
}艺术节英文
private MD5Demo() {
}
// md5加密
public static String getMD5Code(String message) {
String md5Str = "";
try {
//创建MD5算法消息摘要
MessageDigest md = Instance("MD5");
//⽣成的哈希值的字节数组
byte[] md5Bytes = md.Bytes());
md5Str = bytes2Hex(md5Bytes);
}catch(Exception e) {
e.printStackTrace();
}
return md5Str;
}
// 2进制转16进制
public static String bytes2Hex(byte[] bytes) {
StringBuffer result = new StringBuffer();
int temp;
try {
for (int i = 0; i < bytes.length; i++) {
temp = bytes[i];
if(temp < 0) {
temp += 256;
}
if (temp < 16) {
result.append("0");
}
result.HexString(temp));
}
男男动漫图片} catch (Exception e) {
e.printStackTrace();
}
String();
}
}
4.2 SHA1介绍
对于长度⼩于2^64位的消息,SHA1会产⽣⼀个160位(40个字符)的消息摘要。当接收到消息的时候,这个消息摘要可以⽤来验证数据的完整性。在传输的过程中,数据很可能会发⽣变化,那么这时候就会产⽣不同的消息摘要。
SHA1有如下特性:
不可以从消息摘要中复原信息;
两个不同的消息不会产⽣同样的消息摘要,(但会有1x10 ^ 48分之⼀的机率出现相同的消息摘要,⼀般使⽤时忽略)。
Java代码实现
import java.io.UnsupportedEncodingException;
import java.curity.MessageDigest;
import java.curity.NoSuchAlgorithmException;
public class SHA1Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(getSha1("不可逆加密算法"));
}
public static String getSha1(String str) {
if (null == str || 0 == str.length()) {
return null;
}
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
//创建SHA1算法消息摘要对象
MessageDigest mdTemp = Instance("SHA1");
//使⽤指定的字节数组更新摘要。
mdTemp.Bytes("UTF-8"));
/
/⽣成的哈希值的字节数组
byte[] md = mdTemp.digest();
//SHA1算法⽣成信息摘要关键过程
int j = md.length;
char[] buf = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
研究生考试流程return new String(buf);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "0";
}
}
4.3 HMAC 介绍
HMAC 是密钥相关的哈希运算消息认证码(Hash-bad Message Authentication Code),HMAC 运算利⽤哈希算法(MD5、SHA1 等),以⼀个密钥和⼀个消息为输⼊,⽣成⼀个消息摘要作为输出。
HMAC 发送⽅和接收⽅都有的 key 进⾏计算,⽽没有这把 key 的第三⽅,则是⽆法计算出正确的散列值的,这样就可以防⽌数据被篡改。
Java代码实现
import net.pocrd.annotation.NotThreadSafe;
import net.pocrd.define.ConstField;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
pto.Mac;
pto.SecretKey;
pto.spec.SecretKeySpec;
import java.util.Arrays;