游客您好
第三方账号登陆
  • 点击联系客服

    在线时间:8:00-16:00

    客服电话

    17712677918

    电子邮件

    857020071@qq.com
  • 扫描二维码

    关注微信公众号

推荐阅读
vguangxian01 版主
未知星球 | 未知职业
  • 关注0
  • 粉丝0
  • 帖子46
热议话题
Node.js 简介
2021-08-28 0
Node.js 是一个开源与跨平台的 JavaScript 运行时环境。 它是一个可用于几乎任何项目
精选帖子

安全工程之密码学

[复制链接]
vguangxian01 发表于 2020-11-21 20:50:06 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
[size=1.333]一、密码学的定义及概念


1.术语定义

密码学:是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。密码学的目标是使信息获取的更加耗时而不值得攻击,最早源于古希腊。

密码算法:密码系统采用的加密方法和解密方法,随着基于数学密码技术的发展,加密方法一般称为加密算法,解密方法一般称为解密算法。

密码术(Cryprography):从希腊词Kryptos派生而来。它是一种为了使信息无法被外人理解,而对信息进行加密的技术。密码术通常分为两种,那就是易位和替换。

密码分析学(cryptanalysis)是一门研究和破解加密过程、破坏身份验证方案以及对算法、密钥进行逆向工程的学科,是密码术和密码学的重要组成部分。

2.密码学历史

1)手动时期:atbash、密码棒、凯撒密码

2)机械时期

3)现代时期

4)新兴技术:量子密码

3.密码组成

密码系统包括:软件、协议、算法、密钥

密码系统的强度: 由算法的复杂度、密钥机密度、密钥的长度、初始化向量以及其在密码系统中如何协同工作有关


密码系统的Kerckhoffc原则

  • 密钥比算法重要
  • 算法应当公开,验证其强大。


4.密码系统提供的能力

  • 机密性:除授权实体外,其他实体无法理解提交的数据
  • 完整性:数据从创建到传输、存储都不会被未授权更改
  • 身份验证:对创建信息的用户或系统的身份进行验证
  • 授权:证明身份之后,向个体提供允许访问某些资源的密钥和密码
  • 不可否认性:确保发送方无法否认发送过信息


[size=1.333]二、密钥管理过程

1.密钥创建

要考虑可扩展性和密钥完整性。可手动和自动。

采用自动化系统来创建密钥,不仅对用户透明便于密钥策略实施。

工作因子与构成密钥的位的随机性水平有关。

2.密钥分发

密钥分发可采取线上和线上两种途径。

线上:密钥分发服务器(KDC):用户与KDC共享的密钥,用于KDC和用户之间传输加密信息。用户和应用资源通信的会话密钥,需要时创建,用完则删除

3.密钥存储与销毁

所有密钥都需要被保护防止被修改,所有会话密钥和私钥需要被保护防止被非授权暴露

密钥保护方法:可信的、防篡改的硬件安全模块,带密码保护的智能卡,分割密钥存储在不同地点,使用强口令保护密钥。

4.相关标准

  • NIST SP800-21-1 联邦 政 府 实施密码学指南
  • NIST SP800-57    密钥管理建议

[size=1.333]三、密码的方法

1.密码的方法主要由替代和换位组成,也称为密码术。产生于古希腊。

  • 替代:使用不同的位、字符或字符组合来替换原来的位、字符或字符分组
  • 换位:对原有值进行置换,重新排列

2. 一次性密码本(也称Vemam):由随机值组成,只一次使用,安全发送和接收,与消息至少一样长。

实际情况/问题:由计算机生成,可预测,为伪随机,需要确保发送方和接收方都是安全的难度较大。

3.滚动密码:算法可以预定义为一本书,而密钥是书的册数、页数、行数和行中的关键字,类似谍战片。

4.隐藏密码:将数据隐藏到某文件中,例如可以将一段文字隐藏的WORD,通过调整图片色号,对方读取色号。代表工具:SegoShare

5.增加密码强度的技术

  • 压缩,压缩后加密减少冗余字段
  • 扩张,复制值来扩展明文,增加明文大小
  • 填充,在加密明文前添加材料
  • 密钥混合




四、密码类型

常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法。

  • 对称加密


指加密和解密使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥。对称加密算法的安全性取决于加密密钥的保存情况
常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES
  • 非对称加密
