简介
对称加密是指加密和解密使用相同密钥的加密算法。
在对称加密算法中,数据发送方将明文和加密密钥一起经过算法处理后,使其变成复杂的密文发送出去。接收方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。
在大多数的对称算法中,加密密钥和解密密钥是相同的,所以它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,密钥泄漏意味着消息有被解密的风险,所以密钥的保密性对通信的安全性至关重要。
常见算法
DES(Data Encryption Standard)数据加密标准:JDK实现的算法密钥长度为56位。
3DES:三重DES,JDK实现的算法密钥长度为112和168,默认168位。
AES:代替DES的算法,目前使用最多的对称加密算法,官方并未报告被破解。AES 通常用于移动通信系统加密以及基于SSH协议的软件。JDK实现的AES密钥长度有128,192,256,默认128位。
此外还有 TDEA算法,Blowfish算法,RC5算法,IDEA算法,PBE算法等,目前使用 3DES 和 AES 较为广泛。
DES 的 java 实现
public class MyDES {
//算法名称
private static final String KEY_ALGORITHM = "DES";
//算法名称/加密模式/填充方式
//DES共有四种工作模式,ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式
private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
//明文
private static final String str = "i am pm lab";
public static void main(String[] args) {
try {
//获得DES生成者实例
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
//指定长度默认值,密钥长度必须的8的倍数
keyGenerator.init(56);
//生成一个密钥
SecretKey Key = keyGenerator.generateKey();
//得到加密私钥的byte数组
byte[] byteKey = Key.getEncoded();
//key转换
DESKeySpec desKeySpec = new DESKeySpec(byteKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
SecretKey secretKey = factory.generateSecret(desKeySpec);
//加密
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(str.getBytes());
System.out.println(new BigInteger(1, result).toString(16));
//解密
cipher.init(Cipher.DECRYPT_MODE, secretKey);
result = cipher.doFinal(result);
System.out.println(new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
应用场景时序图:
3DES 的 java 实现
代码基本和 DES 类似:
public class My3DES {
//算法名称
private static final String KEY_ALGORITHM = "DESede";
//算法名称/加密模式/填充方式
//DES共有四种工作模式,ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式
private static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";
//明文
private static final String str = "i am pm lab";
public static void main(String[] args) {
try {
//获得DES生成者实例
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
//指定长度默认值,密钥长度必须的8的倍数
//keyGenerator.init(168);
keyGenerator.init(new SecureRandom());//也可以SecureRandom生成默认长度的key
//生成一个密钥
SecretKey Key = keyGenerator.generateKey();
//得到加密私钥的byte数组
byte[] byteKey = Key.getEncoded();
//key转换
DESedeKeySpec desKeySpec = new DESedeKeySpec(byteKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
SecretKey secretKey = factory.generateSecret(desKeySpec);
//加密
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(str.getBytes());
System.out.println(new BigInteger(1, result).toString(16));
//解密
cipher.init(Cipher.DECRYPT_MODE, secretKey);
result = cipher.doFinal(result);
System.out.println(new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
AES 的 java 实现
public class MyAES {
private static final String KEY_ALGORITHM = "AES";
private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
private static final String str = "i am pm lab";
public static void main(String[] args) {
try {
//生成密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
keyGenerator.init(new SecureRandom());
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();
//转换密钥
Key key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
//加密
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(str.getBytes());
System.out.println(new BigInteger(1, result).toString(16));
//解密
cipher.init(Cipher.DECRYPT_MODE, key);
result = cipher.doFinal(result);
System.out.println(new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
AES和DES的应用场景时序图相同。