SHA1

算法 · 03-21 · 116 人浏览

一、原理

以下算法分析基于 RFC 3174。

Request For Comments (RFC),所有关于Internet 的正式标准都是以RFC(Request for Comment )文档出版。需要注意的是,还有大量的RFC文档都不是正式的标准,出版目的都是为了提供信息。
由互联网协会(Internet Society,简称ISOC)赞助发行,会交到互联网工程工作小组(IETF)和互联网结构委员会(IAB)。文档可由网站 https://www.ietf.org/ 下载。

SHA1原理

全称为 Secure Hash Algorithm 1(安全散列算法1)。是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。1993年 发布 SHA0,1995年发布了SHA1。其设计原理相似于MIT教授 Ronald L. Rivest 所设计的密码学散列算法 MD4 和 MD5。
SHA1 可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。
SHA实际上是一系列算法的统称,分别包括:SHA-1、SHA-224、SHA-256、SHA-384以及SHA-512。

类别 消息长度 分组长度 计算字长 计算步骤 消息摘要长度
SHA-1 小于2^64位 512 32 80 160
SHA-224 小于2^64位 512 32 64 224
SHA-256 小于2^64位 512 32 64 256
SHA-384 小于2^128位 1024 64 80 384
SHA-512 小于2^128位 1024 64 80 512

安全性

  2005年二月,王小云、殷益群及于红波发表了对完整版SHA-1的攻击,只需少于269的计算复杂度,就能找到一组碰撞。(利用生日攻击法找到碰撞需要280的计算复杂度。)
  2017年2月23日,CWI Amsterdam与Google宣布了一个成功的SHA-1碰撞攻击,发布了两份内容不同但SHA-1散列值相同的PDF文件作为概念证明。

实现原理

  When amessage of any length < 2^64 bits is input, the SHA-1 produces a 160-bit output called a message digest. (SHA-1算法输入报文的最大长度不超过2^64位,产生的输出是一个160位的报文摘要。)根据算法文档,算法的实现主要由以下几部分来组成。

1.RFC3174 中的第二部分,给出了一些术语,总结一下也就下面三点:

  • SHA-1算法把输入消息当做比特位字符串来处理
  • 输入是按 512 位(16个字)的分组进行处理的
  • 等于32位字符串,可以表示为8个十六进制数字的序列。(A word equals a 32-bit string which may be represented as a sequence of 8 hex digits. )
    2.RFC3174 中的第三部分,给出了一些对于的基本运算,总结一下:
  • 按位逻辑字操作

    • X AND Y = bitwise logical “and” of X and Y.
    • X OR Y = bitwise logical “inclusive-or” of X and Y.
    • X XOR Y = bitwise logical “exclusive-or” of X and Y.
    • NOT X = bitwise logical “complement” of X.
  • X+Y定义如下:字 X 和 Y 代表两个整数 x 和y, 其中 0 <= x < 2^32 且 0 <= y < 2^32. 令整数z = (x + y) mod 2^32. 这时候 0 <= z < 2^32。将z转换成字Z,那么就是 Z = X + Y。
  • 循环左移位操作符 S^n(X)。X是一个字,n是一个整数,0<=n<=32。S^n(X) = (X << n) OR (X >> 32-n)。X << n定义如下:抛弃最左边的n位数字,将各个位依次向左移动n位,然后用0填补右边的n位(最后结果还是32位)。X>>n是抛弃右边的n位,将各个位依次向右移动n位,然后在左边的n位填0。因此可以叫S^n(X)位循环右移位运算。

3.RFC3174 中的第四部分,介绍了消息填充
  前面说了,SHA-1算法是以512一包来处理消息的,但是很多情况下,消息长度并不是512的整数倍,这个时候就需要对原始消息进行填充。

(1)补位
原始消息必须进行补位,以使其长度在对512取模以后的余数是448。也就是说,(补位后的消息长度)%512 = 448。即使长度已经满足对512取模后余数是448,补位也必须要进行。
补位是这样进行的:先补一个1,然后再补0 ,直到长度满足对512取模后余数是448。总而言之,补位是至少补一位,最多补512位。
(2)补长度
就是将原始数据的长度补到已经进行了补位操作的消息后面。通常用两个字(64位)来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。

4.RFC3174 中的第五部分,给出了算法使用的各种函数和常量 。

  • 在SHA-1中使用了一系列逻辑函数f(0),f(1),…,f(79)。 每个f(t),0 <= t <= 79,对三个32位字B,C,D进行操作,并产生一个32位字作为输出。 f(t; B,C,D)定义如下:
  • f(t;B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19)
  • f(t;B,C,D) = B XOR C XOR D (20 <= t <= 39)
  • f(t;B,C,D) = (B AND C) OR (B AND D) OR (C AND D) (40 <= t <= 59)
  • f(t;B,C,D) = B XOR C XOR D (60 <= t <= 79).

在SHA-1中使用一系列常数字K(0),K(1),…,K(79)。定义如下:

  • K(t) = 5A827999 ( 0 <= t <= 19)
  • K(t) = 6ED9EBA1 (20 <= t <= 39)
  • K(t) = 8F1BBCDC (40 <= t <= 59)
  • K(t) = CA62C1D6 (60 <= t <= 79).

5.RFC3174 中的第六部分,给出了算法具体实现方法 。
经过前面的准备,接下来就是计算信息摘要了。SHA1有4轮运算,每一轮包括20个步骤,一共80步,最终产生160位的信息摘要,这160位的摘要存放在5个32位的链接变量中。
在SHA1的4论运算中,虽然进行的就具体操作函数不同,但逻辑过程却是一致的。首先,定义5个变量,假设为H0、H1、H2、H3、H4,对其分别进行如下操作:

(A)将A左移5为与 函数的结果求和,再与对应的子明文分组、E以及计算常数求和后的结果赋予H0。
(B)将A的值赋予H1。
(C)将B左移30位,并赋予H2。
(D)将C的值赋予H3。
(E)将D的值赋予H4。
(F)最后将H0、H1、H2、H3、H4的值分别赋予A、B、C、D

二、加密实现

python实现加密代码如下:

import hashlib  
sha1 = hashlib.sha1()  
data = '2333333'  
sha1.update(data.encode('utf-8'))  
sha1_data = sha1.hexdigest()  
print(sha1_data)
python 算法 加密 算法实现 解密 SHA
Theme Jasmine by Kent Liao