整理于互动百科

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

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。你也可以用相似的办法来计算消息摘要。对消息进行补位的算法完全是一样的

SHA1的更多相关文章

  1. 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值

    一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...

  2. SHA-1算法

    SHA-1.h #ifndef _SHA1_H #define _SHA1_H #include<iostream> using namespace std; //4个函数 #define ...

  3. 密码学应用(DES,AES, MD5, SHA1, RSA, Salt, Pkcs8)

    目录 一.数据加密标准 - Data Encryption Standard(DES) 二.高级加密标准 - Advanced Encryption Standard(AES) 三.消息摘要算法第五版 ...

  4. 下载时,经常看见ASC、MD5、SHA1等,是干什么的呢?

    一 进行文件一致性校验 为了确保你得到的文件是正确的版本,而没有被注入病毒和木马程序.例如我们经常在网上下载软件,而这些软件已经被注入了一些广告和病毒等,如果不进行文件与原始发布商的一致性校验的话,可 ...

  5. sha1散列(C语言)

    /** * \file sha1.h * * \brief SHA-1 cryptographic hash function * * Copyright (C) 2006-2010, Brainsp ...

  6. Js中 md5 sha1 base64 加密

    js的3中加密方式: .sha1加密,加密性高 调用: var sha = hex_sha1(str); .base64加密 调用: var b = new Base64(); var str = b ...

  7. 微信测试服务器验证sha1加密法,工具类

    1 package org.fc.Util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExcep ...

  8. Android Studio中获取SHA1或MD5的方法

    原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studi ...

  9. android studio和eclipse中如何获取sha1值

    首先如果是eclipse的话, 直接打开eclipse开发工具 那么接下来问题来了,现在很多开发者都已经从es转型到as开发工具了, 在android studio上没有直接提供这个GUI界面让我们去 ...

  10. C#:Md5和Sha1两种加密方式

    1.新建控制台应用程序 2.新建类 EncryptHelper.cs public static class EncryptHelper { /// <summary> /// 基于Md5 ...

随机推荐

  1. java中拼写xml

    本文为博主原创,未经博主允许,不得转载: xml具有强大的功能,在很多地方都会用的到.比如在通信的时候,通过xml进行消息的发送和交互. 在项目中有很多拼写xml的地方,进行一个简单的总结. 先举例如 ...

  2. The way to Go(3): 安装Go环境

    Reference: Github: Go Github: The way to Go 在mac上安装Go语言初体验 安装Go环境 Go 语言开发团队开发了适用于以下操作系统的编译器: Linux F ...

  3. Ubuntu 14.04 删除软件附加依赖

    参考:FlowVisor的学习笔记 eg.mininet $ sudo apt-get remove mininet $ sudo apt-get remove --auto-remove minin ...

  4. 2018/7/18Bad English

    1 So instead of enjoying anime because it can portray interesting stories in a form that would be im ...

  5. ros 使用python代码启动launch文件

    在开发中我们经常会遇到使用python代码启动launch文件这样的问题.一般的做法是使用subprocess调用roslaunch.但是这种方法使用起来并不方便.要涉及到自己去控制进程的状态.由于r ...

  6. PHP获取固定概率

    public static function getFixRand($weight) { if ((int)$weight < 0 || (int)$weight > 100) { ret ...

  7. java数组声明和变式--record1

    ​ java声明数组方式: String[] namelist; int numlist[];//此声明为动态声明,不能指定长度,numlist[10] 静态声明的方式: int a[]={1,2,3 ...

  8. Hashtable、HashMap、TreeMap心得

    三者均实现了Map接口,存储的内容是基于key-value的键值对映射,一个映射不能有重复的键,一个键最多只能映射一个值. (1) 元素特性 HashTable中的key.value都不能为null; ...

  9. 《剑指offer》第三十七题(序列化二叉树)

    // 面试题37:序列化二叉树 // 题目:请实现两个函数,分别用来序列化和反序列化二叉树. #include "BinaryTree.h" #include <iostre ...

  10. iOS开发中各种关键字的区别

    1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atom ...