编程技术记录

世界你好!

先摘录一段百度百科的文字:
密码学(在西欧语文中,源于希腊语kryptós“隐藏的”,和gráphein“书写”)是研究如何隐密地传递信息的学科.

密码学的历史很长,人类使用密码的历史几乎与使用文字的时间一样长。古典密码学、近代密码学、现代密码学……详细请阅读这里

在现代,密码技术大部分都和计算机紧密相关,因为计算了实在是太大了。做过基础应用开发的话,一般会对密码工具或加密工具有所了解,接触一些CryptoXXXXXXCrypto工具库。Crypto是不是和希腊语kryptós很像?😄😄😄

好了,说些我懂的吧。我从软件编程的角度谈下自己的体会。

算法分类

在学习和使用Crypto类的加解密工具库时,尤其是在查看和使用其提供API时,要明白这后面对应的是什么算法、在什么场景下使用。
当前,我们常用的算法可以分为三类:

  • 摘要算法,也称散列、哈希算法,也有叫做单向加密算法的。严格来说,这不是加密算法—-摘要算法是一种操作不可逆的算法,不能反向解密出原始数据。它应用的场景往往是完整性、真实性校验,例如数字签名。
  • 对称加密算法。指加密和解密的密钥都是同一个,通常是加密方和解密方预先共同约定一个密钥。在非对称加密算法
  • 非对称加密算法,公钥加密算法。这和对称加密算法相对应,指加密密钥和解密密钥不是同一个。著名的应用场景就是TLS/SSL(HTTPS的S指的是TLS/SSL)

摘要(Digest)

也叫杂凑、哈希;就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。例如MD5是将数据散列到128比特(16字节)上。

MD5

英文 MD5 Message-Digest Algorithm. 是第5代摘要算法,前面还有MD2、MD4。

MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。–摘自百度百科。

算法 输入 单次计算块 输出
MD2 任意数据,包括空数据 512比特(64字节) 128比特(16字节)
MD4 任意数据,包括空数据 512比特(64字节) 128比特(16字节)
MD5 任意数据,包括空数据 512比特(64字节) 128比特(16字节)

MD5的计算结果不存在32位、16位之分,其结果就是16字节、128比特。32位、16位之说是极其不专业的。

MD5已经被证明不安全,但这并不影响我们继续使用,只需要我们将应用范围缩小到不涉及安全方面就可以了。
例如,

  • 我们仍然可以使用MD5来校验非核心文件的完整性。
  • 用MD5将URL映射到本地文件名,以帮助实现缓存功能。(通常在客户端使用MD5时,是不考虑MD5的碰撞概率的)。

SHA系列

英语 Secure Hash Algorithm,缩写为SHA

算法 输入 单次计算块 输出
SHA1 0 ~ (2^64 – 1)字节,包括空数据 512比特(64字节) 160比特(20字节)
SHA224 0 ~ (2^64 – 1)字节,包括空数据 512比特(64字节) 224比特(28字节)
SHA256 0 ~ (2^64 – 1)字节,包括空数据 512比特(64字节) 256比特(32字节)
SHA384 0 ~ (2^128 – 1)字节,包括空数据 1024比特(128字节) 284比特(48字节)
SHA512 0 ~ (2^128 – 1)字节,包括空数据 1024比特(128字节) 512比特(64字节)

SHA224、SHA256、SHA384、SHA512统称为SHA2。当前,SHA1已经被证明不安全了(Google曾公布过两幅不同的有意义的图片,但其SHA1值是一样的,这在法律上是极其可怕的事)。
SHA2在安全领域仍然继续服役着。

SHA系列的最新标准已经有了SHA3系列,详情可以参考维基百科SHA3

SM3

我国SM3密码算法正式成为ISO/IEC国际标准

SM3是中华人民共和国政府采用的一种密码散列函数标准,相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。
在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA256相当。
SM3 算法的哈希值大小为 256 比特。

算法 输入 单次计算块 输出
SM3 0 ~ (2^64 – 1)字节,包括空数据 512比特(64字节) 256比特(16字节)

对称加密

