加密算法简介

  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

[常见加密算法简介](http://woostundy.github.io/2016/07/16/% E5% B8% B8% E8% A7%81% E5%8A% A0% E5% AF%86% E7% AE%97% E6% B3%95% E7% AE%80% E4% BB%8B/)


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

×

喜欢就点赞,疼爱就打赏