一、加密算法说明

1. 加密标准分类

常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法,Hash严格来说也算是一种非对称加密

  • 常见的对称加密算法有:base64、原始数据加密标准DES、3DES、国际数据加密IDEA、RC4、RC5,RC6、高级加密标准AES、SAFER、Serpent、Blowfish、TwoFish等

  • 常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)、国密SM2等

  • HASH算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1

2. 加密过程分类

  • 分组密码加密,消息被分成若干个分组再加密,如AES
  • 流密码加密,一个位一个位的加密,如RC4,RC5,RC6
  • 混合加密,公钥用于安全交换对称密钥,对称密钥用来解密消息,两个计算机加密通信时,第一次握手时使用,具体没有怎么研究过^^_

3.分组密码加密模式

对于分组密码加密来说,有好多个工作模式,目前常见的有6大类

  • ECB
  • CBC
  • CFB
  • OFB
  • CTR
  • GCM

二、加密类型说明

1. Base 64

Base64严格来说,也算不是一种加密,应该算是一种穿专业服的伪装,只是一种编码方式。一般就是将我们已经加密过后的的数据经过Base64用于传输。

Base64能够将任何数据转换为易移植的字符串,避免了传输过程中失真问题。不管是ASCII还是UTF8,最近都统一转成字符串。类似于无论是中文,英文,还是阿拉伯文等,最后通过Base64的本子翻译成标准人类语言发向太空。

其中有非标准的Base64

Url Base64

标准Base 64中使用了’/‘,这在URL和文件系统中存在冲突,因此延伸出 Url Base64算法,主要就是将’+’和’/‘符号替换成了’-‘和’_’符号

MIME Base64

这是一种MIME友好格式,它输出每行为 76 个字符,每行末需追加回车换行符\r\n,不论每行是否够 76 个字符,都要添加一个回车换行符

2. DES, 3DES

DES前身为Lucifer算法,使用64位密钥,其中56位为实际使用的密钥,其它8位为奇偶校验,目前(2023年)好像已经在淘汰的路上,记得好像是2020年Github就已经淘汰了DES类型的密钥。

三重 DES 是原始数据加密标准 (DES) 算法的继承者,该算法是为应对试图破坏DES的黑客而创建的。对称加密曾经是业界使用最广泛的对称算法,目前它被逐渐淘汰。TripleDES 对每个数据块应用 三次DES 算法,通常用于加密 UNIX 密码和 ATM PIN。

3. 国际数据加密IDEA

IDEA算法专利的所有者Ascom公司也推出了一系列基于IDEA算法的安全产品,包括:基于IDEA的Exchange安全插件、IDEA加密芯片、IDEA加密软件包等。

尽管IDEA很强大,但不想DES那么普及,原因有两个:第一,IDEA受专利的保护,而DES不受专利的保护,IDEA要先获得许可证之后才能在商业应用程序中使用;第二,DES比IDEA具有更长的历史和跟踪记录。

4. RC4

全称叫 Rivest Cipher,Rivest 像是一个人名?公司?

是一种流加密算法,现在说是已被证实不太安全,但好像并没有替代品的样子,未研究

5. RC5,RC6

和RC4原理并不一样,RC5和RC6都是分组加密

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

6. 高级加密标准 (AES)

AES是美国政府以及其他组织使用的可信标准算法。尽管 128 位形式已经非常安全了,但 AES 还会使用 192 位和 256 位密钥来实现非常苛刻的加密目的。AES 被公认为足以应对除暴力破解之外的所有攻击。许多互联网安全专家认为,AES 最终将是私营部门加密数据的首选标准。

确实好像是目前经常碰到的都是AES标准

7. SAFER

SAFER的全称是Secure And Fast Encryption Routine,在密码学中,SAFER主要是由James Massey(IDEA的设计师之一)代表Cylink公司设计的一组分组密码。

SAFER主要有四种类型分别是:SAFER K, SAFER SK ,SAFER+ 和SAFER++

其中SAFER K 和 SAFER SK 是比较早期的设计,共享相同的加密函数,但是轮次和密钥调度是不一样的

后面的SAFER+ 和SAFER++ 是作为AES算法的候选算法提交给NESSIE的。 SAFER系列中的所有算法都没有专利限制,可以免费使用

好像一次计算资源紧张的地方用这个,比如IC卡之类的

8. Serpent

