一、3DES加密算法简析:

3DES,也称为 3DESede 或 TripleDES,是三重数据加密算法,相当于是对每个数据库应用三次DES的对称加密算法。

由于DES密码长度容易被暴力破解,所以3DES算法通过对DES算法进行改进,增加DES的密钥长度来避免类似的攻击,针对每个数据块进行三次DES加密;因此,3DES加密算法并非什么新的加密算法,是DES的一个更安全的变形,它以DES为基本模块,通过组合分组方法设计出分组加密算法。。

3DES是DES向AES过渡的加密算法,它使用2个或者3个56位的密钥对数据进行三次加密。相比DES,3DES因密钥长度变长,安全性有所提高,但其处理速度不高。因此又出现了AES加密算法,AES较于3DES速度更快、安全性更高。

二、3DES加密过程:

该算法的加解密过程分别是对明文/密文数据进行三次DES加密或解密,得到相应的密文或明文。

假设EK()和DK()分别表示DES的加密和解密函数,P表示明文,C表示密文,那么加解密的公式如下:

加密:C = EK3( DK2( EK1(P)) ),即对明文数据进行,加密 --> 解密 --> 加密的过程,最后得到密文数据;

解密:P = DK1( EK2( DK3(C)) ),即对密文数据进行,解密 --> 加密 --> 解密的过程,最后得到明文数据;

其中:K1表示3DES中第一个8字节密钥,K2表示第二个8字节密钥,K3表示第三个8字节密钥,K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位,即K1对应KL(左8字节),K2对应KR(右8字节),K3对应KL(左8字节)。

当三重密钥均相同时,前两步相互抵消,相当于仅实现了一次加密,因此可实现对普通DES加密算法的兼容。

由于DES加解密算法是每8个字节作为一个加解密数据块,因此在实现该算法时,需要对数据进行分块和补位(即最后不足8字节时,要补足8字节)。Java本身提供的API中NoPadding,Zeros填充和PKCS5Padding。假设我们要对9个字节长度的数据进行加密,则其对应的填充说明如下:

(1)NoPadding:API或算法本身不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,可以补充\0或者空格,然后trim;

(2)ZerosPadding:无数据的字节全部被填充为0;

第一块:F0 F1 F2 F3 F4 F5 F6 F7

第二块:F8 0 0 0 0 0 0 0

(3)PKCS5Padding:每个被填充的字节都记录了被填充的长度;

①加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8。

②解密后:取最后一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文。

③加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。

(4)PKCS7Padding:

PKCS7Padding 的填充方式和PKCS5Padding 填充方式一样。只是加密块的字节数不同。PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。

三、3DES解密:

3DES解密过程,与加密过程相反,即逆序使用密钥。是以密钥3、密钥2、密钥1的顺序执行 解密->加密->解密

四、Java使用3DES加密解密的流程:

  ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象:

  SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);

  ②根据算法实例化Cipher对象,它负责加密/解密:

  Cipher c1 = Cipher.getInstance(Algorithm);

  ③传入加密/解密模式以及SecretKey密钥对象,实例化Cipher对象:

  c1.init(Cipher.ENCRYPT_MODE, deskey);

  ④传入字节数组,调用Cipher.doFinal()方法,实现加密/解密,并返回一个byte字节数组:

  c1.doFinal(src);

Java语言加密案例:

/*字符串 DESede(3DES) 加密*/
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;public class Des3 {private static final String Algorithm = "DESede"; // 定义 加密算法,可用DES,DESede,Blowfish// 加密函数// keybyte为加密密钥,长度为24字节// src为被加密的数据缓冲区(源)public static byte[] encryptMode(byte[] keybyte, byte[] src) {try {// 生成密钥SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);// 加密Cipher c1 = Cipher.getInstance(Algorithm);c1.init(Cipher.ENCRYPT_MODE, deskey);return c1.doFinal(src);} catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (java.lang.Exception e3) {e3.printStackTrace();}return null;}// 解密函数// keybyte为加密密钥,长度为24字节// src为加密后的缓冲区public static byte[] decryptMode(byte[] keybyte, byte[] src) {try {// 生成密钥SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);// 解密Cipher c1 = Cipher.getInstance(Algorithm);c1.init(Cipher.DECRYPT_MODE, deskey);return c1.doFinal(src);} catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (java.lang.Exception e3) {e3.printStackTrace();}return null;}// 转换成十六进制字符串public static String byte2hex(byte[] b) {String hs = "";String stmp = "";for (int n = 0; n < b.length; n++) {stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));if (stmp.length() == 1) {hs = hs + "0" + stmp;} else {hs = hs + stmp;}if (n < b.length - 1) {hs = hs + ":";}}return hs.toUpperCase();}public static void main(String[] args) {// 添加新安全算法,如果用JCE就要把它添加进去Security.addProvider(new com.sun.crypto.provider.SunJCE());final byte[] keyBytes = { 0x11, 0x22, 0x4F, 0x58, (byte) 0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD, 0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36, (byte) 0xE2 }; // 24字节的密钥String szSrc = "This is a 3DES test. 测试";System.out.println("加密前的字符串:" + szSrc);byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());System.out.println("加密后的字符串:" + new String(encoded));byte[] srcBytes = decryptMode(keyBytes, encoded);System.out.println("解密后的字符串:" + (new String(srcBytes)));}
}

