加密算法

Li Guangqiao - 25/01/2024

blockchain

密码学技术

摘要算法

MD5算法

目标

通过MD5为数据建立一个唯一数字标识

特点

  1. 压缩性:输出长度固定
  2. 抗修改:对原数据进行任何改动,都会影响输出结果
  3. 强抗碰撞:已知原数据和其MD5值,想找到MD5值相同的另一个数据极其困难

作用

让大容量信息在用数字签名软件签署私人密钥前被压缩成一种保密的格式(就是把一个任意长度的字节串变换成一定长的16进制数字串)

过程

MD5算法的基本过程为:填充、分块、缓冲区初始化、循环压缩、计算结果。

  1. 填充

    MD5算法对于待处理信息的位长有以下要求:假设信息长度为Kbit,填充位长为Pbit,且1<P<512,要求 $$ K+P = (448)mod(512) $$ 当K=448(mod)512时,P = 512

    再向上述填充好的消息尾部附加K值得低64位,最后得到一个长度位数为K+P+64 = 0(mod)512的消息

  2. 分块

    • 把填充后的消息分割成L个位长位512bit的分组:Y0,Y1,...,YL-1。
    • 分组结果也可表示成N个位长位32bit字M0,M1,...,MN-1,N=Lx16。
  3. 缓冲区初始化

    初始化一个128位的MD缓冲区,记为CVq,表示成4个32位寄存器(A,B,C,D);CV0 = IV。迭代在MD缓冲区进行,最后异步的128位输出即位算法结果。

  4. 循环压缩,每轮循环中一次迭代运算逻辑

    对A迭代:a = b + ()

Sha256算法

HMacMD5和HMacSha256算法

对称算法

非对称算法

数字签名

**目标:**用于验证数据的完整性和来源。

**场景举例:**当您收到一个数字签名的文件或消息时,您可以使用该签名来确认信息确实来自声称的发送者,并且在传输过程中未被篡改。数字签名通常用于软件分发、电子文件传输、电子邮件等领域,以确保通信的安全性。

核心算法原理: 基于非对称加密,即私钥签名,公钥验签。

**数字签名的工作原理:**使用一对密钥,一个公钥和一个私钥。私钥由信息的发送者保密持有,用于创建签名;公钥则是公开的,任何人都可以用它来验证签名。当创建数字签名时,会对原始信息使用私钥进行加密,生成一个唯一的签名。接收方在收到信息后,可以使用公钥对签名进行解密,并与原始信息进行比对,以验证其完整性和来源。

**价值:**数字签名提供了一种确保信息传输安全、防止篡改和伪造的有效手段。

数字证书

数字证书是一种电子证明,用来证明公钥的所有者身份,它是公钥基础设施(PKI)的一个重要组成部分。数字证书包含了证书持有者的信息(如组织、个人等)、证书持有者的公钥、证书颁发机构(CA)的签名等信息。

当一个实体(如个人、服务器、客户端等)希望在网络上证明自己的身份时,它会生成一对密钥(一个公钥和一个私钥)。该实体会保留私钥,并将公钥发送到一个受信任的证书颁发机构(CA)。CA会验证实体的身份,然后用CA的私钥对该实体的公钥及其身份信息进行签名,生成一个数字证书。

数字证书的作用主要包括:

  1. 身份验证:数字证书帮助验证一个实体的身份,确保公钥确实属于它声明的持有者。
  2. 确保通信安全:通过数字证书,可以建立一个安全的通道,确保数据在传输过程中不被窃取或篡改。
  3. 数据加密:数字证书中的公钥可用于加密数据,只有对应的私钥持有者才能解密,确保数据的机密性。
  4. 数字签名:证书持有者可以使用其私钥创建数字签名,其他人可以使用公钥来验证签名的有效性。

数字证书在互联网安全通信中扮演着关键角色,如HTTPS协议就依赖于服务器的数字证书来建立一个安全的连接。

PKI体系

公钥基础设施(PKI,Public Key Infrastructure)是一套用于管理公钥加密的技术和服务的框架,主要用于在不安全的网络环境中安全地传输信息。PKI 通过一系列的角色、策略、硬件、软件和程序提供数字证书的颁发、管理、分发、使用、存储和撤销。