对称加密(Symmetry Crypto),采用单钥密码系统的加密方法,加密和解密所使用的密钥是同一个。例如DES、3DES、AES、SM4等。

Chacha20,流式加密的算法,也属于对称加密;Google发布并用于取代RC4算法。本文不涉及,详细可自行搜索。

其安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。
通常对称加密的速度较快,在加密大量数据的场景,对称加密是首选。

AES

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;需要注意,AES中初始化向量(IV)的长度固定为128比特

算法 输入 单次计算块 KEY长度 IV长度 输出
AES128 任意,包括空数据 128比特(16字节) 128比特(16字节) 128比特(16字节) 最大长度 = 输入长度+128比特)
AES192 任意,包括空数据 128比特(16字节) 192比特(24字节) 128比特(16字节) 最大长度 = 输入长度+128比特
AES256 任意,包括空数据 128比特(16字节) 256比特(32字节) 128比特(16字节) 最大长度 = 输入长度+128比特

AES加密几个要点

摘自https://139.155.43.7/2019/11/21/ssl-evp%e6%a1%86%e6%9e%b6%ef%bc%9aaes%e5%8a%a0%e5%af%86/

  • 对称加密(Symmetry Crypto)
    加密和解密的钥匙是同一把—-加密方和解密方拥有相同的密钥(音yue,四声)。

  • 密钥(key)
    任意数据(不一定非得字符串),长度常见为128比特、192比特、256比特,也有支持512比特的算法库

  • 初始化向量(IV)
    这不是AES算法标准强制要求的,是一种增加AES破解难度的手段。IV和密钥共同参与加密和解密运算。IV长度固定为128比特。

  • 加密块(block)
    每次加密的块长度都是128比特;输入和输出长度相同,考虑补全模式的情况下,输出的最大长度 = 输入长度+128比特

  • 加密模式
    是指当需要加密的源数据长度大于128比特时,加密块和加密块之间的运算模式。
    常见的有 CBC密码分组链接模式、ECB电码本模式(不推荐)、CTR计算器模式、CFB密码反馈模式、OFB输出反馈模式。

  • 补全模式模式(padding)
    因为AES一个加密块为16字节,当源数据的最后一个块不足16字节时,需要手动补全为16字节。

一般使用PKCS7模式,手动补全N个N,N为不足的字节数。

SM4

SM4(原名SMS4)是中华人民共和国政府采用的一种分组密码标准,其设计安全性等同于AES-128,但是近年来的一些密码分析表明的其全性略弱于AES-128.
在商用密码体系中,SM4主要用于数据加密,其算法公开,分组长度与密钥长度均为128bit,

非对称加密

非对称加密,是指加密和解密的密钥不是同一个,是一对密钥–密钥对,分为公钥和私钥。非对称加密算法也称"公钥加密算法"

公钥(publickey),是公开的;私钥(privatekey),只被通信的一方持有,保密的。如果用公钥对数据进行加密,只有用对应的私钥才能解密。

和对称加密比起来,非对称加密通常速度较慢,但安全强度很高。所以,非对称加密一般用来传输或保密对称密钥。

当前比较流行的两种算法是

  • 基于极大整数做因数分解,以RSA为代表
  • ECC类,基于椭圆曲线数学,如SM2。

通常,基于椭圆曲线的加密算法强度大于基于极大整数做因数分解的加密算法。

RSA

RSA加密算法是一种非对称加密算法. 对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。

另外,RSA也是一种分块加密算法。

算法 输入 单次计算块 输出
RSA 任意数据 待加密的字节数不能超过密钥的比特长度值除以 8 再减去 11) 最大长度 = (输入长度 x 密钥长度)/( 密钥长度 – 11)

SM2

我国SM2密码算法正式成为ISO/IEC国际标准

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,属于ECC算法的一种,其可靠性基于椭圆曲线数学(RSA基于极大整数做因数分解难题)。

SM2也是一种分块加密算法。

SM9

我国SM9密码算法正式成为ISO/IEC国际标准

有空再单开一篇文章介绍吧。

发表回复

© Beli. All Rights Reserved.