文章目录

  • 前言
  • 一、对称密码
    • 1.1、DES
    • 1.2、2DES与3DES
    • 1.3、AES
  • 二、非对称密码
    • 2.1、RSA
    • 2.2、ECC椭圆曲线
  • 参考网址

前言

本文旨在讲述几种经典的加密算法,可以用于信息安全导论or密码学的期末复习,或者是兴趣科普。

一、对称密码

一种加解密使用相同密钥的密码体制。解密算法是加密算法的逆过程。使用代替和置换技术。其安全性依赖于所持有密钥的安全性。
五要素:明文、加密算法、密钥、密文、解密算法

1.1、DES

DES全称Data Encryption Standard(数据加密标准),遗憾的是它已经过时了,不过仍值得我们学习。
它是一种分组加密算法,首先将明文分成若干组,每组的明文大小为64位。密钥长64位(bit),但是每个第8位是奇偶校验位,所以是其余56位参与运算。


流程如上所示:首先将明文进行IP置换,然后进行16轮迭代,最后再进行IP逆置换得到密文。
将初始IP置换后的数据分为等长的两个单元,一个叫L0,一个叫R0。然后每一轮迭代的内容如下:

  1. L1=R0,R1=F(L0) …以此类推。意为:每一轮的L直接等于上一轮的R,而这一轮的R等于上一轮的L经过函数F变换得到。接下来介绍这个轮函数F的流程
  2. R0(32位)首先进行扩展到48位,扩展方法如下:4×8变成了6×8;
  3. 扩展后的48位数据与48位密钥进行异或计算
  4. 计算后的数据(48位)再进行S盒压缩到32位,压缩方法如下:对于每个6位数据,进行下图计算,得到行列数,再去表中查询得到10进制数,最后转换成一个4位数据。

  5. S盒所得结果再经过P盒置换,这样轮函数就结束了。

然后来说明一下,前文不是提到密钥除去校验位还有(64-8)56位吗。为何在轮函数中,与数据进行异或操作的是48位密钥呢?下图讲述了每一轮密钥的的生成

  • 其中置换表PC1是56位的,将64位置换成54位。
  • 表PC2是48位的,将54位的置换成48位。从而得到了每一轮的密钥K,都是48位

1.2、2DES与3DES

由于DES密码长度容易被暴力破解,所以3DES算法通过对DES算法进行改进,增加DES的密钥长度来避免类似的攻击,针对每个数据块进行两次或者三次DES加密;因此,2DES、3DES加密算法并非什么新的加密算法,是DES的一个更安全的变形,它以DES为基本模块,通过组合分组方法设计出分组加密算法。安全性有所提高,但速度变慢。、
二重DES:
使用两个密钥K1,K2
(1)用K1进行加密
(2)用K2对(1)结果加密
三重DES:
使用两个密钥K1,K2
(1)用K1进行加密
(2)用K2对(1)结果解密
(3)再用K1对(2)结果加密

1.3、AES

也是一种分组加密算法,明文被划分为128位一组。密钥长度不固定,可以是128、192、256位。
本文将以明文和密钥都是128位来举例讲解。AES加密算法基本流程如下:

  • 一个128位,也就是16字节的明文,可以从上到下,从左到右排列成一个4×4的矩阵。 128位密钥也是同理可以表示成4×4的矩阵。

  • 初始变换,就是将16字节的明文和16字节的密钥进行异或操作,如下:异或操作是明文的每一列和密文的每一列进行异或,最后也得到一个4×4矩阵。

  • 9轮循环运算中,每轮都要经过字节代换、行移位、列混合、轮密钥加。最后1轮则不需要经过列混合,其余的也都需要。

接下来讲述每轮循环运算中的关键步骤:

  1. 字节变换:对一个4×4的矩阵,进行查表(S盒),比如19就查(x=1,y=19)到为d4

    最后就得到了一个新的4×4数据块:

  2. 行移位:第二的元素都向前移动一位,比如【27\ bf \ b4 \ 41】移位后得到【bf \ b4 \ 41 \ 27】;第三行的元素都向前移动两位;第四行的元素都向前移动三位。

  3. 列混合:是将矩阵乘以一个给定的矩阵,这里的乘法是定义在有限域GF(2^8)上的一个乘法。

  4. 轮密钥加:将列混合的结果与子密钥进行异或,得到矩阵。那么每一轮的子密钥是如何得到的呢?是通过密钥扩展得到的。具体方法可见最后参考网址。

