1、介绍
对称加密算法:单密钥同时作用与加密和解密的加密算法称为对称算法。
特点:加密秘钥
= 解密秘钥
对称加密示意图如下:
- 常见的对称算法
DES 、3DES、 AES、PBE、 IDEA
2、各种对称算法说明
2.1、DES( Data Encryption Standard ) 数据加密标准。
DES密钥长度固定8位,
java实现代码:
import com.service.common.Constants;
import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.math.BigInteger;
import java.security.Key;
import java.security.SecureRandom;
public class DESUtils {
private final static String DES = "DES";
public static void main(String args[]) throws Exception {
String aa ="123";
String str1 = encrypt("owRHXv-1oOfvuduvCuGReu3WPNz4", Constants.SALT);
System.out.println(str1);
String str2 = decrypt(str1, Constants.SALT);
System.out.println(str2);
}
// 加密
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
Cipher cipher = Cipher.getInstance(DES);
DESKeySpec ds = new DESKeySpec(key);
SecureRandom sr = new SecureRandom();
SecretKeyFactory skfactory = SecretKeyFactory.getInstance(DES);
SecretKey skey = skfactory.generateSecret(ds);
cipher.init(Cipher.ENCRYPT_MODE, skey, sr);
byte[] b = cipher.doFinal(data);
return b;
}
// 加密
public static String encrypt(String data, String key) throws Exception {
return byte2hex(encrypt(data.getBytes(), key.getBytes()));
}
// 解密
public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
Cipher cipher = Cipher.getInstance(DES);
DESKeySpec ds = new DESKeySpec(key);
SecureRandom sr = new SecureRandom();
SecretKeyFactory skfactory = SecretKeyFactory.getInstance(DES);
SecretKey skey = skfactory.generateSecret(ds);
cipher.init(Cipher.DECRYPT_MODE, skey, sr);
return cipher.doFinal(data);
}
// 解密
public static String decrypt(String data, String key) throws Exception {
return new String(decrypt(hex2byte(data.getBytes()), key.getBytes()));
}
private static String byte2hex(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if(stmp.length() == 1){
hs.append('0');
}
hs.append(stmp);
}
return hs.toString().toUpperCase();
}
private static byte[] hex2byte(byte[] b) {
if((b.length % 2) != 0){
throw new IllegalArgumentException();
}
byte[] b2 = new byte[b.length / 2];
for (int n = 0; n < b.length; n += 2) {
String item = new String(b, n, 2);
b2[n / 2] = (byte) Integer.parseInt(item, 16);
}
return b2;
}
【解析】
java实现加密过程:
a、初始DES密钥器:
DESKeySpec dks = new DESKeySpec(key);
b、实例化密钥工厂:
SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);
c、通过工厂生产密钥
SecretKey secretKey = keyFactory.generateSecret(dks);
d、实例化密码器,并初始化
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
// 初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, k);
e、加密返回加密后的byte[]
byte[] b = cipher.doFinal(data);
解密和加密流程一致,区别在于cipher.init
(密码器初始化)选择的加密模式不同:
加密--Cipher.ENCRYPT_MODE
;解密-- Cipher.DECRYPT_MODE
2.2 、3DES(三重DES算法)
2.3 、AES (Advanced Encryption Standard)高级加密标准。
微信小程序加密传输就是用这个加密算法
2.4 、IDEA(International Data Algorithm) 国际数据加密标准。
2.5、PBE(Password Based Encryption) 基于口令加密。
3、算法中的问题
-
Exception in thread "main" java.security.InvalidKeyException: Wrong key size
DES加密,密钥
必须是8个字节的。
AES加密,密钥
必须是16个字节的.
即:key=“12345678”
可以,key="123456"
就会报错。
网友评论