SHA1

整理于互动百科

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。

  • 12术语和概念
  • 23SHA1算法描述

SHA1 - 2 术语和概念

2.1位(Bit),字节(Byte)和字(Word)

  SHA1始终把消息当成一个位(bit)字符串来处理。本文中,一个字(Word)是32位,而一个字节(Byte)是8位。比如,字符串“abc”可以被转换成一个位字符串:01100001 01100010 01100011。它也可以被表示成16进制字符串: 0x616263.

2.2 运算符和符号

  下面的逻辑运算符都被运用于“字”(Word)

  X^Y = X, Y逻辑与

  X \/ Y = X, Y逻辑或

  X XOR Y= X, Y逻辑异或

  ~X = 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.

  逻辑左移位操作符Sn(X)。X是一个字,n是一个整数,0<=n<=32。Sn(X) = (X<<n)OR(X>>32-n)

 X<<n定义如下:抛弃最左边的n位数字,将各个位依次向左移动n位,然后用0填补右边的n位(最后结果还是32位)。X>>n是抛弃右边的n位,将各个位依次向右移动n位,然后在左边的n位填0。因此可以叫Sn(X)位循环移位运算

SHA1 - 3 SHA1算法描述

  在SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串。SHA1算法只接受位作为输入。假设我们对字符串“abc”产生消息摘要。首先,我们将它转换成位字符串如下:

  01100001 01100010 01100011

  ―――――――――――――

  ‘a’=97 ‘b’=98 ‘c’=99

  这个位字符串的长度为24。下面我们需要5个步骤来计算消息摘要MAC。

3.1 补位

  消息必须进行补位,以使其长度在对512取模以后的余数是448。也就是说,(补位后的消息长度)%512 = 448。即使长度已经满足对512取模后余数是448,补位也必须要进行。

  补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448。总而言之,补位是至少补一位,最多补512位。还是以前面的“abc”为例显示补位的过程。

  原始信息: 01100001 01100010 01100011

  补位第一步:01100001 01100010 01100011 1

  首先补一个“1”

  补位第二步:01100001 01100010 01100011 10…..0

  然后补423个“0”

  我们可以把最后补位完成后的数据用16进制写成下面的样子

  61626380 00000000 00000000 00000000

  00000000 00000000 00000000 00000000

  00000000 00000000 00000000 00000000

  00000000 00000000

  现在,数据的长度是448了,我们可以进行下一步操作。

3.2 补长度

  所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。在进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式)

  61626380 00000000 00000000 00000000

  00000000 00000000 00000000 00000000

  00000000 00000000 00000000 00000000

  00000000 00000000 00000000 00000018

  如果原始的消息长度超过了512,我们需要将它补成512的倍数。然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。

3.3 使用的常量

  一系列的常量字K(0), K(1), ... , K(79),如果以16进制给出。它们如下:

  Kt = 0x5A827999 (0 <= t <= 19)

  Kt = 0x6ED9EBA1 (20 <= t <= 39)

  Kt = 0x8F1BBCDC (40 <= t <= 59)

  Kt = 0xCA62C1D6 (60 <= t <= 79).

3.4 需要使用的函数

  在SHA1中我们需要一系列的函数。每个函数ft (0 <= t <= 79)都操作32位字B,C,D并且产生32位字作为输出。ft(B,C,D)可以如下定义

  ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)

  ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)

  ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)

  ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).