指加密和解密使用不同密钥的加密算法,也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。如果企业中有n个用户,企业需要生成n对密钥,并分发n个公钥。由于公钥是可以公开的,用户只要保管好自己的私钥即可,因此加密密钥的分发将变得十分简单。同时,由于每个用户的私钥是唯一的,其他用户除了可以通过信息发送者的公钥来验证信息的来源是否真实,还可以确保发送者无法否认曾发送过该信息。非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比对称加密慢上1000倍。
常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)



在此大家都能达成一个共识,对称加密比非对称加密快,非对称加密比对称加密更安全。但为什么呢?

笔者找了一圈还是比较蒙,以下的解释可能是比较好的答案:非对称加密是构造难以解决的数学问题来保证安全性的。所以加密或解密必然会有一边很慢。

希望各位大神给予解答下,为什么非对称要比对称慢
  • Hash算法
Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA



[size=1.333]1.对称密钥

加密和解密都使用一个密钥


优点:加密速度快、使用大密钥的时候很难攻破(密钥越长,越不容易被攻破)

缺点:需要确保分发机制的安全性(线下,中间不可控。线上,存在被截获风险)、每个人需要管理的密钥呈指数增长(要和N个进行通信,需要拥有的对称密钥数为N(N-1)/2

用途:只提供机密性,即数字加密

特例:会话密钥:只使用一次的对称密钥,用于对通信会话期间两个用户之间的消息通信。随着会话连接而创建,随着会话结束而销毁。

[size=1.333]1.1.算法类型

1)分组密码

加密和解密时,消息会被划分成若干分组。每次使用数学函数处理一个分组。

强密码的属性

  • 扰乱:通过替代实现,使密钥和密文之间的关系尽可能的复杂。
  • 扩散:通过换位实现,雪崩效应,将一个分组的各个位捣乱或者分散到整个分组。


2)流密码

消息作为位流对待,函数作用到每一个位上,使用密码生成器(问题同一次性密码本)

流密码更加适合硬件加密。

3)初始化向量

使用初始化向量(Initialization Vector ,IV)提高随机性。与密钥同时使用,提高随机性,因为IV是随机的。

解决的问题:当使用相同的密钥加密相同的文件时。密文也是相同的,这样攻击者可以更容易找到破解方法。

[size=1.333]1.2.工作模式

  • ECB(电子密码本):一个64位的数据分组输入带密钥的算法,生成一个密文。一组明文和密钥总是生产相同的密文
    将明文按分组大小切分,然后用同样的密钥正常加密切分好的明文分组。
870512-20200617204914303-1031854348.png
      ECB的模式理想状态是短数据加密。用于同样的明文分组加密得到同样的密文,因此此类型无法隐藏原明文数据的模式。
  • CBC(密码分组链接):前一个分组会应用到下一个密钥分组加密。


       分组加密前,将一个数据分组的结果与下一个数据分组进行异或运算。每一个分组都用于更改下一个分组。解密时必须先得到前一个分组,对下个分组解密后,进行异或运算才能得到下一个分组数据。其中第一个分组强度,通过加入初始化向量(IV)来实现。

870512-20200617204914864-870769606.png





  • CFB(密文反馈):用上一个8位密文,加密下一个8位明文分组。


       与CBC模式类似,不同之处为,CFB模式先生成密码流字典,然后用密码字典与明文进行异或操作并最终生成密文。后一分组的密码字典的生成需要前一分组的密文参与运算。

       CFB模式是用分组算法实现流算法


       缺点:当前一个密文的一位被破坏,会进入到下一个明文分组加密,从而影响整个加密。



870512-20200617204915483-908747746.png



  • OFB(输出反馈):用上一个密钥流加密下一个明文分组,对下一个分组加密。
       OFB模式与CFB模式不同的地方是:生成字典的时候会采用明文参与运算,CFB采用的是密文。

870512-20200617204915983-240207448.png

  • CTR(计数器):并行发生,提高效率。通过计数器生产。


      CTR模式同样会产生流密码字典,但同是会引入一个计数,以保证任意长时间均不会产生重复输出。

870512-20200617204916494-1378424388.png



[size=1.333]1.3.各种算法

1)DES

IBM提出,是一个标准也是一个算法,其中DEA是其执行的一种算法。两个概念有时候会同时出现。

类型为分组密码,使用64位密钥,56位实际使用,8位奇偶校验,一次一个分组,经历16次换位和替代

