加密算法简介

  1. 一、对称密钥算法
    1. 概述
    2. DES
    3. RC4
    4. RC5
    5. RC6
    6. AES
  2. 二、非对称秘钥算法
    1. 概述
    2. RSA
    3. 椭圆曲线算法
    4. ElGamal
  3. 三、哈希算法
    1. 概述
    2. MD5
  4. 未完 待补充
  5. REFERENCE

一、对称密钥算法

概述

对称加密(Symmetric-key algorithm)是指加解密用同一个密钥的算法,根据具体实现分为流加密和分组加密两种类型:

  • 流加密(Stream cipher)是对称加密常用的一种实现方法,加密和解密双方使用相同伪随机加密数据流,一般都是逐位异或随机密码本的内容。
  • 分组加密加密(Block cipher),也叫块加密,将明文分成多个等长的模块(block),使用确定的算法和对称密钥对每组分别加密解密。现代分组加密建立在迭代的思想上产生密文。迭代产生的密文在每一轮加密中使用不同的子密钥,而子密钥生成自原始密钥。

对称加密普遍比非对称加密速度要快,实现更简单,适合大量内容的加密

DES

DES (Data Encryption Standard) 是一种分组加密算法

DES算法的入口参数有三个:Key,Data,Mode,Key是密钥密钥占7个字节56位(64位里另外8位是用来校验的),Data是加密内容,占8个字节64位,Mode是加密还是解密。

DES算法于1976被确定,现在已经被认为不够安全,主要原因是56位的密钥过短。据说这个算法因为包含一些机密设计元素,被怀疑内含美国国家安全局(NSA)的后门。

DES算法有个拓展算法叫3DES,就是对数据块进行三次DES加密,增加爆破成本,但本质上也不够安全。

RC4

RC4 (Rivest Cipher 4) 是一种流加密算法

RC4起源于1987年,现在已经被认为不够安全。
RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。

由于异或运算的对合性,RC4加密解密使用同一套算法。这个算法实现起来很简单,只用了最基本的加、异或、循环,话说我大学时某个课程设计的做的加密算法就是简化版的RC4。

之后还出现了RC5、RC6加密算法,但RC5和RC6都是分组加密,和RC4原理并不一样。

RC5

RC5 (Rivest Cipher 5) 是一种分组加密算法,它和RC2,RC4,RC6都是同一个叫Ronald Rivest的人设计的。

相比RC4,RC5的密钥成了128位,但RC5仍然只需要基础的加、异或、循环运算,可以在很多硬件上实现。RC5有三个参数:字的大小,循环轮数(round),密钥中的8位字节个数,所以可以说RC5是一种可变加密算法。实际上循环轮数12轮以下的RC5都被认为是不安全的,会被差分分析法(Differential cryptanalysis)攻击,18-20轮才足够安全。

目前来说,RC5还是挺安全的,因为实现简单,消耗资源少,在一些传感器、嵌入式设备上使用很合适。

RC6

RC6 (Rivest Cipher 6) 是RC5的加强版,也属于分组加密算法。

RC6算法在RC5算法基础之上针对RC5算法中的漏洞,主要是循环移位的位移量并不取决于要移动次数的所有比特,通过采用引入乘法运算来决定循环移位次数的方法,对RC5算法进行了改进,从而大大提高了RC6算法的安全性。

RC6曾作为AES(高级加密标准)备选算法之一,但最终AES选择了Rijndael算法。

AES

最后压轴出场的是最著名的单密钥对称加密算法AES (Rijndael),AES是Advanced Encryption Standard的缩写,是美国国家标准与技术研究院2001年发布的新加密标准。

AES现在就是指的限定了区块长度和密钥长度的Rijndael算法,同样属于分组加密算法,该算法是两位比利时学者1998年发布的。起初还有很多算法参与了AES甄选,最终Rijndael凭借高安全性和清晰的数学结构而被选用。

AES将Rijndael算法的区块长度固定为128位,密钥长度可选128,192或256比特(Rijndael原版支持128-256,n*32的区块长度和密钥长度)。

AES算法包括4个步骤:

  1. AddRoundKey—矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
  2. SubBytes—通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
  3. ShiftRows—将矩阵中的每个横列进行循环式移位。
  4. MixColumns—为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey替换。

截止现在(2016),AES在算法层面上是安全的。2005年有人公布过一种缓存时序攻击法,但使用场景非常极端。

二、非对称秘钥算法

概述

