基于java的加密解密的文章目录
第一章 基于java的加密解密 学习笔记(一) 常见加密算法的简单介绍
第二章 基于java的加密解密 学习笔记(二)哈希算法
第三章 基于java的加密解密 学习笔记(三)Base64
第四章 基于java的加密解密 学习笔记(四)AES加密
第五章 基于java的加密解密 学习笔记(五)DES加密
第六章 基于java的加密解密 学习笔记(六)RSA加密
前言
上一章中,我们介绍AES密码算法在java中使用,本章,我们介绍DES。
一、DES简介?
基本原理
DES算法是属于对称密码算法中的分组加密算法。
分组加密属于块加密,对一个字节块进行加密。与分组加密对应的是流加密,流加密指一个字节一个字节加密。
密钥长64bit,56bit参与运算,其余8bit为校验位。分别取自{8, 16, 24, 32, 40, 48, 56, 64}位。
当n个64bit明文数据块都经过DES加密处理后,所得到的n个64bit密文数据块串在一起就是密文。
加密过程
以论运算为主,共进行16次轮加密。每一次轮加密左边与f运算的R异或后变右边,右边变左边。
IP置换(Initial Permutations)
将原来的64bit二进制位重新排序
轮函数——E扩展置换
将32bit输入扩展为48bit输出
密钥生成
64bit密钥生成16个48bit的轮密钥
使用PC1置换算法,64bit->56bit
分组循环左移(若求解密密钥则是分组循环右移)
合并后使用PC2置换算法,56bit->48bit。
二、实例
1.DES工具类
代码如下(示例):
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.util.Base64;
/**
* DES 加密解密
*
* @Auther: BeinLai
* @Date: 2023/09/04/10:52
* @Description:
* DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥。
*/
public class DESUtils {
/**
* 偏移变量,固定占8位字节
*/
private final static String IV_PARAMETER = "12345678";
// 默认编码
private static String CHARSET="utf-8";
// 密钥算法
private static String ALGORITHM ="DES";
/**
* 加密/解密 算法-工作模式-填充模式
*/
private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";
/**
* 生成key
*/
private static Key generateKey(String password) throws Exception{
DESKeySpec desKeySpec=new DESKeySpec(password.getBytes(CHARSET));
SecretKeyFactory secretKeyFactory=SecretKeyFactory.getInstance(ALGORITHM);
Key key=secretKeyFactory.generateSecret(desKeySpec);
return key;
}
/**
* 加密 字符串
*/
public static String encrypt(String password,String data){
if(password==null || password.length()<8){
throw new RuntimeException("加密失败,key不能小于8位");
}
if(data==null){
return null;
}
try{
Key key=generateKey(password);
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
IvParameterSpec ivParameterSpec=new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
cipher.init(Cipher.ENCRYPT_MODE,key,ivParameterSpec);
byte[] bytes= cipher.doFinal(data.getBytes(CHARSET));
String str=new String(Base64.getEncoder().encode(bytes));
return str;
}catch (Exception e){
e.printStackTrace();
return data;
}
}
/**
* 解密 字符串
*/
public static String decrypt(String password,String data){
if(password==null || password.length()<8){
throw new RuntimeException("加密失败,key不能小于8位");
}
if(data==null){
return null;
}
try{
Key key=generateKey((password));
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
IvParameterSpec ivParameterSpec=new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
cipher.init(Cipher.DECRYPT_MODE,key,ivParameterSpec);
byte[] bytes=Base64.getDecoder().decode(data.getBytes(CHARSET));
String str=new String(cipher.doFinal(bytes),CHARSET);
return str;
}catch (Exception e){
e.printStackTrace();
return data;
}
}
/**
* 加密文件
* srcile:待加密的文件路径
* desFile:待解密的文件路径
*/
public static String encryptFile(String password,String srcile,String desFile){
if(password==null || password.length()<8){
throw new RuntimeException("加密失败,key不能小于8位");
}
try{
Key key=generateKey(password);
IvParameterSpec ivParameterSpec=new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE,key,ivParameterSpec);
InputStream is=new FileInputStream(srcile);
OutputStream os=new FileOutputStream(desFile);
CipherInputStream cis=new CipherInputStream(is,cipher);
byte[] buffer=new byte[1024];
int r;
while((r=cis.read(buffer))>0){
os.write(buffer,0,r);
}
cis.close();
is.close();
os.close();
return desFile;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 解密文件
* srcFile:待解密的文件路径
* ensFile:待加密的文件路径
*/
public static String decryptFile(String password,String srcFile,String ensFile){
if(password==null || password.length()<8){
throw new RuntimeException("加密失败,key不能小于8位");
}
try{
Key key=generateKey(password);
IvParameterSpec ivParameterSpec=new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE,key,ivParameterSpec);
InputStream ins=new FileInputStream(srcFile);
OutputStream os=new FileOutputStream(ensFile);
CipherOutputStream cos=new CipherOutputStream(os,cipher);
byte[] buffer=new byte[1024];
int r;
while((r=ins.read(buffer))>0){
cos.write(buffer,0,r);
}
cos.close();
ins.close();
os.close();
return ensFile;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
2.测试
代码如下(示例):
public static void main(String[] args){
String data = "hello,您好";
String password="WfJTKO9S4eLkrPz2JKrAnzdb";
System.out.println("原文:" + data);
try {
String s1 = DESUtils.encrypt(password,data);
System.out.println("加密文:" + s1);
System.out.println("=======分隔线==========");
String s2=DESUtils.decrypt(password,s1);
System.out.println("解密后:" + s2);
}catch (Exception e){
e.printStackTrace();
}
}