2)3DES

是DES的增强版本,经历48次换位和替代(是DES迭代次数的3倍。)

使用192位密钥,其中实际使用56 * 3 = 168位加密,8*3=24位进行奇偶校验。

具体迭代方式:

  • EEE3:使用三个不同密钥加密,加密,加密,再加密
  • EDE3:加密,解密,再加密
  • EEE2:使用两个密钥,第一个和第三个相同
  • EDE2:使用两个密钥,第一个和第三个相同。

关于上述所描述的解密,实际使用的不是和加密对应的密钥来解密的,而是使用一个不同的密钥来解密,目的是使数据杂乱无章,实际并没有解密。

3)IDEA(国际数据加密算法)

国际数据加密算法(IDEA)是上海交通大学教授来学嘉与瑞士学者James Massey联合提出的。它在1990年正式公布并在以后得到增强。这种算法是在DES算法的基础上发展出来的,类似于三重DES。发展IDEA也是因为感到DES具有密钥太短等缺点。

IDEA属于分组密钥,密钥长度128位,每64位分组,8轮运算。

目前在PGP中使用,类似3DES

4)AES(高级加密标准)

高级加密标准(Advanced Encryption Standard,AES),用以替代DES标准。

由美国国际标准技术研究所(NIST)提出,是一套对称加密标准,用以替代DES标准,面向全球征集算法,最后Rijndael,Serpent,Twofish,RC6和MARS入围。

AES标准选取分组长度为128比特(每个字节8比特),密钥长度为128比特、192比特、256比特,三个版本运算次数为:

  • 128密钥,执行10轮运算
  • 192密钥,执行12轮运算
  • 256密钥,执行14论运算


AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。



AES密钥长度(32位比特字)分组长度(32位比特字)加密轮数
AES-1284410
AES-1926412
AES-2568414




加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:

  • 轮密钥加(AddRoundKey)


—矩阵中的每一个字节都与该次回合金钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。

  • 字节代换(SubBytes)


通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。

  • 行移位(ShiftRows)


将矩阵中的每个横列进行循环式移位。

  • 列混合(MixColumns)


为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

5)Rijndael

Rijndael由比利时两位非常著名的密码学家Joan Daemen和Vincent Rijmen设计,向NIST提交的一种满足AES要求的加密算法。Rijndael是一个分组密码算法族,其分组长度包括128比特、160比特、192比特、224比特、256比特,共25种组合,密钥长度也包括这五种长度。

NIST选择此算法作为AES标准的加密算法。

6)Twofish

Twofish 则是counterpane 公司向NIST提交的一种满足AES要求的加密算法。Twofish 采用128位数据块(128 bits block),128- 192-256-bit 可变长度密钥。Twofish 算法是进入NIST第二轮 5种加密算法中的一种。

将数据以每32bit为一组,若为128bit,则分为4组,进行16轮异或运算,最后将4组数据组成密文,密文和明文长度一致。

7)Blowfish

64位分组,长度32-448位,16轮运算。

分组密码算法,加密速度快、紧凑、密钥长度可变、可**等特点

8)RC系类

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。它的输入和输出都是64比特。密钥的长度是从1字节到128字节可变,但1998年的实现是8字节。

RC4:流密码,密钥长度可变。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一

RC5:分组密码:最大密钥长度2048位

三个可变的参数是:分组大小、密钥大小和加密轮数。在此算法中使用了三种运算:异或、加和循环。

RC6;分组密码

RC6是作为AES(Advanced Encryption Standard)的候选算法提交给NIST(美国国家标准局)的一种新的分组密码。它是在RC5的基础上设计的,以更好地符合AES的要求,且提高了安全性,增强了性能。

9)CCMP

CCMP主要是两个算法所组合而成的,分别是CTR mode以及CBC-MAC mode

由IETF RFC 3610定义,作为一个组件被包含在由IEEE定义的802.11i中使用。

计数器模式密码块链消息完整码协议,无线环境中应用。

10)CAST

类似于DES,也是一种分组加密算法

CSAT-128,64位分组。密钥长度可以在40-128位之间,进行12-16轮运算,密码长度可变,每次递增8位。不同密码长度循环次数不同,其中40-80位,循环12次,大于80位为16次。

CAST-256,128位分组,密钥长度可为128、192、160、224、256位,进行48轮运算

11)SAFER