公钥加密的思想于1974年被提出,相比对称加密无需共享密钥,更加安全。但是没法加密大量数据,一般用来加密对称加密的密钥,而用对称加密加密大量数据。
非对称加密的原理如下:

  • 消息发送方A在本地构建密钥对,公钥和私钥;
  • 消息发送方A将产生的公钥发送给消息接收方B;
  • B向A发送数据时,通过公钥进行加密,A接收到数据后通过私钥进行解密,完成一次通信;
  • 反之,A向B发送数据时,通过私钥对数据进行加密,B接收到数据后通过公钥进行解密。

RSA

RSA算法是最著名的非对称加密算法。RSA是1977年提出的,名字来源于Rivest、Shmir和Adleman三位作者。
我们平时用到的SSL协议,TLS协议都采用了该算法加密,SSH(Secure Shell)也是基于RSA实现的。

RSA的数学基础是极大整数的因数分解,具体实现过程如下:

  • 随意选择两个大的质数p和q,p不等于q,计算N=pq。
  • 根据欧拉函数,求得r=varphi (N) = varphi(p) * varphi(q)=(p-1)(q-1)
  • 选择一个小于r的整数e,使e与r互质。并求得e关于r的模反元素,命名为d。
  • (N,e)是公钥,(N,d)是私钥。
  • 加密时,加密的块 n^e ≡ c(MOD N),得到的c就是密文。解密时,c^d ≡ n(MOD N)。

要破解RSA要解决怎么把一个极大数分解为两个质数p和q,然后通过欧拉函数再得到公钥和私钥。但极大数因数分解目前还没什么好办法,所以只要N足够大,RSA在算法层面上就是安全的。

当N的长度为256时,用普通电脑花几小时即可以分解,当N长度为512时需要花数月时间分解,1024时需要大型分布式系统才能分解,长度到2046则可以确保是完全安全的。目前已有记录里,被分解的极大数最大位数是768位,于2009年被分解。

RSA也常被用来做数字签名,在消息内附加一个私钥加密过的散列值(Message digest),以此来确保消息发送人是可靠的。
公钥私钥对生成

# 1.该命令会生成1024位的私钥,此时我们就可以在当前路径下看到rsa_private_key.pem文件了.
genrsa -out rsa_private_key.pem 1024
# 2.生成的密钥不是pcs8格式,我们需要转成pkcs8格式
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
# 3.生成 rsa 公钥
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

椭圆曲线算法

椭圆曲线算法(Elliptic curve cryptography)也是一种非对称加密算法,于1985年被提出,以下简称ECC。
相比RSA,同等破解难度时ECC的秘钥更短。另外,ECC可定义椭圆曲线群的双线性映射,该特性可能将来被用来实现身份基加密体制(Identity-Based Encryption,IBE)。

ECC的数学基础是求椭圆曲线离散对数问题。实现比较复杂我就不写了,因为我也看不懂(⊙﹏⊙)b。 也正因为实现复杂,ECC的加解密速度慢,消耗资源也更多。

ECC也同样可以实现数字签名,叫做ECDSA。

ECC的秘钥长度最小要求是160位,建议是163位。目前已有的破解记录是109位,一万台机器破解了一年半。所以ECC在算法层面是可以保证安全的。

ElGamal

ElGamal加密算法是一种用于对采用Diff-Hellman方式进行交换的公钥进行加密,常被用于数字签名和密钥加密的算法,ElGamal的数学基础是有限域上的离散对数问题。

选择一个素数p和两个随机数g 、x (g、 x < p ),计算 y ≡ g^x( mod p ) ,则其公钥为 y, g 和p ,私钥是x ,g和p可由一组用户共享。

ElGamal方法中一个明文对应两个加密结果(g^a和g^b),因此密文空间的大小是明文空间大小的两倍,也就是说纵观整个通信过程,收发密文的大小是实际明文大小的两倍。

三、哈希算法

概述

我们经常说MD5加密,但追根究底的话,MD5应该是哈希函数(Hash Function),而哈希函数并不等同于加密(Encrypt),不过我们平常也把哈希叫做加密。哈希函数也叫散列函数,散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。

说人话就是哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串,而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。

哈希主要用来校验身份,错误检查,完整性检查。

MD5

MD5(Message-Digest5 Algorithm)即消息摘要算法,是最著名、应用最为广泛的一种哈希算法,于1992年被公开。MD5之前还有MD4、MD3、MD2等哥哥算法,MD5是最终的改进版。

MD5输入不定长度信息,输出固定长度为128-bits的散列

未完 待补充

REFERENCE

常见加密算法简介


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

×

喜欢就点赞,疼爱就打赏