Serpent是高级加密标准AES候选算法之一,1997年,美国国家标准和技术研究所(NIST)发布公告在全世界范围内征集新的加密标准。在征集过程的最后一轮五个算法的评选中,Rijndael得87票,Serpent得59票,排名第二。

Serpent是一个非常经典的SPN式分组密码体制,同时它的安全强度非常高。与Rijndael一样,Serpent尚未有重大安全漏洞被发现。

Serpent的运算速度要比Rijndael慢上不少,这也是它落选的主要原因之一。

因为AES已经使用Rijndael算法,这个算法的使用场景目前还未接触过

9. Blowfish

Blowfish算法是一个64位分组及可变密钥长度的对称密钥分组密码算法,可用来加密64比特长度的字符串。32位处理器诞生后,Blowfish算法因其在加密速度上超越了DES而引起人们的关注。Blowfish算法具有加密速度快、紧凑、密钥长度可变、可免费使用等特点,已被广泛使用于众多加密软件。

Blowfish是另一种旨在替代 DES 的算法。这个对称工具将消息分成 64 位块并单独加密它们。Blowfish在速度、灵活性和坚不可摧方面享有盛誉。 它可以免费使用,所以大家都喜欢使用。Blowfish 常见于电子商务平台、安全支付和密码管理工具等。

Blowfish算法的关键在于key的选择以及保密。由于Blowfish算法采用变长密钥,这在给用户带来极大便利的同时也有隐患。由于算法加/解密核心在于密钥的选择和保密,但在实际应用中经常使用一些弱密钥对信息资源进行加密,导致存在着很大的安全隐患

好像一些医院系统,办公系统,都使用的这种加密

Blowfish使用64位块大小(与AES的128位块大小相比)使它容易受到生日攻击,特别是在HTTPS这样的环境中。Blowfish的块只有64bits,比较小,所以建议不要使用Blowfish来加密大于4GB的文件。

如果Blowfish算法只进行一轮加密的话,容易受到反射性弱键的已知明文攻击。但是在实现使用中一般是16轮加密,所以不容易受到这种攻击。但是Blowfish算法的发明人布鲁斯·施耐尔(Bruce Schneier)还是建议大家迁移到Blowfish的继承者Twofish(双鱼算法)去

这么看的话,这个算法在处理一些非公开性场合的机密时,应该还是挺好用的

10. Twofish

在1997年到2000年公开选拔美国国家标准技术研究院批准的标准的对称分组密码技术(AES)中,MARS ,RC6,Rijndael,Serpent和Twofish最终进入前五,但Rijndael被选为最终的AES算法。虽然没有作为最后的AES标准,但是能够跻身5强,也足以见得Twofish算法的优越性。

在2000年的时候,对于大多数平台来说,Twofish在128-bit密钥的表现要比Rijndael要慢,这也是为什么Rijndael会当选为AES标准的原因,但是Twofish算法在256-bit密钥的表现要好于Rijndael 。

但是随着Rijndael作为AES的标准,越来越多的硬件都基于AES做了优化,最后导致Twofish和Rijndael 的差距越来越大。

远程信息系统应该使用这个

可以参考 简述Twofish加密算法 - 夏冰加密软件技术博客 (jiamisoft.com)

11. RSA

RSA 是一种公钥加密非对称算法,是对网络传输的信息进行加密的标准。RSA 加密功能强大且可靠,它会产生大量乱码,让潜在的黑客感到沮丧,因为破解系统会让他们耗费大量时间和精力,他们不得不放弃。

RSA是被研究得最广泛的公钥算法,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一

RSA允许你选择公钥的大小。512位的密钥被视为不安全的;768位的密钥不用担心受到除了国家安全管理(NSA)外的其他事物的危害;1024位的密钥几乎是安全的。RSA在一些主要产品内部都有嵌入,像 Windows、网景 Navigator、 Quicken和 Lotus Notes

12. ECC 椭圆曲线算法

椭圆曲线算法(Elliptic curve cryptography)也是一种非对称加密算法,

相比RSA,同等破解难度时ECC的秘钥更短。另外,ECC可定义椭圆曲线群的双线性映射,该特性可能将来被用来实现身份基加密体制(Identity-Based Encryption,IBE)。

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

好像很难的样子。。。

13. Diffie-Hellman