64位分组(SAFER-SK64),或者128位分组(SAFER-SK128)

其变形被用于在蓝牙通信分组加密

12)Skipjack

美国国家安全局标准加密算法

应用在clipper密码芯片

80位密钥

13)SM算法

SM4:16字节分组,长度128位,分组密码算法,用于无限局域网产品

SM1:国密算法,分组对称算法,分组长度为128位,密钥长度都为 128 比特

[size=1.333]2.非对称密码

优点:具有更好的分发功能、扩展性好。提供身份验证和不可否认性

缺点:比较慢(需要复杂的数学算法)

[size=1.333]2.1.各种算法

1)RSA

使用单向函数

通过大质数生产密钥对

1024位RSA密钥加密强度相当于80位的对称密钥

2048位RSA密钥加密强度相当于112位的对称密钥

3072位RSA密钥加密强度相当于128位的对称密钥

224位ECC密钥加密强度相当于112位的对称密钥

2)EI Gamal

在一个有限域内计算离散对数的困难性为基础。

用于数字加密和数字签名。

3)ECC(椭圆曲线)

比RSA效率更高

可以使用比RSA更少的密钥来提供同等级别的保护

4)SM算法

SM2:国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。

SM9:标识密码算法,适合端对端离线安全通讯、云端数据加密、基于属性加密、基于策略加密的各种场合

5)DSA

美国国家标准局提出

只能用作数字签名,比RSA快

提供p和q两个素数,并公开

非对称密码技术应用:机密性、真实性和不可抵赖性

6)Diffie-Hellman算法

解决了hard-coding(硬编码)

Diffie-Hellman密钥协商算法主要解决秘钥配送问题,本身并非用来加密用的;该算法其背后有对应数学理论做支撑,简单来讲就是构造一个复杂的计算难题,使得对该问题的求解在现实的时间内无法快速有效的求解(computationally infeasible )。


DH算法在IPSEC中用于SA的协商。



非对称加密算法的用途:

非对称加密由公钥和私钥组成,其中公钥面向公众开放,私钥只有拥有者所有,不对外,要高度私密性。

数字签名:使用发送方的私钥加密数据,由于公钥是公开的,只要有公钥就能解开数据。主要是为实现抗抵赖。

数字信封:也就是常说的数字加密,使用接收方的公钥加密,只有接收方的私钥才能解密。非对称加密要比对称加密慢的多。



[size=1.333]3.单向散列

[size=1.333]3.1.定义

单向散列算法,又称hash函数,Hash函数(也称杂凑函数或杂凑算法)就是把任意长的输入消息串变化成固定长的输出串的一种函数。这个输出串称为该消息的杂凑值。一般用于产生消息摘要,密钥加密等。


接收方只需要同样计算,不需要逆向功能。得到值后进行对比。


单向散列函数的安全性是由于它的单向性,其输出不依赖于输入。平均而言,预映射值单个位的改变,将引起散列值中一半位的改变。已知一个散列值,要找到预映射的值,使它的散列值等于已知的散列值在计算上是不可行的。单向散列函数的安全性使它能用于完整性校验和提高数字签名的有效性。

一个安全的杂凑函数应该至少满足以下几个条件:

①输入长度是任意的;

②输出长度是固定的,根据目前的计算技术应至少取128bits长,以便抵抗生日攻击;

③对每一个给定的输入,计算输出即杂凑值是很容易的;

④给定杂凑函数的描述,找到两个不同的输入消息杂凑到同一个值是计算上不可行的,或给定杂凑函数的描述和一个随机选择的消息,找到另一个与该消息不同的消息使得它们杂凑到同一个值是计算上不可行的。



特点:

  • 不可逆/单向性:从明文可以计算从散列值,但从散列值无法推算出。
  • 一致性:一样的明文,一定计算出一样的散列值。
  • 固定长度:明文无论是1bit还是1000bit,计算的结果都是固定的值,例如MD5是128bit。
  • 不可预测:散列值不可预知,即使更换了其中的一个字母,计算的结果完全不同


[size=1.333]3.2.常见算法

[size=1.333]3.2.1. MD5算法

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法,可以用来把不同长度的数据块进行暗码运算成一个128位(16字节)的数值。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

MD5算法的核心过程:MD5把128bit的信息摘要分成A,B,C,D四段(Words),每段32bit,在循环过程中交替运算A,B,C,D,最终组成128bit的摘要结果。