二、非对称密码

非对称密码又叫公钥密码:这种密码体制使用两个密钥来进行加密和解密,这个两密钥分别是公钥和私钥。公钥和私钥是一对,如果使用公钥对数据进行加密,只有用对应的私钥才能解密,如果用私钥进行加密,只有用相应的公钥才能解密。因为加/解密使用两个不同的密钥,所以这种算法叫做非对称算法。
公钥密码体制的六要素:明文、加密算法、公钥、密钥、解密算法、密文 。

2.1、RSA

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,RSA就是他们三人姓氏开头字母拼在一起组成的。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

RSA算法基于一个十分简单的数论事实:将两个大质(素)数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,我们小学时学过质因数分解6=2*3,但是让你分解一个几百位的数呢?显然不会,对计算机来说都难以做到。

算法步骤如下:

  1. 选取两个大素数p和q,(大素数,就是很大很大的素数)
  2. n=pq
  3. 计算 φ(n)=(p-1)(q-1),这里的φ是欧拉函数
  4. 随便选一个e与φ(n)互质,且1<e<φ(n)
  5. 由公式ed mod φ(n) =1 ,得到d
  6. 公钥为(e,n),私钥为(d,n)

加解密的方法如下:

  • 加密:已知明文M,密文C=M^e mod n
  • 加密:已知密文C,明文M=C^d mod n

举个栗子:

  1. 选取p=3,q=5
  2. n=pq=15
  3. 计算 φ(n)=(p-1)(q-1)=8
  4. 选e=3,因为3和8互质,且1<3<8
  5. 3d mod 8 =1 ,得到d=11 (公钥私钥不一样)
  6. 公钥为(3,15),私钥为(11,15)

假如你要发送明文2
根据公钥加密:密文 = 2^3 mod 15 = 8
接收者收到密文8
根据私钥解密:明文 = 8^11 mod 15 = 2

2.2、ECC椭圆曲线

椭圆曲线加密算法比起RSA加密算法在数学层面上读起来更难懂,我将尝试用一种图形化的方法来阐述,而弱化其数学含义,这样可能比较容易理解。
椭圆曲线的方程如下:

椭圆曲线上有两点P、Q,且Q=kP、P称为基点,Q为公钥,k为私钥。
给定k和P计算Q很简单,但给定Q,P计算k确很难
注意:这里的乘法并不是我们常见的那种简单的乘法,而是定义在有限域GF上的一个“乘法”,接下来我会介绍这里的加法和乘法运算

加法:
已知椭圆曲线上的两点A,B。直线AB交椭圆曲线于点C(不相交的情况暂不考虑),点C作y轴平行线交椭圆曲线得到点D。
这时我们定义一个加法:A+B=D

乘法:
想象一下当曲线上两点无限接近时,其实两点连线就是该点切线了。
过椭圆曲线上一点A做切线,交曲线于一点,再做y轴平行线,得到B。
根据加法定义A+A=B 也就是说2A=B。这就叫点的自累,其实就是在做乘法。


那么我们怎么计算3A呢?很简单,重复加法操作

你会发现,这些乘法运算,每次的结果都在跳来跳去找不到规律,这就是椭圆曲线加密的根基。

上图为一随手画的示意图,为了凸显出运算结果的杂乱无章。
在普通的代数运算中5*?=10,小学生也知道另一个乘数为2,但是在椭圆曲线运算中无法倒推,这个逆过程又叫椭圆离散对数问题。

接下讲算法步骤:

  1. 选一条椭圆曲线,然后选一点P作为基点
  2. 选一个大数k作为私钥
  3. 公钥Q=kP

加解密的方法如下:
加密:已知明文M,选择随机数r,密文C是一个点对。C=(rP,M+rQ)
解密:收到密文C=(rP,M+rQ),
M+rQ-k(rP)=M+rQ-rQ=M
就还原出M了。

关于椭圆曲线更多的数论基础,读者可以自行学习。我在未来会专门写一篇博客来讲述有限域及相关概念。

参考网址

B站【DES加密算法】up主:可厉害的土豆
B站【AES加密算法】up主:可厉害的土豆
Elliptic Curve Diffie Hellman - 椭圆曲线密钥交换

