DES - 对称加密算法简要介绍与JAVA实现

简介: DES - 对称加密算法简要介绍与JAVA实现

【1】DES简介

DES,全称为“Data Encryption Standard”,中文名为“数据加密标准”,是一种使用密钥加密的块算法,也是对称加密算法。

DES 算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是 1972 年美国 IBM 公司研制的对称密码体制加密算法

明文按 64 位进行分组,密钥长 64 位(8bytes=64bit),密钥事实上是 56 位参与 DES 运算(第8、16、24、32、40、48、56、64 位是校验位, 使得每个密钥都有奇数个 1)分组后的明文组和 56 位的密钥按位替代或交换的方法形成密文组的加密方法。


【2】分组模式

DES加密模式:有ECB、CBC、CFB、OFB、CTR等几种工作模式。

① ECB

ECB,中文名“电子密码本模式”,是最古老、最简单的模式,将加密的数据分成若干组,每组的大小跟加密密钥长度相同。然后每组都用相同的密钥加密,比如 DES 算法,如果最后一个分组长度不够 64 位,要补齐 64 位。


20180125135941114.jpg


② CBC

CBC,中文名“加密块链模式”,与 ECB 模式最大的不同是加入了初始向量。

它的特点是,每次加密的密文长度为 64位 ( 8 个字节),当相同的明文使用相同的密钥和初始向量的时候 CBC 模式总是产生相同的密文。


20180125135812856.jpg


③ CFB

CFB,中文名“加密反馈模式”,加密反馈模式克服了需要等待 8 个字节才能加密的缺点,它采用了分组密码作为流密码的密钥流生成器。

它的特点是,每次加密的 Pi 和 Ci 不大于 64 位;加密算法和解密算法相同,不能适用于公钥算法;使用相同的密钥和初始向量的时候,相同明文使用 CFB 模式加密输出相同的密文;可以使用不同的初始化变量使相同的明文产生不同的密文,防止字典攻击;加密强度依赖于密钥长度;加密块长度过小时,会增加循环的数量,导致开销增加;加密块长度应时 8 位的整数倍(即字节为单位);一旦某位数据出错,会影响目前和其后 8 个块的数据。



20180125140139622.jpg

④ OFB

OFB,中文名“输出反馈模式”,与 CFB 模式不同之处在于, 加密位移寄存器与密文无关了,仅与加密 key 和加密算法有关。

做法是不再把密文输入到加密移位寄存器,而是把输出的分组密文(Oi)输入到一位寄存器。

因为密文没有参与链操作,所以使得 OFB 模式更容易受到攻击;不会进行错误传播,某位密文发生错误,只会影响该位对应的明文,而不会影响别的位;不是自同步的,如果加密和解密两个操作失去同步,那么系统需要重新初始化;每次重新同步时,应使用不同的初始向量。可以避免产生相同的比特流,避免“已知明文”攻击。


20180125140258935.jpg


⑤ CTR

CTR,中文名“计数模式”,是对一系列输入数据块(称为计数)进行加密,产生一系列的输出块,输出块与明文异或得到密文。对于最后的数据块,可能是长 u 位的局部数据块,这 u 位就将用于异或操作,而剩下的 b-u 位将被丢弃(b表示块的长度)。

20180125140409970.jpg


【3】Java实现

DesUtil如下:

package com.hh.common.encrypt;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
public class DesUtil {
  // 非对称加密算法  加密key 解密key  不相同
    /**
   * 功能描述:DES加密方法。
   * @param encryptString String类型 要加密的数据
   * @param encryptKey  String类型 加密的密钥
   * @return byte[]类型 加密后结果
   * 
   */
  public static byte[] encrypt(String encryptString, String encryptKey)
  {
    try
    {
      // 创建一个密匙工厂,然后用它把DESKeySpec转换成securekey
      SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
      DESKeySpec desKey = new DESKeySpec(encryptKey.getBytes("UTF-8"));
      SecretKey securekey = keyFactory.generateSecret(desKey);
      // Cipher对象实际完成加密操作
      Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
         // 偏移量
      IvParameterSpec iv = new IvParameterSpec(encryptKey.getBytes("UTF-8"));   
      // 用密匙初始化Cipher对象
      cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
      // 执行加密操作
      return cipher.doFinal(encryptString.getBytes());
    } catch (Exception e){
      e.printStackTrace();
      return null;
    }
  }
  /**
   * 功能描述:DES加密方法。
   * base64(des(src,key))
   * @param encryptString String类型 要加密的数据
   * @param encryptKey  String类型 加密的密钥
   * @return byte[]类型 加密后结果
   * 
   */
  public static String encryptBase64(String encryptString, String encryptKey)
  {
    try
    {
//      SecureRandom secureRandom = new SecureRandom();
      // 创建一个密匙工厂,然后用它把DESKeySpec转换成securekey
      SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
      DESKeySpec desKey = new DESKeySpec(encryptKey.getBytes());
      SecretKey securekey = keyFactory.generateSecret(desKey);
      // Cipher对象实际完成加密操作
      Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
      // 偏移量
      IvParameterSpec iv = new IvParameterSpec(encryptKey.getBytes());   
      // 用密匙初始化Cipher对象
      cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
      // 执行加密操作
      byte[] doFinal = cipher.doFinal(encryptString.getBytes());
      return Base64Util.encode(doFinal);
    } catch (Exception e){
      e.printStackTrace();
      return null;
    }
  }
    /**
   * 功能描述:DES解密  方法。
   * @param decryptString byte[]类型 要解密的数据(需要使用Base64将字符串转换成byte[])
   * @param decryptKey String类型 解密时使用的KEY
   * @return String类型 解密后结果
   */
  public static byte[] decrypt(String decryptString, String decryptKey)
  {
    try
    {
      // 创建一个密匙工厂
      SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
      // 创建一个DESKeySpec对象
      DESKeySpec desKey = new DESKeySpec(decryptKey.getBytes("UTF-8"));
      // 将DESKeySpec对象转换成SecretKey对象
      SecretKey securekey = keyFactory.generateSecret(desKey);
      // Cipher对象实际完成解密操作
      Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
         // 偏移量
      IvParameterSpec iv = new IvParameterSpec(decryptKey.getBytes("UTF-8")); 
      // 用密匙初始化Cipher对象
      cipher.init(Cipher.DECRYPT_MODE, securekey, iv);
      // 执行解密操作
      return cipher.doFinal(decryptString.getBytes());
    } catch (Exception e){
      e.printStackTrace();
      return null;
    }
  }
  /**
   * 功能描述:DES解密  方法。
   * decryptBase64--->decrtpyDes
   * @param decryptString byte[]类型 要解密的数据(需要使用Base64将字符串转换成byte[])
   * @param decryptKey String类型 解密时使用的KEY
   * @return String类型 解密后结果
   */
  public static String decryptBase64(String decryptString, String decryptKey)
  {
    try
    {
//      SecureRandom secureRandom = new SecureRandom();
      byte[] decode = Base64Util.decode(decryptString);
      // 创建一个密匙工厂
      SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
      // 创建一个DESKeySpec对象
      DESKeySpec desKey = new DESKeySpec(decryptKey.getBytes());
      // 将DESKeySpec对象转换成SecretKey对象
      SecretKey securekey = keyFactory.generateSecret(desKey);
      // Cipher对象实际完成解密操作
      Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
      // 偏移量
      IvParameterSpec iv = new IvParameterSpec(decryptKey.getBytes()); 
      // 用密匙初始化Cipher对象
      cipher.init(Cipher.DECRYPT_MODE, securekey, iv);
      // 执行解密操作
      byte[] doFinal = cipher.doFinal(decode);
      System.out.println(doFinal);
      return new String(doFinal);
    } catch (Exception e){
      e.printStackTrace();
      return null;
    }
  }
}

测试如下:

  @Test
  public void testDes(){
    String key = "1020457f";
    String src = "今天下雪了";
    try {
      String encryptBase64 = DesUtil.encryptBase64(src, key);
      System.out.println("DesUtil 加密 : "+encryptBase64);
      String decryptBase64 = DesUtil.decryptBase64(encryptBase64, key); 
      System.out.println("DesUtil 解密 : "+decryptBase64);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

结果输出如下:

DesUtil 加密 : 7VhX51Twa8Z39WtXgJ3NWw==

DesUtil 解密 : 今天下雪了


目录
相关文章
|
机器学习/深度学习 人工智能 资源调度
大语言模型的核心算法——简要解析
大语言模型的核心算法基于Transformer架构,以自注意力机制为核心,通过Q、K、V矩阵动态捕捉序列内部关系。多头注意力增强模型表达能力,位置编码(如RoPE)解决顺序信息问题。Flash Attention优化计算效率,GQA平衡性能与资源消耗。训练上,DPO替代RLHF提升效率,MoE架构实现参数扩展,Constitutional AI实现自监督对齐。整体技术推动模型在长序列、低资源下的性能突破。
1566 8
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
751 1
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
783 5
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
2779 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
484 4
2023/11/10学习记录-C/C++对称分组加密DES
|
算法 数据安全/隐私保护 Python
DES加密初探
本文介绍了Python中常用的DES和3DES加解密方法,包括ECB和CBC模式。通过示例代码展示了如何使用`Crypto`和`pyDes`库实现加解密,并讨论了不同的填充方式。最后,通过一道CTF例题,详细解析了从图像中提取密文、进行ASCII转换、Base64解码、凯撒解码和最终的DES解密过程。
962 4
DES加密初探
|
存储 算法 Java
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
这篇文章详细介绍了在Java项目中如何使用MD5算法对用户密码进行加密存储和登录验证,包括加入依赖、编写MD5工具类、注册时的密码加密和登录时的密码验证等步骤,并通过示例代码和数据库存储信息展示了测试效果。
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
4733 2
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
1672 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
安全 Java 数据安全/隐私保护
- 代码加密混淆工具-Java 编程安全性
在Java编程领域,保护代码安全与知识产权至关重要。本文探讨了代码加密混淆工具的重要性,并介绍了五款流行工具:ProGuard、DexGuard、Jscrambler、DashO 和 Ipa Guard。这些工具通过压缩、优化、混淆和加密等手段,提升代码安全性,保护知识产权。ProGuard 是开源工具,用于压缩和混淆Java代码;DexGuard 专为Android应用程序设计,提供强大加密功能;Jscrambler 基于云,保护Web和移动应用的JavaScript及HTML5代码;DashO 支持多种Java平台和
978 1