870512-20200617204917269-714685359.jpg



[size=1.333]3.2.2.SHA算法

安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

SHA是一系列的加密算法,有SHA-0、SHA-1、SHA-2、SHA-3三大类。其中SHA-0、SHA-1已经被破解,SHA-2目前是使用最多的一个,使用的理论算法与SHA-1一致。SHA-3在2012年被确定,目前使用不是很广泛,与SHA2使用不同的理论算法。

1)SHA-0

最初载明的算法于1993年发布,称做安全杂凑标准(Secure Hash Standard),FIPS PUB 180。这个版本常被称为SHA-0。它在发布之后很快就被NSA撤回,并且由1995年发布的修订版本FIPS PUB 180-1(通常称为SHA-1)取代。SHA-1和SHA-0的算法只在压缩函数的讯息转换部分差了一个位元的循环位移。根据NSA的说法,它修正了一个在原始算法中会降低杂凑安全性的弱点。然而NSA并没有提供任何进一步的解释或证明该弱点已被修正。而后SHA-0和SHA-1的弱点相继被攻破,SHA-1似乎是显得比SHA-0有抵抗性,这多少证实了NSA当初修正算法以增进安全性的声明。

SHA-0和SHA-1可将一个最大2的64次方位元的讯息,转换成一串160位元的讯息摘要;其设计原理相似于MIT教授Ronald L. Rivest所设计的密码学杂凑算法MD4和MD5。

[size=1.25]SHA-0破解

在CRYPTO 98上,两位法国研究者提出一种对SHA-0的攻击方式:在261的计算复杂度之内,就可以发现一次碰撞(即两个不同的讯息对应到相同的讯息摘要);这个数字小于生日攻击法所需的2的80次方,也就是说,存在一种算法,使其安全性不到一个理想的杂凑函数抵抗攻击所应具备的计算复杂度。

2004年时,Biham和 Chen也发现了SHA-0的近似碰撞,也就是两个讯息可以杂凑出几乎相同的数值;其中162位元中有142位元相同。他们也发现了SHA-0的完整碰撞(相对于近似碰撞),将本来需要80次方的复杂度降低到62次方。

2004年8月12日,Joux, Carribault, Lemuet和Jalby宣布找到SHA-0算法的完整碰撞的方法,这是归纳Chabaud和Joux的攻击所完成的结果。发现一个完整碰撞只需要251的计算复杂度。他们使用的是一台有256颗Itanium2处理器的超级电脑,约耗80,000 CPU工时。

2004年8月17日,在CRYPTO 2004的Rump会议上,王小云,冯登国、来学嘉,和于红波宣布了攻击MD5、SHA-0 和其他杂凑函数的初步结果。他们攻击SHA-0的计算复杂度是2的40次方,这意味着他们的攻击成果比Joux还有其他人所做的更好。2005年二月,王小云和殷益群、于红波再度发表了对SHA-0破密的算法,可在2的39次方的计算复杂度内就找到碰撞。

2)SHA-1

SHA-1算法,主要是把160bit的信息摘要分成了A,B,C,D,E五段。

870512-20200617204917812-325511142.jpg



SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec。

SHA-1破解

鉴于SHA-0的破密成果,专家们建议那些计划利用SHA-1实作密码系统的人们也应重新考虑。在2004年CRYPTO会议结果公布之后,NIST即宣布他们将逐渐减少使用SHA-1,改以SHA-2取而代之。

2005年,Rijmen和Oswald发表了对SHA-1较弱版本(53次的加密循环而非80次)的攻击:在2的80次方的计算复杂度之内找到碰撞。

2005年二月,王小云、殷益群及于红波发表了对完整版SHA-1的攻击,只需少于2的69次方的计算复杂度,就能找到一组碰撞。

2005年8月17日的CRYPTO会议尾声中王小云、姚期智、姚储枫再度发表更有效率的SHA-1攻击法,能在2的63次方个计算复杂度内找到碰撞。

2006年的CRYPTO会议上,Christian Rechberger和Christophe De Cannière宣布他们能在容许攻击者决定部分原讯息的条件之下,找到SHA-1的一个碰撞。

3)SHA-2

SHA-2系列算法,核心过程把信息摘要分成了A,B,C,D,E,F,G,H八段。

870512-20200617204918360-1349644352.jpg

