您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

DES/3DES/AES 三种对称加密算法实现

时间:2020-09-25 10:29:44  来源:  作者:

1. 简单介绍

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

2. 对称加密

2.1 介绍

对称密码算法是当今应用范围最广,使用频率最高的加密算法。它不仅应用于软件行业,在硬件行业同样流行。各种基础设施凡是涉及到安全需求,都会优先考虑对称加密算法。对称密码算法的加密密钥和解密密钥相同,对于大多数对称密码算法,加解密过程互逆。

  • 特点:算法公开、计算量小、加密速度快、加密效率高。

  • 弱点:双方都使用同样密钥,安全性得不到保证。

对称密码有流密码和分组密码两种,但是现在普遍使用的是分组密码:

2.2 分组密码工作模式

  • ECB:电子密码本(最常用的,每次加密均产生独立的密文分组,并且对其他的密文分组不会产生影响,也就是相同的明文加密后产生相同的密文)
  • CBC:密文链接(常用的,明文加密前需要先和前面的密文进行异或运算,也就是相同的明文加密后产生不同的密文)
  • CFB:密文反馈
  • OFB:输出反馈
  • CTR:计数器

2.3 常用对称密码:

  • DES(Data Encryption Standard,数据加密标准)
  • 3DES(Triple DES、DESede,进行了三重DES加密的算法)
  • AES(Advanced Encryption Standard,高级数据加密标准,AES算法可以有效抵制针对DES的攻击算法

3. DES / 3DES / AES 三种算法实现

import JAVAx.crypto.Cipher;
import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import com.newland.csf.common.business.IBusinessComponent;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;/** *  *  *  */public class TripleDes  {    //指定要使用的算法  DES / 3DES / AES 分别对应的 值为: DES / DESede / AES
    public static final String ALGORITHM_3DES = "DESede";
    /**     * 解密算法     * @param hexString 密文手机号     * @param skString    密钥     * @return
     * @throws Exception     */    public static String tripleDesDecrypt(String skString, String hexString) throws Exception {        SecretKey secretKey = new SecretKeySpec(fromHexString(skString), ALGORITHM_3DES);        byte[] input = fromHexString(hexString);
        byte[] output = tripleDesDecryptBytes(secretKey, input);
        return new String(output, StandardCharsets.UTF_8);
    }    /**     * 加密算法     * @param hexString 明文手机号     * @param skString 密钥     * @return
     * @throws Exception     */    public static String tripleDesEncrypt(String skString, String hexString) throws Exception {        SecretKey secretKey = new SecretKeySpec(fromHexString(skString), ALGORITHM_3DES);        byte[] output = tripleDesEncryptBytes(secretKey, hexString.getBytes(StandardCharsets.UTF_8));
        return bytes2Hex(output, false);
    }    public static String bytes2Hex(byte[] bytes, boolean upperCase) {
        if (bytes == null || bytes.length <= 0) {
            return "";
        }        StringBuilder sb = new StringBuilder();        for (byte b : bytes) {
            sb.Append(String.format("%02x", b));
        }        return upperCase ? sb.toString().toUpperCase() : sb.toString();
    }    public static byte[] fromHexString(final String hexString) {
        if ((hexString.length() % 2) != 0) {
            throw new IllegalArgumentException(                    "hexString.length not is an even number");
        }        final byte[] result = new byte[hexString.length() / 2];
        final char[] enc = hexString.toCharArray();
        StringBuilder sb = new StringBuilder(2);
        for (int i = 0; i < enc.length; i += 2) {
            sb.delete(0, sb.length());
            sb.append(enc[i]).append(enc[i + 1]);
            result[i / 2] = (byte) Integer.parseInt(sb.toString(), 16);
        }        return result;
    }    public static byte[] tripleDesEncryptBytes(SecretKey secretKey, byte[] src) throws Exception {
        Cipher c1 = Cipher.getInstance(ALGORITHM_3DES);        c1.init(Cipher.ENCRYPT_MODE, secretKey);        return c1.doFinal(src);
    }    public static byte[] tripleDesDecryptBytes(SecretKey secretKey, byte[] src) throws Exception {
        Cipher c1 = Cipher.getInstance(ALGORITHM_3DES);        c1.init(Cipher.DECRYPT_MODE, secretKey);        return c1.doFinal(src);
    }    /**     * 加密文件     * @param skString     * @param srcFilePath     * @param desFilePath     * @throws Exception     */    public static void tripleDesEncryptFile(String skString,String srcFilePath,String desFilePath) throws Exception {        Cipher cipher = Cipher.getInstance(ALGORITHM_3DES);        SecretKey secretKey = new SecretKeySpec(fromHexString(skString), ALGORITHM_3DES);        cipher.init(Cipher.ENCRYPT_MODE, secretKey);        writeFile(cipher,srcFilePath,desFilePath);    }    /**     * 解密文件     * @param skString     * @param srcFilePath     * @param desFilePath     * @throws Exception     */    public static void tripleDesDecryptFile(String skString,String srcFilePath,String desFilePath) throws Exception {        Cipher cipher = Cipher.getInstance(ALGORITHM_3DES);        SecretKey secretKey = new SecretKeySpec(fromHexString(skString), ALGORITHM_3DES);        cipher.init(Cipher.DECRYPT_MODE, secretKey);        writeFile(cipher,srcFilePath,desFilePath);    }    private static void writeFile(Cipher cipher,String srcFilePath,String desFilePath) throws Exception{        byte[] buff = new byte[512];
        byte[] temp = null;
        int len = 0;
        try (FileInputStream fis = new FileInputStream(new File(srcFilePath));             FileOutputStream fos = new FileOutputStream(new File(desFilePath))) {            while ((len = fis.read(buff)) > 0) {
                temp = cipher.update(buff, 0, len);
                fos.write(temp);
            }            temp = cipher.doFinal();            if (temp != null) {
                fos.write(temp);
            }        }    }}

本文由AnonyStar 发布,可转载但需声明原文出处。
仰慕「优雅编码的艺术」 坚信熟能生巧,努力改变人生
欢迎关注微信公账号 :云栖简码 获取更多优质文章
更多文章关注笔者博客 :云栖简码



Tags:加密算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
说起区块链,似乎大家都懂一点,再往细里一问,似乎又都不懂了。比如,你问一个人:为什么要挖矿,挖的到底是啥。怕是没几个明白人。本文就是要给你讲明白!前言人们一说起区块链,就常常说...【详细内容】
2021-07-13  Tags: 加密算法  点击:(224)  评论:(0)  加入收藏
来源:麦叔编程作者:kevin。JS逆向是爬虫的难点,是爬虫路上的拦路虎。所谓逆向就是破解网站使用的JS加密算法,拆解相关的参数。然后就可以登堂入室了。 本文总结了JS中最常用的加...【详细内容】
2021-03-04  Tags: 加密算法  点击:(195)  评论:(0)  加入收藏
前几天我发表一片关于RSA的加密算法,很多人留言让我讲解一下ECC 椭圆加密算法。首先我在这里声明一下 椭圆加密算法不像RSA 用中学的数学知识就可以解决。本文中也是参考了网...【详细内容】
2020-12-30  Tags: 加密算法  点击:(222)  评论:(0)  加入收藏
1. 简单介绍3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力...【详细内容】
2020-09-25  Tags: 加密算法  点击:(62)  评论:(0)  加入收藏
加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。一、不可逆加密常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和...【详细内容】
2020-08-02  Tags: 加密算法  点击:(57)  评论:(0)  加入收藏
0. 前言这一篇我们将介绍一下.net core 的加密和解密。在Web应用程序中,用户的密码会使用MD5值作为密码数据存储起来。而在其他的情况下,也会使用加密和解密的功能。常见的加...【详细内容】
2020-06-22  Tags: 加密算法  点击:(45)  评论:(0)  加入收藏
RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA是第一个能同时用于加密和数宇签名的算法,它能够抵抗到目前为止已知的所有密码攻...【详细内容】
2020-02-25  Tags: 加密算法  点击:(99)  评论:(0)  加入收藏
当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信。InfoQ的这篇文章对此有非常详细的描述。这些复杂的步骤的第一步,就...【详细内容】
2020-02-23  Tags: 加密算法  点击:(74)  评论:(0)  加入收藏
crypto-js是一个前端Javascript标准加密算法库,CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。有时候项目涉及到的敏感数据比较多,为了信息安全,我们常常需要...【详细内容】
2020-02-04  Tags: 加密算法  点击:(158)  评论:(0)  加入收藏
加密,简而言之就是借助一种或多种算法将明文信息转换成密文信息,信息的接收方通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,加密算法可以分为对称加密、非对称加密和对称加密和非对称加密的...【详细内容】
2019-12-06  Tags: 加密算法  点击:(60)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(9)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(19)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(13)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯&middot;奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(37)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条