PKI 的主要组成部分包括:

  1. 证书颁发机构(CA,Certificate Authority):这是最核心的部分,负责颁发和管理数字证书。CA 会验证申请数字证书的实体(个人、组织、服务器等)的身份,并在验证后颁发一个数字证书。数字证书中包含了实体的公钥及其他身份信息,并由 CA 的私钥签名。
  2. 注册机构(RA,Registration Authority):RA 负责接收和验证数字证书申请者的身份信息,然后向 CA 推荐是否颁发证书。不是所有的 PKI 系统都有 RA,这取决于 PKI 的设计和需求。
  3. 证书库(Certificate Repository):通常是一个公开可访问的数据库,存储着所有颁发的证书及撤销的证书(通过证书撤销列表,CRL,来管理)。
  4. 密钥备份和恢复系统:用于备份和恢复密钥对,以防密钥丢失或损坏。
  5. 端点用户系统和应用:这些是使用 PKI 系统的终端,包括个人电脑、移动设备、服务器等,它们使用数字证书来进行加密通信、数字签名等。

PKI 的工作原理基于非对称加密,其中每个用户都有一对密钥:公钥和私钥。公钥是公开的,可以安全地分发给任何请求方;私钥是保密的,只有密钥的拥有者才能访问。通过这种方式,PKI 实现了数据的加密传输、身份验证和数据完整性验证。这使得 PKI 成为确保网络通信安全、电子商务和数字签名等领域的关键技术。

国密与国际算法

SM1

算法类型:分组加密算法

对称加密算法中的分组加密算法,其分组长度、秘钥长度都是128bit,算法安全保密强度跟 AES 相当,但是算法不公开,仅以IP核的形式存在于芯片中,需要通过加密芯片的接口进行调用。

SM2

算法类型:非对称加密算法

它是基于椭圆曲线密码的公钥密码算法标准,其秘钥长度256bit,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法。可以满足电子认证服务系统等应用需求,由国家密码管理局于2010年12月17号发布。

SM2采用的是ECC 256位的一种,其安全强度比RSA 2048位高,且运算速度快于RSA。

SM3

算法类型:密码杂凑算法

用于替代MD5/SHA-1/SHA-2等国际算法,适用于数字签名和验证、消息认证码的生成与验证以及随机数的生成,可以满足电子认证服务系统等应用需求,于2010年12月17日发布。

它是在SHA-256基础上改进实现的一种算法,采用Merkle-Damgard结构,消息分组长度为512bit,输出的摘要值长度为256bit。

SM4

算法类型:分组加密算法

跟SM1类似,是我国自主设计的分组对称密码算法,用于替代DES/AES等国际算法。SM4算法与AES算法具有相同的密钥长度、分组长度,都是128bit。于2012年3月21日发布,适用于密码应用中使用分组密码的需求。

SM9

算法类型:基于标识的非对称密码

用椭圆曲线对实现的基于标识的数字签名算法、密钥交换协议、密钥封装机制和公钥加密与解密算法,包括数字签名生成算法和验证算法,并给出了数字签名与验证算法及其相应的流程。并提供了相应的流程。可以替代基于数字证书的PKI/CA体系。

SM9主要用于用户的身份认证。据新华网公开报道,SM9的加密强度等同于3072位密钥的RSA加密算法,于2016年3月28日发布。

国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。

由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。

国密算法的安全性

SM2算法:SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。

SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性。SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。

SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。

随着国密算法推广的延伸,金融领域引入SM2、SM3、SM4等算法逐步替换原有的RSA、ECC等国外算法。现有银联银行卡联网、银联IC两项规范都引入了国密算法相关要求。如下图所示为金融活动中会应用到国密算法的业务。

参考文献

  1. MD5算法 - 知乎 (zhihu.com)
  2. MD5算法的Java实现-腾讯云开发者社区-腾讯云 (tencent.com)
Li Guangqiao
Li Guangqiao

一个正在转rust的ExtJs前端工程师。迷信rust的整体发展,十分相信rust在各个领域都能发光发热,至少目前rust在很多领域上验证了其安全性、易维护性。但说实话对于我这种菜鸡也是真的难上手哈哈哈~~。 思路总结:

  • 万物诞生都会有一个需求来源,每一个改变都是为了解决某个问题,最后应该考虑如何去做
  • 学会掌握一些宏观的知识和理论:系统论、还原论
  • 工程化思想,如何描述整体,从整体架构到模块关联等 故学习东西应该像看地图一样,先看整体了解整体的结构,然后再聚焦每一个模块,对于模块的学习,思考三个问题,“是什么?”、“为什么?”、“怎么做?”;那么设计一个东西时也应该去考虑整体性和关联性。

有关于未来的发展,以下是鄙人的粗浅的观点:

  • 编程语言未来应该是每个人必备的工具
  • 未来的交互方式应该会以语言交互为主流
  • 下一个去中心化的技术方案出来之前,区块链依然是web3建立价值体系的基础技术方案,如何将现实价值和虚拟价值联通是进入数字世界的一个大难题。
  • 未来注定是AI的世界。AI的进化会伴随绝大部分人的退化,届时除了尖端人才,人们学习的重心会放在何处?