NIST发布了三个额外的SHA变体,这三个函数都将讯息对应到更长的讯息摘要。以它们的摘要长度(以位元计算)加在原名后面来命名:SHA-256,SHA-384和SHA-512。它们发布于2001年的FIPS PUB 180-2草稿中,随即通过审查和评论。包含SHA-1的FIPS PUB 180-2,于2002年以官方标准发布。2004年2月,发布了一次FIPS PUB 180-2的变更通知,加入了一个额外的变种SHA-224",这是为了符合双金钥3DES所需的金钥长度而定义。

其中SHA-256和SHA-512是杂凑函数,其中SHA-256每一段的摘要长度为32bit,SHA-512每一段摘要长度为64bit。它们分别使用了不同的偏移量,或用不同的常数,然而,实际上二者结构是相同的,只在循环执行的次数上有所差异。SHA-224以及SHA-384则是前述两种杂凑函数的截短版,利用不同的初始值做计算。

  • SHA-256:生成长度256bit的信息摘要;
  • SHA-224:生成长度224bit的信息摘要;
  • SHA-512:生成长度512bit的信息摘要;
  • SHA-384:生成长度384bit的信息摘要。


显然,信息摘要越长,发生碰撞的几率就越低,破解的难度就越大。但同时,耗费的性能和占用的空间也就越高。



算法中可以单独抽出的模块,包括常量的初始化、信息预处理、使用到的逻辑运算分别进行介绍。

(1)常量初始化
常量的作用是和数据源进行计算,增加数据的加密性。


以SHA256为例,SHA256算法中用到了8个哈希初值以及64个哈希常量,作为初始化的常量。

8个哈希初值=>自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前32bit


64个哈希常量=>自然数中前64个质数(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小数部分取前32bit


(2)信息预处理(pre-processing)

目的是让整个消息满足指定的结构,从而处理起来可以统一化,格式化。

信息的预处理分为两个步骤:附加填充比特和附加长度

  • 附加填充比特:


在报文末尾进行填充,使报文长度在对512取模以后的余数是448。填充是这样进行的:先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。

需要注意的是,信息必须进行填充,也就是说,即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512个比特。因此,填充是至少补一位,最多补512位。

例如:“abc”补位的过程。

    a,b,c对应的ASCII码分别是97,98,99,

    对应的二进制编码为:01100001 01100010 01100011;

    首先补一个“1” : 0110000101100010 01100011 1;

    然后补423个“0”:01100001 01100010 01100011 10000000 00000000 … 00000000;

    补位完成后的数据如下:

61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

  • 附加长度值:


附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面

SHA256用一个64位的数据来表示原始消息的长度。因此,通过SHA256计算的消息长度必须要小于$ 2^64 $,当然绝大多数情况这足够大了。

用上面的消息“abc”来操作,3个字符,占用24个bit,在进行了补长度的操作以后,整个消息就变成:

61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000018

注意上面的16进制表达的,后面18就是代表了占用了24个bit,16+8=24



(3)逻辑运算

对数据进行逻辑运算。

∧ => 按位“与”

¬ => 按位“补”

⊕ => 按位“异或”

Sn => 右移n个bit

Rn => 循环右移n个bit



SHA256散列函数中涉及的操作全部是逻辑的位运算。



(4)计算消息摘要

首先:将消息分解成512-bit大小的块.假设消息M可以被分解为n个块,于是整个算法需要做的就是完成n次迭代,n次迭代的结果就是最终的哈希值,即256bit的数字摘要。

一个256-bit的摘要的初始值H0,经过第一个数据块进行运算,得到H1,即完成了第一次迭代。

H1经过第二个数据块得到H2,……,依次处理,最后得到Hn,Hn即为最终的256-bit消息摘要

将每次迭代进行的映射用$ Map(H_{i-1}) = H_{i} $表示。

4)SHA3

NIST在2007年公开征集第三代哈希函数标准,举办了SHA-3竞赛。NIST一共征集到64个算法,经过三轮的激烈角逐,2012年,Keccak算法赢得了SHA-3竞赛的最终胜利,成为新一代的哈希标准算法SHA-3。


和AES一样,举办SHA-3公开选拔活动的依然是美国国家标准与技术研究院NIST。本次选拔出的单向散列函数同时成为了联邦信息处理标准FIPS 202。尽管这只是美国的国家标准,但实质上也将会被作为国际标准被全世界所认可。



