懂了!国际算法体系对称算法DES原理

简介: 懂了!国际算法体系对称算法DES原理

概念


加密领域主要有国际算法和国密算法两种体系。国密算法是国家密码局认定的国产密码算法。国际算法是由美国安全局发布的算法。由于国密算法安全性高等一系列原因。国内的银行和支付机构都推荐使用国密算法。


1112728-20201114172550037-773800474.png


从上图可知,对称加密算法在算法体系里占了半壁江山。因为国际和国密算法的过程差异并不大。只是应用的数学公式和秘钥位数不同。DES在里面算是基础,所以今天主要介绍一下DES的原理。

 

原理


密码


咱们从加密的原理说起。举个最简单的加密:


我有一段明文:520


我的秘钥是:221


我的加密算法是:加法


加密后的密文就是:741


如果这个密文被截获了,接受者看到的信息是:741(气死你),和原来明文520是完全不同的,不能知道信息原有的意思。

 

从这个简单的例子可知:加密是包含:明文、秘钥、加密算法和密文四个要素的。加密算法可公开可不公开,常见的算法有:位移、循环位移、异或、置换、数学函数。

 

凯撒密码


加密技术从古罗马凯撒时候就在用:凯撒密码


1112728-20201114172611756-346340837.png


凯撒密码是古罗马时期凯撒大帝和他的将军们通信时使用的加密方式:


明文:由26个字母组成


秘钥:1到25之间的任意数字


加密算法:循环位移


密文:举例明文为eat 秘钥为2,对照上面图片的凯撒密码盘可以得到密文是gcv。

 

@Test
public void caesarCipher() {
    String text = "love was growing in eyes";  //明文
        int key = 3; //秘钥
        String cipher = encryptCaesarCipher(text, key); //密文
        System.out.println(cipher);
}
//凯撒密码加密算法
private String encryptCaesarCipher(String text, int key) {
    char[] chars = text.toCharArray();
    for(int i=0; i<chars.length; i++) {
        if(chars[i] != ' ') {
            chars[i] = (char)(chars[i]+key);
        }
        //如果超过了26个字母,则减去26
        if(chars[i]>122) {
            chars[i] = (char)(chars[i]-26);
        }
    }
    return new String(chars);
}


运行得到密文:oryh zdv jurzlqj lq hbhv

 

凯撒密码连小朋友都能破解。一旦被人知道用的凯撒密码,算法是已知的。要破解秘钥拿个明文和密文试试就知道了。就是平时说的暴力破解法可以很容易破解。对于这种全是英文字符的也可以使用频率分析法。频率分析法可以理解为基于大数据的方法,因为26个字母中,e的使用频率高。如果比如一篇文章,单词足够多的话,出现频率最高的字母xxx就是e。xxx的char值e的char值就是秘钥了。


1112728-20201114172630185-2086585316.png


DES


概述


DES全称为Data Encryption Standard,即数据加密标准,是一种分组加密算法。其分组长度为64bit,密钥长度为64bit,其中8bit为校验位,所以实际长度为56bit。

 

先介绍一下校验位。举个例子,咱们的身份证号码都是18位。这18位包含:


1112728-20201114172656130-1910231144.png


其中最后一位就是校验位,原理是利用将前面部分利用某种算法计算得到一个数。如果校验位与算法得到的不一致,则数据是有问题的。所以身份证本身是有不通过查库就可以简单验证有效性功能的。

 

回到DES算法。DES算法的秘钥必须是64位,参与加密计算的是56位。这是原始秘钥。这个原始秘钥会用一个函数转换成16个64位秘钥。

 

加密过程


DES的加密过程:


明文64位->初始IP置换->16轮加密变换->逆初始IP置换->密文

 

DES算法的这个过程又被称为Feistel网络。

 

 

简单解释下:


明文我们自己想写多长写多长。但是加密的时候每次以64bit作为一个分组。最后将密文拼接起来。



1112728-20201114172728076-285995472.png


然后执行一个IP置换(初始置换)操作。IP置换就是按位置换。举例来说64bit就是64个0和1。把第40个位置上的数换成第50个位置上的数就是置换了。


置换好的64个bit会分成两个32bit。然后用相同的加密算法每次传不同的转换后秘钥做16轮。


然后将两组32bit拼接起来再进行一次IP置换(终结置换)变成密文

 

分组组合


刚才介绍的加密过程是把明文的一块怎么加密成密文。DES密码块与密码块连接方式遵循对称加密的方式。


