Linux加密框架中的算法和算法模式
- Linux加密框架中的算法和算法模式(一)_家有一希的博客-CSDN博客
-
加密框架支持的密码算法主要是对称密码算法和哈希算法,暂时不支持非对称密码算法。除密码算法外,加密框架还包括伪随机数生成算法和压缩算法等非密码算法。
对称密码算法
- 对称密码算法分为分组密码算法和序列密码算法两种,其中分组密码算法将是对称密码算法的发展趋势重点。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成,其中密钥扩展算法将b字节的密钥扩展成r个子密钥。加密算法有一个密码学上的弱函数f与r个子密钥迭代r次实现。
- 加密框架中支持的对称密码算法基本上都是分组密码算法,但是也支持序列密码算法,只是将序列密码算法定义为分组长度为1的特殊的分组密码算法。
DES和3DES算法
- DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标注(FIPS),并授权在非密级政府通信中使用。3DES(即Triple DES)是DES向AES过渡的加密算法,是比DES更安全的一种变形,3DES使用2条56位的密钥对数据执行三次DES算法,加密过程是加密e-解密d-加密e,解密过程是解密e-加密d-解密e。
- 加密框架支持DES算法和3DES算法,记为des和3des_ede,实现源码为des_generic.c。
- des_generic.c - crypto/des_generic.c - Linux source code (v5.15.11) - Bootlin
AES算法
- AES全称Advanced Encryption Standard,即高级加密标准,在密码学上又称为Rijndeal算法,是美国联邦政府采用的一种区块加密标准,用来替代原先的DES算法。AES的基本要求是采用对称分组密码体制,密钥的长度最少支持128、186、256位,分组长度为128位。
- 2000年10月2日,美国政府正式宣布选中比利时密码学家Joan Deamen和incent Rijmen提出的Rijndeal算法组为AES。严格地说,AES和Rijndeal算法并不完全一样,虽然在实际应用中二者可以互换,因为Rijndeal算法支持更大的分组和密钥长度。Rijndeal算法使用的密钥和分组长度均为32的整数倍,下限为128位,上限位256位。性能而言,AES的运算速度远大于3DES,安全性不低于3DES。
- 加密框架支持AES算法,记为aes,实现源码为aes_generic.c。
- aes_generic.c - crypto/aes_generic.c - Linux source code (v5.15.11) - Bootlin
Blowfish算法
- Blowfish(河豚)算法是由Bruce Schneier设计的一个完全开源的算法。Blowfish算法是一个分组长度为64位、密钥长度可变的对称分组密码算法。Blowfish算法具有加密速度快、紧凑、密钥长度可变、可免费使用等特点,已被广泛应用于众多加密软件。由于Blowfish算法采用变长密钥,这在给用户带来极大便利的同时也有隐患。由于算法加解密核心在于密钥的选择和保密,但在实际应用中经常使用一些弱密钥对信息资源进行加密,导致存在很大的安全隐患。
- 加密框架支持Blowfish算法,记为blowfish,实现源码为blowfish_generic.c和blowfish_common.c。
- blowfish_common.c - crypto/blowfish_common.c - Linux source code (v5.15.11) - Bootlin
- blowfish_generic.c - crypto/blowfish_generic.c - Linux source code (v5.15.11) - Bootlin
Twofish算法
- Twofish算法是Bruce Schneier的Counterpane公司设计的完全开源的算法。Twofish算法是进入NIST第二轮AES算法筛选5种算法之一,满足AES的基本要求。
- 加密框架支持Twofish算法,记为twofish,其实现源码为twofish_generic.c和twofish_common.c。
- twofish_common.c - crypto/twofish_common.c - Linux source code (v5.15.11) - Bootlin
- twofish_generic.c - crypto/twofish_generic.c - Linux source code (v5.15.11) - Bootlin
RC4算法
- RC4算法是Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇,之所以称其为簇,是因为其核心部分的sbox可为任意长度,但一般为256字节。RC4算法的速度可达到DES算法速度的10倍左右,且具有很高级别的非线性。RC也成为ARC4(Alleged RC4,即所谓的RC4),因为RSA从未正式发布过这个算法。
- 加密框架支持RC4算法,记为arc4,实现源码为arc4.c。
- arc4.c - crypto/arc4.c - Linux source code (v5.15.11) - Bootlin
CAST算法
- CAST算法包括CAST5(也称CAST-128)和CAST6(也称CAST-256)两种,由Carliasle Adams和Stafford Tavares分别于1996年和1998年提出的,其中CAST5是一种类似DES的置换组合网络(SPN)加密系统,而CAST6是作为AES的竞选算法提出的。
- CAST5是一种12或16循环的Feistel密码,块长度为64位,密钥长度可变,从40位到128位按8位递增,并且只有当密钥长度大于80位时,才允许使用16循环。CAST6是一种48循环的Feistel密码,块长度位128位,密钥长度可变,从128位到256位按32位递增。
- 加密框架支持CAST5和CAST6算法,记为cast5和cast6,实现源码为cast5.c和cast6.c。
- 注:CAST128和CAST5是同一的,不是指使用128位密钥。为区分不同密钥长度的操作,在算法名后需要加上密钥长度,如使用40位密钥时表示为CAST5-40,使用128位密钥时表示为CAST5-128。
- cast5_generic.c - crypto/cast5_generic.c - Linux source code (v5.15.11) - Bootlin
- cast6_generic.c - crypto/cast6_generic.c - Linux source code (v5.15.11) - Bootlin
TEA算法
- TEA(Tiny Encryption Algorithm)算法是由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年提出的一种分组密码算法,块长度为64位,密钥长度为128位。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每次的加密结果是不同的。TEA算法的迭代次数是可变的,建议为32轮。例如腾讯公司的产品使用到了TEA算法,但迭代次数不是标准的32轮而是16轮。TEA算法简单易懂,容易实现,但存在很大的缺陷,如相关密钥攻击。TEA经历了多个版本,包括XTEA、Block TEA和XXTEA等。
- 加密框架支持TEA算法及后续的XTEA和Block TEA算法,记为tea、xtea和xate,其实现源码为tea.c。
- tea.c - crypto/tea.c - Linux source code (v5.15.11) - Bootlin
Khazad算法
- Khazad算法是由Paulo.S.L.M.Barreto和Vincent Rijmen于2000年联合提出的。Khazad算法是欧洲NESSIE(new European Schemes for signature、integrity and encryption)密码计划中进入第二阶段的候选加密算法之一。Khazad算法的分组长度为64位,密钥长度为128位。Khazad算法采用对合结构,加密和解密仅在密钥生成算法上存在差异。
- 加密框架支持Khazad算法,记为khazad,其实现源码为khazad.c。
- 注:Khazad算法名称选自科幻小说《指环王》中的虚拟地址。
- khazad.c - crypto/khazad.c - Linux source code (v5.15.11) - Bootlin
Serpent算法
- Serpent算法是由Ross Anderson、Eli Biham和Lars Krcudsen联合开发的。Serpent算法是进入NIST第二轮AES筛选的5个算法之一,满足AES的基本要求。
- 加密框架支持Serpent算法,记为serpent,其实现源码为serpent.c。
- 注:Serpent意为大蛇,圣经中记载Serpent是撒旦的化身,是其引诱夏娃吃下禁果的。
- 注:Rijndael、Serpent和Twofish是入围第三轮AES筛选的三个算法,性能方面,Serpent被认为是最安全的,Rijndael速度最快,Twofish居中。
- serpent_generic.c - crypto/serpent_generic.c - Linux source code (v5.15.11) - Bootlin
Anubis算法
- Anubis算法是一种分组对称算法,块长度为128位,密钥长度从128位到320位可变。
- 加密框架支持Anubis算法,记为anubis,其实现源码位anubis.c。
- 注:Anubis意为埃及神话中的阿努比斯神,引导亡灵的神,豺头人身神。
- anubis.c - crypto/anubis.c - Linux source code (v5.15.11) - Bootlin
Camellia算法
- Camellia(山茶花)算法是由三菱和日本电报电话(NTT)联合发布的,被欧盟NESSIE项目列为选定算法,被日本CRYPTREC项目列为推荐算法。Camellia算法块长度为128位,密钥长度128位、192位和256位可选,具有和AES同等级的安全强度和运算量。
- 加密框架支持Camellia算法,记为camellia,其实现源码为camellia.c。
- camellia_generic.c - crypto/camellia_generic.c - Linux source code (v5.15.11) - Bootlin
哈希算法
MDx系列算法
- MDx系列算法是应用范围非常广泛的一个算法家族,其中MD是Message Digest(消息摘要)的缩写,x表示算法版本(如MD2、MD3、MD4、MD5)。MDx系列算法最早由Ron Rivest(RSA公司)于1992年提出的,MD2、MD4、MD5都产生16字节(128位)的校验值(hash值)。目前主流的MDx系列算法为MD5,但已被中国山东大学王小云教授攻破,可以快速找到碰撞(摘要相同的不同消息)。
- 加密框架支持MDx系统算法中的MD4和MD5,分别记为md4和md5,其实现代码分别为md4.c和md5.c。
- md4.c - crypto/md4.c - Linux source code (v5.15.11) - Bootlin
- md5.c - crypto/md5.c - Linux source code (v5.15.11) - Bootlin
SHA系列算法
- SHA(Secure Hash Algorithm)是美国国家标准技术研究院(NIST)制定的。SHA系列算法的摘要长度分贝为:SHA1为20字节(160位)、SHA256为32字节(256位)、SHA384位48字节(384位)、SHA512为64字节(512位),其中SHA1应用较为广泛,主要应用于CA和数字证书中,但已被中国山东大学王小云教授攻破,可以快速找到碰撞。由于SHA系列算法的消息摘要长度较长,因此其运算速度与MD5相比也相对较慢。
- 加密框架支持SHA系列算法中的SHA1、SHA224和SHA256以及SHA384和SHA512,分别记为sha1、sha224和sha256以及sha384和sha512,其实现源码sha1_generic.c、sha256_generic.c和sha512_generic.c。
- sha1_generic.c - crypto/sha1_generic.c - Linux source code (v5.15.11) - Bootlin
- sha256_generic.c - crypto/sha256_generic.c - Linux source code (v5.15.11) - Bootlin
- sha3_generic.c - crypto/sha3_generic.c - Linux source code (v5.15.11) - Bootlin
- sha512_generic.c - crypto/sha512_generic.c - Linux source code (v5.15.11) - Bootlin
Whirlpool算法
- Whirlpool算法是由Vincent Rijmen和Paulo S.L.M.Barreto于2000年提出的,号称最安全的摘要算法,其摘要长度为512位,已被列入ISO标准。从发布至今共经历了三个版本,分别为whirlpool-O、Whirlpool-T和Whirlpool。
- 加密框架除支持标准的摘要长度为512位的Whirlpool算法i外,还支持摘要长度分别为256和384位的Whirlpool算法,分别记为wp512、wp256和wp384,其实现代码为wp512.c
- wp512.c - crypto/wp512.c - Linux source code (v5.15.11) - Bootlin
Tiger算法
- Tiger算法是由Ross Anderson和Eli Biham于1996年提出的,号称最快的摘要算法,并且专门为64位机器进行了性能优化。Tiger算法的摘要长度位192位。
- 加密框架除支持标准的摘要长度为192位的Tiger算法外,还支持摘要长度截短为128位和160位的Tiger算法,分别记为tgr192、tgr128和tgr160,其实现代码为tgr192.c。
- 未找到
RIPEMD算法
- RIPEMD(RACE Integrity Primitives Evaluation Message Digest)算法是Hans Dobbertin等3人在MD4、MD5算法基础上于1996年提出的。RIPEMD算法支持128、160、256和320位共4种摘要长度。
- 加密框架支持摘要长度为128、160、256和320位的RIPEMD算法,分别记为rmd128、rmd160、rmd256和rmd320,其实现源码分别为rmd128.c、rmd160.c、rmd256.c和rmd320.c。
- 只剩下 rmd160
- rmd160.c - crypto/rmd160.c - Linux source code (v5.15.11) - Bootlin
CRC32算法
- CRC(Cyclic Redundacy Checksum)是对数据的校验值,中文为循环冗余校验码,常用于检验数据的完整性。
- 加密框架支持的CRC算法是CRC32,即数据校验值为32位,记为crc32c,其实现源码为crc32c.c。
- crc32c_generic.c - crypto/crc32c_generic.c - Linux source code (v5.15.11) - Bootlin
GHASH函数
- 在加密框架中,将定义在伽罗华(Galois)域(仅含有限多个元素的域)的泛散hash函数定义为独立的算法,记为ghash,其实现源码为ghash_generic.c。
- ghash-generic.c - crypto/ghash-generic.c - Linux source code (v5.15.11) - Bootlin
其他算法
伪随机生成算法
- 伪随机数生成算法(PRNG:Pseudo Random Number Generator)
- a)符合ANSI标准的伪随机数生成算法,记为stfrng,算法驱动名为ansi_cprng,实现源码为ansi_cprng.c。
- b)基于内核RNG的伪随机数生成算法,也记为stdrng,但其算法驱动名为krng,实现源码为krng.c。 未找到
- ansi_cprng.c - crypto/ansi_cprng.c - Linux source code (v5.15.11) - Bootlin
- 注:在ansi_cprng.c中,还定义了一种符合FIPS(Federal Information Processing Standard,即联邦信息处理标准)的伪随机数生成算法,记为fips(ansi_cprng),但必须在宏开关CONFIG_CRYPTO__FIPS开启时才有效。
压缩算法
- a)deflate算法,记为deflate,实现源码为deflate.c。
- deflate.c - crypto/deflate.c - Linux source code (v5.15.11) - Bootlin
- b)lzo算法,记为lzo,实现源码为lzo.c。
- lzo.c - crypto/lzo.c - Linux source code (v5.15.11) - Bootlin
- c)zlib算法,记为zlib,实现源码为zlib.c 未找到
NULL算法
- 除上述常规算法外,加密框架还支持一种特殊的算法,即什么都不做的NULL算法。NULL算法的实现源码为crypto_null.c,其中定义了名为digest_null、cipher_null和compress_null三种NULL算法,即NULL摘要算法、NULL加密算法和NULL压缩算法
- 在加密框架中,NULL算法主要用作复合算法的填充算法。例如,IPSEC中ESP协议在提供加密服务的同时还提供可选的认证服务,而Linux的IPSEC实现(即XFRM框架)将ESP协议的加密服务和可选的认证服务统一定义为认证加密(AEAD)服务。认证加密服务可以由一个认证加密算法实现也可以由一个认证算法和加密算法组成的复合算法实现。由于认证服务是可选的,当一个ESP协议对应的安全关联SA未定义认证算法时说明未启用认证服务,此时复合算法中的认证算法就是上面定义的NULL摘要算法。
- crypto_null.c - crypto/crypto_null.c - Linux source code (v5.15.11) - Bootlin
参考链接
- https://blog.csdn.net/weixin_43916535/category_10127981.html 加密框架专栏