[size=1.333]3.2.3.消息认证码

MAC(Message Authentication Code):是一种与密钥相关联的单向散列函数。消息认证码的输入包括任意长度的消息和一个发送者与接受者之间共享的密钥,它可以输出固定长度的数据。可以用它们在系统上或用户之间认证文件或消息,常见的是HMAC(用于消息认证的密钥散列算法)。

消息认证码是散列和密钥的有机结合。单独使用哈希值,攻击者中间截获数据对数据修改,然后重新计算哈希值,这样接收方是无法确认数据是否篡改的。将原始数据和密钥一起计算哈希值,由于密钥对于双方是各自存储,而攻击者没有,这个时候接收方获取数据后使用自己手里的秘钥加上数据计算哈希值,确保的数据的完整性的同时,保障没有被篡改。



870512-20200617204919038-1595035642.jpg



1)HMAC/Hash MAC

将对称密钥合并在消息后面,使用散列算法计算出后生成MAC值。MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384.HmacSHA512五种算法。

于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。

HMAC运算利用hash算法,以一个消息M和一个密钥K作为输入,生成一个定长的消息摘要作为输出。HMAC算法利用已有的Hash函数,关键问题是如何使用密钥。HMAC的密钥长度可以是任意大小,如果小于n(hash输出值的大小),那么将会消弱算法安全的强度。建议使用长度大于n的密钥,但是采用长度大的密钥并不意味着增强了函数的安全性。密钥应该是随机选取的,可以采用一种强伪随机发生器,并且密钥需要周期性更新,这样可以减少散列函数弱密钥的危险性以及已经暴露密钥所带来的破坏 。(有的是固定写入到对端的)

典型应用

HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下:

(1)先由客户端向服务器发出一个验证请求。

(2)服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。

(3)客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。

(4)与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。

2)CBC-MAC

CBC-MAC是最为广泛使用的消息认证算法之一,同时它也是一个ANSI标准(X9.17)。CBC-MAC实际上就是对消息使用CBC模式进行加密,取密文的最后一块作为认证码。使用对称分组密码对消息进行加密。

当取AES作为加密的分组密码时,称为基于AES的CBC-MAC,若需要产生认证码的消息为x,加密的AES密钥为k,则生成MAC的过程如下图所示。


3)CMAC

工作方式与CBC-MAC类似,基于更复杂的逻辑和数学函数。



[size=1.333]四种方式比较

870512-20200622121441735-975476304.jpg



4)MAC的缺陷

由于使用的是对称加密技术,在使用MAC之前,需要在发送者和接收者之间进行密钥K共享;

无法提供不可抵赖性(Non-Repudiation),因无法区分一条MAC消息是sender生成的还是receiver生成的,因为二者拥有的是相同的密钥。而公钥数字签名技术可提供不可抵赖性。



3.2.4.循环冗余校验
循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的计算机硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方法是由W. Wesley Peterson于1961年发表。




[size=1.333]3.2.5.SM3算法
SM3是中华人民共和国 政 府 采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。
在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当。


3.3.主要用途

密码加密:

密码存在数据库中以散列值存储,避免暴力破解、彩虹表攻击。当用户认证时,提交服务器密码,服务器使用计算出密码的散列值,与库里面的散列值进行比对以研制用户提交的密码的真实性。

由于仅使用密码会避免不了彩虹表攻击的风险,可以加入一些特定的值来进行计算哈希,和增加散列的迭代次数(迭代次数越多,对于进行计算散列值的时间就越长,同理破解难度就越大。伤敌三千,自损八百。)但随着计算机速度的提升,这种方式也只能增加破解的时间,不能完全避免这种风险。最好的方式仍是动态密钥或者使用数字证书的方式。

完整性校验:

发送方计算哈希值与数据一起发送对方,对方接受到数据后计算数据的哈希值进行对比,确认数据是否被篡改。一般我们在网上下载安装程序或一些开源软件都有一个md5值,就是这个作用。这种情况不能完全保证文件的完整性,若文件在中间被截获后,对文件进行修改,攻击者重新计算文件散列值,与修改后的文件一起发给接收方,这时候接收方无法预知这个时候文件是否被修改了,这个时候就用到了数字签名了。



[size=1.333]3.4.针对哈希算法的攻击



碰撞问题(生日攻击):基于同一种散列函数,如果有两个不同的消息,得到相同的消息摘要,则扰乱了散列函数应具备的规则,被称作碰撞(Collision)