对称加密有两种方式,一种是分组加密,一种是序列加密。


分组加密,也叫块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。


序列加密,也叫流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。

 

分组加密算法中,分组密码的设计基本遵循混淆原则和扩散原则。有ECB,CBC,CFB,OFB这4种算法模式。DES有ECB和CBC两种实现。

 

ECB模式


ECB模式就是每组明文分别加密后拼接起来。


1112728-20201114172815742-1482557325.png


CBC模式


CBC即密码分组链接(Cipher-block chaining)的简称。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。在DES中,初始化向量就是秘钥。


1112728-20201114172845796-787158266.png


程序实现


我们用程序来实现一下DES加密算法


@Test
public void desCiper() throws Exception{
    String key = "12345678";
    String text = "我知道我是任性很任性,伤透了你的心";  //明文
        String cipher = encryptDesCipher(text, key); //密文
        System.out.println(cipher);
    text = decryptDesCipher(cipher, key);  //明文
         System.out.println(text);
}
//DES加密算法
private String encryptDesCipher(String text, String origKey) throws Exception{
    Key key = new SecretKeySpec(origKey.getBytes(), "DES");
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return Base64.encode(cipher.doFinal(text.getBytes()));
}
//DES加密算法
private String decryptDesCipher(String text, String origKey) throws Exception{
    Key key = new SecretKeySpec(origKey.getBytes(), "DES");
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.DECRYPT_MODE, key);
    return new String(cipher.doFinal(Base64.decode(text)));
}


运行结果:


xo6mmVe8j1/d60cAAiFz1HAXxihi2FH5d0zMWILvEYISWR52lguy2TbMZQ4vuulCdO8WvxMRuXE=


我知道我是任性很任性,伤透了你的心

 

3DES


3DES即3重加密算法,是对每个数据块应用三次DES算法。这是为了应对计算机计算能力增强,DES变的容易破解而产生的。


主要方法就是DES秘钥64位,3DES秘钥64*3=192位,分成个三个秘钥,进行2轮DES加密,1轮DES解密。最终得到结果。


1112728-20201114172910468-51418578.png


AES


AES全称是高级加密标准(Advanced Encryption Standard)。是用来替代DES/3DES的。主要过程如下,这里不过多介绍。


1112728-20201114172930255-1435801875.png


应用


我们来回顾下https的SSL握手过程:


1112728-20201114172950167-1225782775.png


SSL握手的最后,双方会用非对称秘钥协商出一个对称秘钥。用对称秘钥来加密传输的数据。之所以这样做是因为非对称加密安全性高但是效率低,对称秘钥正好相反。对称秘钥可以被暴力破解,破解需要时间。如果破解出来时就过期了,再通信就用另外的秘钥就能保证信息安全。

 

我们来模拟一下已经协商好的秘钥之后http客户端与服务器端的通信。


@Test
public void client() throws Exception {
    int i = 1;
    while (i <= 2) {
        Socket socket = new Socket("127.0.0.1", 520);
        //向服务器端第一次发送字符串
        OutputStream netOut = socket.getOutputStream();
        InputStream io = socket.getInputStream();
        String msg = i == 1 ? "客户端:我知道我是任性太任性,伤透了你的心。我是追梦的人,追一生的缘分。":
        "客户端:我愿意嫁给你,你却不能答应我。";
        System.out.println(msg);
        netOut.write(encryptDesCipher(msg.getBytes(), "12345678"));
        netOut.flush();
        byte[] bytes = new byte[i==1?104:64];
        io.read(bytes);
        String response = new String(decryptDesCipher(bytes,"12345678"));
        System.out.println(response);
        netOut.close();
        io.close();
        socket.close();
        i++;
    }
}
@Test
public void server() throws Exception {
    ServerSocket serverSocket = new ServerSocket(520);
    int i = 1;
    while (i <= 2) {
        String msg = i == 1 ? "服务端:我知道你是任性太任性,伤透了我的心。同是追梦的人,难舍难分。" :
                "服务端:你愿意嫁给我,我却不能向你承诺。";
        Socket socket = serverSocket.accept();
        InputStream io = socket.getInputStream();
        byte[] bytes = new byte[i==1?112:64];
        io.read(bytes);
        System.out.println(new String(decryptDesCipher(bytes,"12345678")));
        OutputStream os = socket.getOutputStream();
        System.out.println(msg);
        byte[] outBytes = encryptDesCipher(msg.getBytes(), "12345678");
        os.write(outBytes);
        os.flush();
        os.close();
        io.close();
        i++;
    }
}