Diffie-Hellman密钥交换方案(DHKE)提供了实际中密钥分配问题的解决方案,即它允许双方通过不安全的信道进行交流,得到一个共同密钥。许多公开和商业的密码协议中都实现了这种基本都密钥协议技术,例如SSH、TLS、IPSec

14. 国密SM2

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,是基于椭圆曲线的非对称算法,相对于RSA算法,SM2具有密钥更小,运算速度更快,相同密钥长度下具有更高安全性等优势。

14. MD5

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

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

15. SHA

安全哈希算法 (SHA) 是美国国家标准与技术研究院 (NIST) 作为美国联邦信息处理标准 (FIPS) 发布的一系列加密哈希函数。 SHA 加密用于多种方法,包括散列数据、证书文件和其他加密目的,包括比特币等加密货币。这些哈希算法有助于保护现代互联网基础设施的骨干。

SHA (英文名:Secure Hash Algorithm,中文名:安全散列算法),是一种密码散列函数,美国国家安全局设计。

其家族还是很庞大的,有SHA-0、SHA-1、SHA-2、SHA-3等4类型算法。

SHA-2 包括了SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256等算法。

SHA-3 包括了SHA3-224 、SHA3-256 、SHA3-384 、SHA3-512、SHAKE128 、SHAKE256等算法。

参考:

什么是 SHA 加密? SHA-1 与 SHA-2 - WoTrus - 博客园 (cnblogs.com)

16. HMAC

HMAC算法是将散列算法与一个密钥结合在一起,以阻止对签名完整性破坏,其实就是类似于md5密码中加盐道理是类似的。

HMAC 是密钥相关的 哈希运算消息认证码(Hash-based Message Authentication Code),HMAC 运算利用 哈希算法 (MD5SHA1 等),以 一个密钥一个消息 为输入,生成一个 消息摘要 作为 输出

HMAC 发送方接收方 都有的 key 进行计算,而没有这把 key 的第三方,则是 无法计算 出正确的 散列值的,这样就可以 防止数据被篡改

HMAC是一种使用单向散列函数来构造消息认证码(MAC)的方法,其中H就代表了hash的意思。HMAC中所使用的单向散列函数并不是仅仅局限于一种,任何获得认证的高强度的单向散列函数都可以用于HMAC的计算。

使用单向散列函数SHA-1、SHA-224、SHA-256、SHA-384、SHA-512等构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA224、HAMC-SHA256、HMAC-SHA384、HAMC-SHA512

三、分组密码加密模式说明

1. 电子密码本 ECB (Electronic Code Book)

将待处理信息分组,每组分别进行加密或解密处理

简单的理解就是库管员有N个锁,并且锁子的锁芯都一样,缺点就是很容易收集到几个锁后,就能试出钥匙

ECB模式的缺陷:明文中的重复排列会反应在密文中,通过删除、替换密文分组能够对明文进行操作,对包含某些比特错误的密文进行解密时,对应的分组会出错;不可以抵御重放攻击。

2. 密码块链接 CBC(Cipher Block Chaining)

每个明文块先与其前一个密文块进行异或,然后再进行加密,要提供一个初始化向量IV,就是前面的块的结果要参与后面块的运算

简单的理解相当于库管员只拿一把A钥匙,把B房子的钥匙放到A房子,把C房子的钥匙放到B房子,这样打开A房子后,就可以一直打开B房子,一直持续下去。

缺点就是单个计算流程是串行的,有紧急的事要打开仓库,也得从A一起开到底,效率就有些不行,然后就向CTR (Counter)模式靠拢,还有GCM模式

CBC模式缺陷:对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错;加密不支持并行计算。

应用:通用传输

3. 密文反馈 CFB(Cipher FeedBack)

在CFB模式中,前一个密文分组会被送回到密码算法的输入端。所谓反馈,这里指的便是返回输入端的意思。

CFB模式的优点:不需求填充;支持并行计算(仅解密);可以解密随意密文分组。

CFB模式的缺陷:加密不支持并行计算;对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错;不可以抵御重放攻击。

应用:通用传输

输出反馈 OFB(Output FeedBack)

OFB模式的全称是Output-Feedback模式(输出反馈模式)。在OFB模式中,密码算法的输出会反馈到密码算法的输入中。

OFB模式并不是通过密码算法对明文间接进行加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的,在这一点上OFB模式和CFB模式十分类似。

OFB模式的优点:不需求填充;可事前进行加密、解密的预备;加密、解密运用相同结构;对包含某些错误比特的密文进行解密时,只要明文中相对应的比特会出错。

