欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对称加密/DES加密

程序员文章站 2022-05-11 20:29:54
...

对称加密

采用单钥密码系统的加密方法,加密和解密使用的是同一个**

分类:

  • DES[ Data Encryption Standard]数据加密标准
  • AES[Advanced Encryption Standard]高级加密标准

特点

  1. 加密速度快,可以加密大文件
  2. 密文不可逆,一旦**文件泄漏,就会导致数据暴露
  3. 加密后编码表找不到对应的字符,出现乱码
  4. 一般结合Base64使用

DES加密

– 准备工作:

  • 设置原文
    String input = “对称加密算法”;
  • 定义key [如果使用des进行加密,那么**必须是8个字节]
    String key = “12345678”;
  • 设置DES算法
    String transformation = “DES”;
  • 加密的类型
    String algorithm = “DES”;
//加密
String encryptDES= encryptDES(input, key, transformation, algorithm);
System.out.println("加密" + encryptDES);

//解密
String s1 = decryptDES(encryptDES, key, transformation, algorithm);
System.out.println("解密"+s1);

–开始解读代码–!!!

Cipher类为加密和解密提供密码功能。它构成了Java Cryptographic Extension(JCE)框架的核心。这些核心操作需要通过Cipher类来实现。

(1)创建一个Cipher对象,调用它的getInstance()方法,返回实现指定转换的 Cipher对象,需要传入一个参数String transformation的格式是“算法/工作模式/填充模式”,不同的算法支持不同的工作模式以及填充模式,所以我们在准备工作时已经设置好了变量;

(2)将cipher 对象进行初始化。通过这两个常量来完成用于加密或是解密操作的初始化,(“加密模式或者解密模式”,“加密规则”)。

加密模式:Cipher.ENCRYPT_MODE

解密模式:Cipher.DECRYPT_MODE

接下来我们去new一个加密规则,即new SecretKeySpec ()需要两个参数,第一个参数为**key的字节,是通过key.getBytes()得到,第二个参数为加密的类型DSE,我们在准备工作已定义了这个变量;

(3).通过cipher.doFinal()去调用加密方法,参数为一个字节数组,即可调用input.getBytes()将String转化为byte数组。

将得到的字节数组bytes进行Base64编码,使用 Base64.encode(bytes),否则直接调用new String(bytes)会出现乱码,因为ASCII没有负数,解析不出来,所以显示乱码。

(4).将 String encode = Base64.encode(bytes); 返回encode就ok了!

所以DES加密函数算法需要传的参数是原文input,**key,加密规则transformation,加密类型algorithm

private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception {

   //创建加密对象
   Cipher cipher = Cipher.getInstance(transformation);

   //创建加密规则
   //第一个参数:表示key的字节
   //第二个参数:加密的类型
   SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);

   //进行加密初始化
   //第一个参数表示模式,加密模式,解密模式
   //第二个参数表示:加密规则
   cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

   //调用加密方法
   byte[] bytes = cipher.doFinal(input.getBytes());
   String encode = Base64.encode(bytes);
//        for (byte aByte : bytes) {
//            //打印出负数,在字符码表找不到
//            System.out.println(aByte);
//        }
//        //如果直接打印密文会直接打印乱码
//        //System.out.println(new String(bytes));
   return encode;
}

DES解密算法

准备工作:

同加密算法一样,这里就不再重复辣

–开始解读代码–!!!

(1).创建一个Cipher ,通过getInstance()工厂方法来实例化对象cipher ,参数为transformation,即DEC;

(2).对cipher对象初始化,第一个参数为解密模式Cipher.DECRYPT_MODE,第二个参数为加密规则,new一个SecretKeySpec,而它也需要两个参数。第一个参数为**的字节数组,可通过key.getBytes()得到,第二个参数为解密类型,即为“DES”

(3).调用cipher.doFinal()方法进行解密,传入一个参数,使用Base64解码密文,即Base64.decode(encryptDES),返回的是一个字节数组bytes;

(4).最后通过返回return new String (btyes)就ok辣!!!

需要注意的是,往DES解密函数传入的是密文而不是原文哦!!

所以DES加密函数算法需要传的参数是密文s,**key,加密规则transformation,加密类型algorithm

private  static  String decryptDES(String encryptDES,String key,String transformation, String algorithm)throws Exception{

   Cipher cipher = Cipher.getInstance(transformation);
   SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);

   //解密规则
   cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);

   byte[] bytes = cipher.doFinal(Base64.decode(encryptDES));

   return new String(bytes);
}

show

对称加密/DES加密

相关标签: 密码学