//DES加密算法
private byte[] encryptDesCipher(byte[] text, String origKey) throws Exception {
    Key key = new SecretKeySpec(origKey.getBytes(), "DES");
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return cipher.doFinal(text);
}
//DES加密算法
private byte[] decryptDesCipher(byte[] text, String origKey) throws Exception {
    Key key = new SecretKeySpec(origKey.getBytes(), "DES");
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.DECRYPT_MODE, key);
    return cipher.doFinal(text);
}


运行结果


客户端:我知道我是任性太任性,伤透了你的心。我是追梦的人,追一生的缘分。


服务端:我知道你是任性太任性,伤透了我的心。同是追梦的人,难舍难分。


客户端:我愿意嫁给你,你却不能答应我。


服务端:你愿意嫁给我,我却不能向你承诺。

 

这个程序实现了简单的客户端和服务器端的DES加密方式通信。稍加改造可以实现一个信息加密的聊天小程序。

 

总结


本文使用概念、原理、应用的传统型逻辑架构来对DES做系统梳理。里面涉及到的一些基本知识限于篇幅省略了一些。


比如Base64编码。它是加密时常用的编码方式,我们平时所看到的密钥都是base64后的结果。可以简单理解为对2的6次方进行64进制运算,可防止乱码丢失字节。


再比如填充字节这部分也没有介绍,有兴趣可以自己查阅下。

 

加解密很多人工作中或多或少都有涉及。我个人认为只要涉及的地方至少要了解到原理和架构层面,才能避免遇到问题时【拿着锤子找钉子】找不到真正问题的窘境。而只有动手实践才能避免当时了解了,过后又忘了需要再看一遍而产生重复工作的问题。

相关文章
机器学习/深度学习 算法 自动驾驶
548 0
|
3月前
|
机器学习/深度学习 算法 搜索推荐
从零开始构建图注意力网络:GAT算法原理与数值实现详解
本文详细解析了图注意力网络(GAT)的算法原理和实现过程。GAT通过引入注意力机制解决了图卷积网络(GCN)中所有邻居节点贡献相等的局限性,让模型能够自动学习不同邻居的重要性权重。
496 0
从零开始构建图注意力网络:GAT算法原理与数值实现详解
|
4月前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
927 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
4月前
|
传感器 算法 定位技术
KF,EKF,IEKF 算法的基本原理并构建推导出四轮前驱自主移动机器人的运动学模型和观测模型(Matlab代码实现)
KF,EKF,IEKF 算法的基本原理并构建推导出四轮前驱自主移动机器人的运动学模型和观测模型(Matlab代码实现)
146 2
|
4月前
|
算法
离散粒子群算法(DPSO)的原理与MATLAB实现
离散粒子群算法(DPSO)的原理与MATLAB实现
195 0
|
5月前
|
机器学习/深度学习 人工智能 编解码
AI视觉新突破:多角度理解3D世界的算法原理全解析
多视角条件扩散算法通过多张图片输入生成高质量3D模型,克服了单图建模背面细节缺失的问题。该技术模拟人类多角度观察方式,结合跨视图注意力机制与一致性损失优化,大幅提升几何精度与纹理保真度,成为AI 3D生成的重要突破。
425 0
|
5月前
|
算法 区块链 数据安全/隐私保护
加密算法:深度解析Ed25519原理
在 Solana 开发过程中,我一直对 Ed25519 加密算法 如何生成公钥、签名以及验证签名的机制感到困惑。为了弄清这一点,我查阅了大量相关资料,终于对其流程有了更清晰的理解。在此记录实现过程,方便日后查阅。
540 1
|
6月前
|
消息中间件 存储 缓存
zk基础—1.一致性原理和算法
本文详细介绍了分布式系统的特点、理论及一致性算法。首先分析了分布式系统的五大特点:分布性、对等性、并发性、缺乏全局时钟和故障随时发生。接着探讨了分布式系统理论,包括CAP理论(一致性、可用性、分区容错性)和BASE理论(基本可用、软状态、最终一致性)。文中还深入讲解了两阶段提交(2PC)与三阶段提交(3PC)协议,以及Paxos算法的推导过程和核心思想,强调了其在ZooKeeper中的应用。最后简述了ZAB算法,指出其通过改编的两阶段提交协议确保节点间数据一致性,并在Leader故障时快速恢复服务。这些内容为理解分布式系统的设计与实现提供了全面的基础。
|
6月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
419 58

热门文章

最新文章