OFB模式的缺陷:不支持并行计算、主动攻击者发转密文分组中的某些比特时,明文分组中相对应的比特也会被反转。

应用:噪声信道上数据流

计数器模式 CTR (Counter)

CTR模式的全称是CounTeR模式(计算器模式)。CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。

CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。也便是说,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行XOR而得到的。

CTR模式的优点:不要要填充、可事前进行加密、解密的预备、加密、解密运用相同结构、对包含某些错误比特的密文进行解密时,只要明文中相对应的比特会出错;支持并行计算(加密、解密)

CTR模式的缺陷:主动攻击者发转密文分组中的某些比特时,明文分组中相对应的比特也会被反转。

应用:分组通用传输高速需求

伽罗瓦/计数器模式 GCM(Galois/Counter Mode)

ECB、CFB、OFB 三种模式可以解决 ECB 模式中相同明文生成相同密文的缺陷,CTR 又可以在此基础上提供多分组并行加密特性,但是它们都不能提供密文消息完整性校验功能,所有就有了 GCM 模式。

简单的理解就是其它的加密只是加密,我解密是正确的,但不知道是不是完整的,翻译过来是“不要报警”,但真实的消息可能是”不要!报警!”,是敌人的加密信息还是自己人的加密信息,GSM就是解决了这个。

四、初始化向量[Initialization Vector for Encryption]

1. 基本说明

对于分组密码(block)加密方式来说,通过加密和解密固定长度的块来提供安全性,需要使用不同的加密模式将算法重复应用于整个数据,并指示要使用的IV类型。在除ECB以外的所有加密方式中,都需要用到IV对加密结果进行随机化,有一些教程也叫,也就是解释为不同的盐就是不同的一些随机。

我们使用加密算法中的 IV 作为起始状态,将其添加到密码中以隐藏加密数据中的模式。这有助于避免在每次调用后重新颁发新密钥的需要。

对于大多数加密模式,我们使用唯一的序列或 IV。而且远不应该使用相同的密钥重复使用相同的 IV。这确保了相同的明文加密具有不同的密文,即使我们使用相同的密钥对其进行多次加密。

让我们看一下 IV 的一些特征,具体取决于加密模式:

  • 它必须是非重复的
  • 基于加密模式,它也需要随机
  • 它不一定是秘密
  • 它需要是一个加密随机数
  • AES 的 IV 始终为 128 位,无论密钥长度如何

2. 不同模式下的IV

众所周知,加密的主要功能是屏蔽明文,使攻击者无法猜测。因此,我们使用不同的密码模式来屏蔽密文中的模式。

ECB、CBC、OFB、CFB、CTR、CTS 和 XTS 等模式提供机密性。但这些模式不能防止篡改和修改。我们可以添加消息身份验证代码(MAC)或数字签名以进行检测。我们使用各种实现,在经过身份验证的加密 (AE) 下提供组合模式。CCM,GCM,CWC,EAX,IAPM和OCB就是几个例子。

ECB使用密钥分别加密每个块。这始终将相同的明文加密为相同的密文块,从而不能很好地隐藏模式。因此,我们不将其用于加密协议。解密也同样容易受到重放攻击。我们没有使用任何 IV,因此相同的明文将导致相同的密文,从而使其容易受到攻击。 尽管 ECB 模式是最脆弱的,但它仍然是许多提供商的默认加密模式。因此,我们需要更加警惕显式设置加密模式。

CBC模式使用 IV 来防止相同的明文导致相同的密文。我们需要注意IV是可靠的随机或唯一的。否则,我们将面临与 ECB 模式相同的漏洞

CFB模式是最基本的流媒体模式。它就像一个自同步流密码。与 CBC 模式不同,我们在这里不需要任何填充。在 CFB 模式下,我们使用 IV 作为密码生成的流的源。同样,如果我们使用相同的 IV 进行不同的加密,则密文中可能会出现相似之处。在这里,与CBC模式一样,IV应该是随机的。 如果IV是可预测的,那么我们就失去了机密性。

CRT和OFB使分组密码成为同步流密码。每种模式都会生成密钥流块。在这种情况下,我们使用特定的 IV 初始化密码。我们这样做主要是为了将 12 个字节分配给 IV,将 4 个字节分配给计数器。这样,我们可以加密长度为 2^32 块的消息。对于CTR模式,初始比特流取决于IV和密钥。在这里,重用 IV 也会导致密钥比特流重用。反过来,这将导致破坏安全性