3.5 计算消息摘要

  必须使用进行了补位和补长度后的消息来计算消息摘要。计算需要两个缓冲区,每个都由5个32位的字组成,还需要一个80个32位字的缓冲区。第一个5个字的缓冲区被标识为A,B,C,D,E。第二个5个字的缓冲区被标识为H0, H1, H2, H3, H4

  。80个字的缓冲区被标识为W0, W1,..., W79

  另外还需要一个一个字的TEMP缓冲区。

  为了产生消息摘要,在第4部分中定义的16个字的数据块M1, M2,..., Mn

  会依次进行处理,处理每个数据块Mi 包含80个步骤。

  在处理每个数据块之前,缓冲区{Hi} 被初始化为下面的值(16进制)

  H0 = 0x67452301

  H1 = 0xEFCDAB89

  H2 = 0x98BADCFE

  H3 = 0x10325476

  H4 = 0xC3D2E1F0.

  现在开始处理M1, M2, ... , Mn。为了处理 Mi,需要进行下面的步骤

  (1). 将 Mi 分成 16 个字 W0, W1, ... , W15, W0 是最左边的字

  (2). 对于 t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16).

  (3). 令 A = H0, B = H1, C = H2, D = H3, E = H4.

  (4) 对于 t = 0 到 79,执行下面的循环

  TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;

  E = D; D = C; C = S30(B); B = A; A = TEMP;

  (5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.

  在处理完所有的 Mn, 后,消息摘要是一个160位的字符串,以下面的顺序标识

  H0 H1 H2 H3 H4.

  对于SHA256,SHA384,SHA512。你也可以用相似的办法来计算消息摘要。对消息进行补位的算法完全是一样的

时间: 2024-11-06 07:08:05

SHA1的相关文章

Swift调用sha1算法

在Swift中通过调用OC的CommonCrypto库可以很方便的实现String字符串转换为sha1. 在一个swift项目中,需要使用桥接头文件(Bridging header)的方式来引入一个OC库,才能调用OC中的内容. 本文也将作为Swift项目中如何调用Objective-C代码的一个介绍. 标准实现步骤 1.新建一个Objective-C  m文件 2.点击Next,输入文件名(这个文件后面可以删掉),选择保存位置,默认直接确定即可,保存在当前项目目录,然后Xcode会自动提示我们

字符串以及文件的hashlib的md5和sha1等的运用

hashlib的md5和sha1等的运用 import hashlib print(hashlib.algorithms_available) print(hashlib.algorithms_guaranteed) #MD5 import hashlib hash_object = hashlib.md5(b'Hello World') print(hash_object.hexdigest()) # import hashlib mystring = input('Enter String

SHA-1算法

SHA-1.h #ifndef _SHA1_H #define _SHA1_H #include<iostream> using namespace std; //4个函数 #define f1(B,C,D) ((B&C)|((~B)&D)) #define f2(B,C,D) (B^C^D) #define f3(B,C,D) ((B&C)|(B&D)|(C&D)) #define f4(B,C,D) (B^C^D) typedef unsigned

iOS:Objective-c的MD5/SHA1加密算法的实现

介绍: Objective-c实现MD5和SHA1算法相对还是比较简单的,可以直接调用系统的C/C++共享库来实现调用MD5即Message Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一SHA即Secure Hash Algorithm(安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数. 链接:http://m.111cn.net/art-53370.htm

Android Studio 获取 sha1、MD5签名

APP开发过程中使用百度地图 API , 申请 KEY 的时候需要开发者提供SHA1 证书指纹数据,  用Eclipse 可以直接查看,但是 Android Studio却不能,这个时候我们需要以下几步操作既可: 1.打开java SDK安装路径中的bin文件夹,如:C:\Program Files\Java\jdk1.8.0_31\bin: 2.在文件夹路径输入cmd快捷打开"运行,然后输入 keytool -list -v -keystore c:\users\your_user_name你

[原]Android Studio查询SHA1的方法

前提:C:\Users\Administrator\AndroidStudioProjects文件夹中存在xxx.jks秘钥文件,比如: 进入Android Studio的Terminal: Microsoft Windows [版本 6.1.7600] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\Administrator\AndroidStudioProjects\HelloTrace>keytool -v -list -keys

Android Studio中获取SHA1或MD5的方法

原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studio的Tools->Open Terminal... 第二步.输入命令:keytool -v -list -keystore keystore.jks [一定要记得加上 -v 参数,不然只能看到SHA1,没有MD5][keystore.jks,需要替换为你自己的密钥所在路径和文件名]

boost.sha1

#include <boost/uuid/sha1.hpp> #include <iostream> /* @brief SHA1摘要算法:一种很重要的密码学算法,可将任意长度的文本压缩成20个字节的 独一无二的的摘要(uuid名字生成器使用该算法) */ using namespace boost::uuids::detail; using namespace std; int main() { sha1 sha; // 声明摘要对象 char* szMsg = "Th

python之模块hashlib(提供了常见的摘要算法,如MD5,SHA1等等)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块hashlib(提供了常见的摘要算法,如MD5,SHA1等等) #http://www.cnblogs.com/BeginMan/p/3328172.html #以常见的摘要算法MD5为例,计算出一个字符串的MD5值 import hashlib m = hashlib.md5() #创建hash对象 m.update('xiaodeng') #更新哈希对象以字符串参数 print m.

AES,SHA1,DES,RSA,MD5区别

AES:更快,兼容设备,安全级别高: SHA1:公钥后处理回传 DES:本地数据,安全级别低 RSA:非对称加密,有公钥和私钥 MD5:防篡改 相关: 公开密钥加密(英语:public-key cryptography,又译为公开密钥加密),也称为非对称加密(asymmetric cryptography),一种密码学算法类型,在这种密码学方法中,需要一对密钥,一个是私人密钥,另一个则是公开密钥.这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密.如果知道了其中一