3DES加密算法原理相关推荐

  1. 3DES加密算法原理及实现过程

    之前介绍了DES算法的原理和实现过程,现在介绍一下3DES的原理和实现过程. DES算法的密钥长度为64位(实际有效长度为56位,因为每隔8位中有1位为校验位,使用的是奇偶校验法). 其实3DES就是 ...

  2. 3DES加密算法原理及实现

    目录 引语 加密 加密算法公式 为什么采用加密-解密-加密的形式 解密 代码实现 注意:3DES是3重DES加解密算法,具体原理同DES,不在赘述. 引语 DES算法是全网公开的,其安全性是依靠秘钥的 ...

  3. DES和3DES加密算法C语言实现

    DES和3DES加密算法C语言实现 记录DES和3DES加密算法最简洁易懂的C语言源码 主要是要用到CBC这部分的算法,后边也有一个工具可以提供验证,因为网上的工具含有CBC的很少,也方便大家吧 之前 ...

  4. md5加密算法原理及其GO语言实现

    md5加密算法原理及其GO语言实现 MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值 ...

  5. 【中级软考】计算能力足够强大,所有加密算法原理上都会被破解吗?

    结论: 是的 但: 在信息技术领域,为达成既定目标选择做某事或不做某事.选择走某路线或不走某路线,性价比是一个极其重要的考虑因素.不做不等于落后. 引用文章:计算能力足够强大,所有加密算法原理上都会被 ...

  6. Base64 加密算法原理

    Base64 加密算法原理 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. 因为在内存中每个字节占8位,即 1 by ...

  7. TripleDES类 3des加密算法实现

    可以加密字符串,也可以加密字节数组. 采用3-des加密算法,加密键只能是16byte(128位)或者是24byte(192位)的,指定的键不仅有长度上的要求,还不能是个弱键  ( 注:DES 算法使 ...

  8. HTTPS 加密算法原理详解

    本文讲的是HTTPS 加密算法原理详解, 前言 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一 ...

  9. paillier同态加密算法原理及代码实现

    paillier同态加密算法原理及代码实现 由于工程量巨大,这里先贴上代码提醒自己还有这么个事情,等寒假有时间了再慢慢补充解析 代码实现 提前生成素数打表来提升算法速度,生成素数的代码点这里 注意:待 ...

  10. 公钥加密技术ECC椭圆曲线加密算法原理

    同样来自B站不错的视频讲解:公钥加密技术ECC椭圆曲线加密算法原理_哔哩哔哩_bilibili 就曲线上A点,过B点,第3点如果也交在曲线上的话,再做一次镜像,就肯定得到C点,那么这个就叫做点运算. ...

最新文章

  1. 深度聚类的可视化解释
  2. 还想“躺着挣钱”?这家背靠世界500强的工程机械企业如何做?
  3. 产生线程安全的原因(1)(操作系统)
  4. php 获取每年的节假日,shell获取每年农历节日的日期
  5. 4.Dynamics CRM 数据数量限制更改
  6. python3运行python2_python2升级到python3
  7. asp.net上传图片,上传图片
  8. git 设置忽略文件类型 gitignore
  9. cygwin安装之后,可以复制到其他机器使用
  10. Idea返回上一步快捷键是什么
  11. css svg做动图,如何制作svg动态图
  12. 不是计算机布尔检索命令的是,在计算机信息检索中,用于组配检索词和限字检索范围的布尔逻辑运算符包括哪些?...
  13. Linux云计算【第一阶段】第十二章:网络管理、进制及SSH管理与攻防
  14. 生成的包含卫兵:一次替代实用主义
  15. 金蝶实习(十一)——简单的二次开发
  16. 使用Python获取最新疫情数据,制作可视化动态地图,实时展示各地情况
  17. 新版白话空间统计(12):P值的表达以及空间统计上的特性
  18. ginkgo php,ginkgo: ginkgo 是一个免费开源的轻量级 PHP 开发框架
  19. 【人工智能】Benchmark、SOTA、Baseline
  20. 憨批豪的java成长日记-MYSQL数据库

热门文章

  1. CocosCreator 制作微信小游戏排行榜,超越好友,分享功能
  2. 领导越讲人情,团队越不行?
  3. 中兴新支点操作系统_中兴新支点操作系统
  4. 创业公司必备,20个提升团队工作效率的工具神器
  5. 弘辽科技:淘宝权重到底是什么?
  6. 电感的阻抗-频率曲线
  7. 【 机器学习】入门,理论框架以及学习资料
  8. 欧若科技通过 OpenKG 开放 Nebula Graph 图数据库
  9. 阿里云智能巡检管家使用攻略及功能示例
  10. 双人版井字棋游戏c语言设计报告,井字棋游戏课程设计总结报告.doc