如果 IV 不是唯一的,则计数器可能无法为对应于重复计数器块的块提供预期的机密性。但是,其他数据块不受影响。

伽罗瓦/计数器 (GCM) 模式是一种AEAD加密模式。它将计数器模式加密与身份验证机制相结合。而且,它可以保护明文和其他经过身份验证的数据 (AAD)。

但是,GCM 中的此身份验证取决于 IV 的唯一性。我们使用随机数作为 IV。如果我们重复一个IV,那么我们的实现可能容易受到攻击。

由于 GCM 使用 AES 进行加密,因此 IV 或计数器为 16 个字节。因此,我们使用前 12 个字节作为 IV,使用后 4 个字节随机数作为计数器。

IV总结

Mode Initialization Vector 说明
ECB No IV
CBC/CFB Random Unpredictable IV 随机不定,类似Md加密的Salt,中文就是盐
OFB/CRT Unique IV (Counter) 唯一性,类似Md加密的Salt,中文就是盐
GCM Unique IV(12 bytes) and Counter(4 bytes) 加密时是一个随机唯一的12位,加密完后生成密文和微软体系接口也叫Tag,也叫MAC

正如我们所看到的,重复使用具有相同密钥的 IV 会导致安全性下降。如果可能的话,我们应该使用更高级的模式,如GCM。此外,某些模式(如 CCM)在标准 JCE 发行版中不可用。在这种情况下,我们可以使用Bouncy Castle API来实现它。

五、关于AES (ADVANCED ENCRYPTION STANDARD)加密

AES原本指的是一套标准FIPS 197,而AES算法一般指分组大小为128bits的Rijndeal算法,由比利时学者Joan Daemen和Vincent Rijmen提出。

AES与Rijndeal的区别
AES仅指分段为128位的Rijndeal算法,两种算法对比如下:(Nr表示循环轮数,Nb表示分组大小,Nk表示密钥长度,Nb和Nk单位都是32bits)

循环轮数Nr Nb=4 (AES) Nb=6 Nb=8
Nk=4 10(AES-128) 12 14
Nk=6 12(AES-192) 12 14
Nk=8 14(AES-256) 14 14

在AES标准规范中,分组长度只能是128 bits,也就是每个分组为16个bytes简单表示为

算法 分组长度(Nb) 密钥长度(Nk) 迭代轮数(Nr)
AES-128 128 128 10
AES-192 128 192 12
AES-256 128 256 14

我们目前常用的组合为:类型+模式 = AES+GCM,对于GCM来说,它的IV是随机的3位唯一Iv

六、参考样图

ProcessOn模板社区-密码学知识点总结

七、总结和测试

In this article, we showed how to use an IV in different encryption modes. We also discussed the issues and best practices while using an IV.

As always, we can find the source code over on GitHub.

八、参考文章

简述RC6加密算法 - 夏冰加密软件技术博客 (jiamisoft.com)

简述Twofish加密算法 - 夏冰加密软件技术博客 (jiamisoft.com)

夏冰加密软件技术博客 (jiamisoft.com)

(45条消息) Diffie-Hellman算法_nice_wen的博客-CSDN博客_diffie-hellman

【密码学】一文读懂Diffie-Hellman密钥交换协议 (qq.com)

(45条消息) SM2算法加密与解密过程_清涵的博客-CSDN博客_sm2加密

什么是 SHA 加密? SHA-1 与 SHA-2 - WoTrus - 博客园 (cnblogs.com)

What Is SHA-256? | Boot.dev

(45条消息) 数据加密 —- SHA 加密_私房菜的博客-CSDN博客_sha加密

(45条消息) 加密算法 之二 HMAC_KXue0703的博客-CSDN博客_hmac加密

加密算法及其分类 - 走看看 (zoukankan.com)

https权威指南-ProcessOn

AES加解密流程及实现 - 知乎 (zhihu.com)

分组密码模式优缺点分析_加密 (sohu.com)

How to Use Asymmetric Encryption with AES and GCM Mode in .NET - YouTube

(七)分组密码的五大工作模式 - 知乎 (zhihu.com)

Java AES Encryption and Decryption | Baeldung

RSA in Java | Baeldung

AES算法(五)GCM工作模式 - 知乎 (zhihu.com)