碰撞对于哈希算法来说是极其危险的,因为碰撞允许两个文件产生相同的签名。当计算机检查签名时,即使该文件未真正签署,也会被计算机识别为有效的。




原像攻击:给定一个确定的哈希值,原像攻击旨在找到一个消息,使得该消息的哈希值与给定的哈希值相等;给定一个消息及其哈希值,第二原像攻击旨在找到另一个不同的消息,使得两者的哈希值相同。



暴力攻击:发现另一个消息具有同样的散列值,或者发现任何消息对具有相同的散列值。


密码分析


  • Side-Channel攻击是典型的密码分析的一个例子。攻击者不攻击算法而是算法的执行
  • 彩虹表是另一个密码分析的例子。防止彩虹表攻击的一个方法是“Salted Hash”




五、密码应用

密码学能提供机密性、完整性、不可抵赖性服务。

链路加密: 加密所有信息,包括用户信息、数据包头部、尾部、地址和路由信息

端到端加密:仅加密用户信息,不加密数据包头部、尾部、地址和路由信息

[size=1.333]1.常见应用协议

1)S/MIME(标准的邮件(多媒体邮件)安全协议)

  • 利用哈希算法和公钥与私钥的加密体系
  • 对发信人和收信人进行身份识别
  • 保证信件完整性和信件内容包括附件的机密性


2) PGP

  • 使用IDEA生成会话密钥
  • 基于RSA公钥加密体系


3) HTTPS

使用SSL 、TLS

4)SET

应用在电子支付

5)SSH

6)IPSec

使用IKE进行密钥交换,协商使用的DH算法,支持AH(协议号51)、ESP(协议号50)

两种工作模式:传输模式、隧道模式

[size=1.333]2.常见攻击

唯密文攻击:仅有密文,进行密码分析攻击

已知明文攻击:攻击者拥有一条或多条消息的明文和相对应的密文。例如某些文本有固定的格式、起始和结束语句。拥有明文和其对应的密文,进行密码分析攻击

选定明文攻击:攻击者选择特定明文发给受害者,待受害者加密此明文发送出去后,再截获之。不同于已知明文攻击在于输入可以由攻击者来选定。可以选择明文并得到输出的密文,进行密码分析攻击

选定密文攻击

差分密码攻击:查看对具有特定差异的明文进行加密并得到相应的密文,并分析这些差异的影响和结果。

线性密码分析:对使用相同密钥加密的几条不同消息执行已知明文攻击,再通过执行函数来确定使用分组算法的加密过程中利用某个特定密钥的最大概率。(研究分组规律)

旁路攻击:通过收集外部信息来分析密钥,例如收集CPU占用率、电磁辐射、总运算时间后,逆向分析运算过程来猜测密钥和算法。

重放攻击:捕获某些类型数据后重新提交它

代数攻击:分析算法内使用的数学原理中存在的弱点,并利用其内在的代数结构。

错误分析:强行引入一个错误,获得一个错误结果,然后与一个好的结果对比进而分析密钥和算法。

探测攻击:通过连接加密模块的电路,来访问和操纵其中的数据获取来获取信息。(硬件破解)

攻击随机数生成器:RNG所产生的随机数如果可预测,攻击者就能够猜测到用于构成初始向量的随机数。(猜测初始向量)

临时文件:大多数的密码系统使用临时文件来执行计算,如果这些文件没有被删除或复写,可能会泄露信息给攻击者。

分析式攻击、统计式攻击、社会工程攻击、中间相遇攻击、频率分析、逆向工程



特别声明:

1.以上所有描述内容部分参考链接/文献未逐一列出,若有侵权,请及时告知,有则改之无则加勉。

2.以上仅是学习过程的总结,相信有很多理解偏差的地方,特别希望指出,给予帮助,更新知识体系,共同进步。




上一篇:安全工程之物理安全
下一篇:电力工程施工安全管控措施
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明
icitu.com 信息谷-icit软硬件产品营销与行业智慧化解决方案实施供需对接空间,信息人家园-信息人之间互助互惠互利的资源整合空间,icit人团结起来帮助人们沟通与建设,icit unite to help people communicating&constructing。
0512-68181818
关注我们
  • 访问移动手机版
  • 官方微信公众号

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc. 优康设计 ( 苏ICP备10066271号-2 )|网站地图