SHA算法原理

一、SHA1算法简介


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


        SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。


二、术语和概念


1.位(Bit),字节(Byte)和字(Word)


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


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算法描述


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


        首先,我们将它转换成位字符串如下:

        01100001 01100010 01100011  

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

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

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


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了,我们可以进行下一步操作。


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.使用的常量


        一系列的常量字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). 


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).


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


转自:http://blog.csdn.net/liguangzhenghi/article/details/7204295

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据库]---mysql 插入sql之 INSERT INTO和INSERT IGNORE INTO和REPLACE INTO和ON DUPLICATE KEY UPDATE比较应用

mysql插入一条数据方式有四种,接下来逐个说明验证: 前提: 有一个表,作为本次测试: CREATE TABLE zs_test (id int(11) NOT NULL AUTO_INCREMENT,order_id int(11) DEFAULT NULL,name varchar(255) DEFAULT NULL,PRIMARY KEY (id),UNIQUE KEY order_id_index (order_id) ) EN…

DES加密算法原理

一、DES算法理论 本世纪五十年代以来&#xff0c;密码学研究领域出现了最具代表性的两大成就。其中之一就是1971年美国学者塔奇曼 &#xff08;Tuchman&#xff09;和麦耶&#xff08;Meyer&#xff09;根据信息论创始人香农&#xff08;Shannon&#xff09;提出的「多重加密有…

[python]---从java到python(01)---基础与入门上手

前言 我本是java派的,已经有几年了,直接也接触过其他语言,比如从最早的汇编语言到高级语言始祖的C; 但是近来越发觉得python很火,现在以我的视角开始写入门python基础,算是入坑了; 我的计划是这个系列要更契合那些有java基础的同胞们,用你们已有的java基础,用对比的方式,更快的…

AES加密算法原理

一、摘要 AES&#xff08;The Advanced Encryption Standard&#xff09;是美国国家标准与技术研究所用于加密电子数据的规范&#xff0c;在2002年5月26日建立。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。AES 是一个新的可以用于保护电子数据的加密算法…

java获取本机ipv4,并使用Google Guava 缓存

java写个util,获取本机ip,并使用Google Guava 缓存起来 四个方法: 获取本机ipv4ip转16进制16进制转ip校验ip 首先,Google Guava使用的maven配置 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version&g…

OpenSSL库概述

一、背景技术SSL是Secure Sockets Layer&#xff08;安全套接层协议&#xff09;的缩写&#xff0c;可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时&#xff0c;提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户…

短信微信等消息发送系统的架构设计

消息发送系统 项目中的一种做法,简化总结如下 1.对外暴露接口1,供业务方调用 2.接口2的实现就是同步发送各种消息,比如发短信,发微信等,但不保证 3.对外暴露接口2,供业务方调用 4.接口2内部实现,也是发送消息,但是是通过mq解耦的 4.1.业务方调用接口2后,接口2的实现将会发送一…

大数运算库简介

一、技术背景在网络安全技术领域中各种加密解密算法的软件实现上始终有一个共同的问题就是如何在普通的 PC 机上实现大数的运算。我们日常生活中所应用的 PC 机内部字长多是32 位或 64 位&#xff0c;但是在各种加密解密的算法中为了达到一定的安全强度&#xff0c;都是要求在1…

内存溢出,频繁full gc 处理思路

内存溢出,频繁full gc 处理思路 1.导出整个JVM 中内存信息 jmap -dump:formatb,file文件名 [pid] 2.分析dump文件的两种方式: 2.1. jdk安装目录下,bin目录下,jvisualvm.exe双击打开 文件–装入–选择dump出来的文件 就可以开始分析了2.2. 使用eclipse,安装插件mat(MemoryAn…

Base64编码解码原理

一. Base64编码由来 为什么会有Base64编码呢&#xff1f;因为有些网络传送渠道并不支持所有的字节&#xff0c;例如传统的邮件只支持可见字符的传送&#xff0c;像ASCII码的控制字符就不能通过邮件传送。这样用途就受到了很大的限制&#xff0c;比如图片二进制流的每个字节不可…

eclipse mat 打开dump文件,明明大小1G,打开后却只有不到100M.其他的去哪了

eclipse mat 打开dump文件,明明大小1G,打开后却只有不到100M.其他的去哪了 Used heap dump 显示的大小远小于dump文件大小 解决: window-->Preferences-->memory Analuzer-->勾选keep unreachable objects-->apply and close

MVP模式介绍

一、概述MVP 是从经典的模式MVC演变而来&#xff0c;它们的基本思想有相通的地方&#xff1a;Controller/Presenter负责逻辑的处理&#xff0c;Model提供数据&#xff0c;View负责显示。二、MVC和MVP的区别作为一种新的模式&#xff0c;MVP与MVC有着一个重大的区别&#xff1a;…

eclipse mat 分析dump文件,打开文件报错,out of memeory

eclipse mat 分析dump文件,打开文件报错,out of memeory 解决: 1.打开eclipse报out of memeory通用 window-->Preferences-->java-->installed JREs-->选中-->edit--> 在default VM arguments栏中加入:-server -Xms4096m -Xmx4096m -XX:PermSize512m -XX:M…

VIPER模式介绍

一、概述VIPER模式的理念不属于MV(X)系类&#xff0c;其理念来自于建筑设计。建筑领域流行这样一句话&#xff0c;“我们虽然在营造建筑&#xff0c;但建筑也会重新塑造我们”。正如所有开发者最终领悟到的&#xff0c;这句话同样适用于构建软件。编写代码中至关重要的是&#…

mysql索引(b+tree)小记

索引:快速检索的数据结构,缺点是插入时要创建索引树,所以索引不能太多 1.hash O(1) 时间复杂度低 有冲突,不支持范围查询,不支持排序 2.二叉树BST 平衡树:O(logn) 缺点:当树不平衡时,相对于没有索引 3.红黑数 相对二叉树,相对平衡 插入逐渐增大时,也会有右倾,也不是很平衡…

强制消除Xcode警告的方法

比如我已经知道某行会报警告了&#xff0c;但是代码有这么写的道理&#xff0c;实在不想看到警告&#xff0c;可以用下面这个宏把这几行代码包住&#xff0c;就可以消除警告了。#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wunused-variable"/…

springMVC 源码级别总结原理,DispatcherServlet核心方法

前言 springMVC自我总结 本次maven: <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.…

SQLite3中的数据类型

一、概述 大多数的数据库引擎&#xff08;到现在据我们所知的除了sqlite的每个sql数据库引擎&#xff09;都使用静态的、刚性的类型&#xff0c;使用静态类型&#xff0c;数据的类型就由它的容器决定&#xff0c;这个容器是这个指被存放的特定列。 Sqlite使用一个更一般的动态类…

一个java工程师必知的安全意识(信息传输篇)

我们在遇到涉及用户密码&#xff0c;用户联系方式&#xff0c;身份证信息等敏感字段的时候&#xff0c;一般的处理方式是&#xff1a; 1.传输使用密文&#xff0c;拒绝明文传输用户密码&#xff0c;推荐明文加盐加密&#xff0c;后台再解密 比如要传输的明文是123456的明文密…

关于iOS7里的JavaScriptCore framework

在iOS7沸沸扬扬的扁平化论战之外&#xff0c;WWDC 2013还是公布了很多让开发者小兴奋的点&#xff0c;其中包括多任务加强支持background fetch和transfer&#xff0c;近场通信的AirDrop和p2p&#xff0c;以及游戏控制器和游戏中心的加强&#xff1b;当然还包括了让web开发同学…