信息安全基础—对称/非对称密码图文详解相关推荐

  1. keyshot渲染图文教程_KeyShot渲染教程,KeyShot渲染基础教程步骤图文详解

    KeyShot渲染教程,KeyShot渲染基础教程步骤图文详解 KeyShot渲染教程,在我们导入了项目之后,接着我们就要输出图片或者动画了.这里有许多动态的方式来完成,在开始渲染之前,我们来设置我们 ...

  2. 二叉树合集(二):霍夫曼树(图文详解)

    合集地址 二叉树合集(一):二叉树基础(含四种遍历,图文详解) 二叉树合集(二):霍夫曼树(图文详解) 二叉树合集(三):线索二叉树(图文详解) 二叉树合集(四):对称二叉树(递归和迭代实现) 二叉树 ...

  3. SSL之CA证书颁发机构安装图文详解

    上一节我们说到,在验证公钥安全性时,是在CA机构颁发的包含用户的公钥及其身份信息的数字证书,数字证书由权威机构--CA签发.这个CA权威机构可以是自己的服务器也可以是国际公认的CA权威机构.下面我就来 ...

  4. Docker持续部署图文详解

    2019独角兽企业重金招聘Python工程师标准>>> Docker持续部署图文详解 博客分类: docker 架构 JAVA项目如何通过Docker实现持续部署(只需简单四步),即 ...

  5. php。defined,PHP defined()函数的使用图文详解

    PHP defined()函数的使用图文详解 PHP defined() 函数 例子 定义和用法 defined() 函数检查某常量是否存在. 若常量存在,则返回 true,否则返回 false. 语 ...

  6. qt on android qml,Qt on Android: Qt Quick 之 Hello World 图文详解

    在上一篇文章,<Qt on Android:QML 语言基础>中,我们介绍了 QML 语言的语法,在最后我们遗留了一些问题没有展开,这篇呢,我们就正式开始撰写 Qt Quick 程序,而那 ...

  7. Android中Canvas绘图之Shader使用图文详解

    概述 我们在用Android中的Canvas绘制各种图形时,可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形.那么Shader是什 ...

  8. 操作系统:图文详解 内存映射

    操作系统:图文详解 内存映射 前言 内存映射 在 Linux操作系统中非常重要,因为其涉及到高效的跨进程通信 & 文件操作 今天,我将详细讲解操作系统中核心概念:内存映射 目录 示意图 1. ...

  9. HUE配置文件hue.ini 的hbase模块详解(图文详解)(分HA集群和非HA集群)

    不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...

最新文章

  1. 排序算法---快速排序(java版)
  2. linux 下安装node 环境
  3. linux内核中等待队列
  4. python 0o10_Python 从业十年的程序员,写的万字经验分享
  5. 为何人工智能(AI)首选Python?如何转行Python人工智能?
  6. 小白入门深度学习 | 第五篇:数据不均衡的处理方法
  7. linux安装软件的几种方法
  8. SparkSQL读取hive中的数据,行转列的两种方式【行转列专用函数,UDAF】
  9. 《sql语句练习1》
  10. TCP的FIN、ACK、SYN、URG、PSH及攻击方式
  11. 计算机网络原理第七章,北大计算机网络原理第七章.pdf
  12. Tensorflow:tfrecord数据读取和保存
  13. 基于 Mean-shift的稳健性可视跟踪研究
  14. LaTeX技巧:算法标题 Algorithm如何重命名
  15. 计算机组成原理实验:静态随机存储器实验
  16. 第三章 代码的坏味道
  17. python 线程池 concurrent.futures ThreadPoolExecutor
  18. 如何查看一个Visual Studio项目是用哪个VS版本开发的
  19. 计算机内存不足 c盘快满了怎么办,电脑C盘内存快满了怎么清理垃圾
  20. 有什么JAVA 网站或者论坛资料丰富呢

热门文章

  1. Java验证外星语词典leetcode_953
  2. 原型和原型链面试题总结
  3. derby导入到mysql_Derby学习笔记(一)Derby简单配置和基本使用
  4. GBK 汉字内码扩展规范编码表(二)
  5. 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例27
  6. Minecraft我的世界原版云服务器配置
  7. yolov3修改替换onnx模型节点(Resize-->DConv)
  8. 中国用外国的软件其实已经付过费了
  9. 搭建系统|升级选股工具,使用同花顺F10查看上市公司基本概况!
  10. angular官网-指令