目录

消息填充

消息分割与扩展

SHA的四轮运算


本来不太理解SHA算法怎么存储、运算,查阅资料后发现,SHA-1算法中不会出现对单个比特位的操作,都是以字节/四个字节为单位的,所以我调用bitset类更方便的存储运算。

#define CSLeft(x,n) (((x)<<(n))|((x)>>(32-(n))))
#define CSRight(x,n) (((x)>>(n))|((x)<<(32-(n))))
#define trans(x) (x.to_ulong())

消息填充

sha-1算法处理:输入以512比特数据块为处理单位。

已知公式:  (L是原始消息长度,1是填充位1,k是填充0的个数)

其余64位为原始L位消息长度的二进制表示

我首先定义了 typedef bitset<8> byte; 来表示一个比特8位二进制。原因是我的输入的消息为字符串plain,按asc-128位的存储方式,一个字符需要8位二进制来存储,即一个字符一个byte,输入时最多不超过56个字节

56*8=448比特,所以我们最多需要两个比特来存储长度(一个字节最多表示255位长度)。

//消息填充
void MessFill(string plain,int len,byte m[]){char temp;//存入每一个字符的asc码for(int i=0;i<len;i++){temp = plain[i];m[i] = temp;}for(int i=0;i<64;i++){cout << trans(m[i]) << "\t";}cout << endl;//添加填充位1m[len] = 128;for(int i=0;i<64;i++){cout << trans(m[i]) << "\t";}cout << endl;//添加长度int numlen = len*8;if(numlen >= 255){m[62] = numlen-255;m[63] = 255;}else{m[63] = numlen;}for(int i=0;i<64;i++){cout << trans(m[i]) << "\t";}cout << endl;
}

消息分割与扩展

512位的明文被划分为16个明文分组,每组32位。然后将16份子明文分组扩展为80份。

我定义了 typedef bitset<32> word;以此代表32位比特的分组。

//消息分割与扩展
void MessDivi(byte m[],word w[]){int t;for(t=0;t<16;t++){w[t] |= CSLeft(trans(m[4*t]),24);w[t] |= CSLeft(trans(m[4*t+1]),16);w[t] |= CSLeft(trans(m[4*t+2]),8);w[t] |= trans(m[4*t+3]);}for(t=16;t<80;t++){w[t] = CSLeft(w[t-3]^w[t-8]^w[t-14]^w[t-16],1);}cout << endl;
}

SHA的四轮运算

(1)首先设置初始散列值

word A = 0x67452301;
word B = 0xEFCDAB89;
word C = 0x98BADCFE;
word D = 0x10325476;
word E = 0xC3D2E1F0;

(2)运算准备

在bitset类中,是未定义+-*等运算法则的,我经过尝试发现sha算法实现的过程中需要很多的+运算,因此重载了运算符+

word operator+(word a,word b){word c;int t=0;//进位for(int i=0;i<32;i++){if(a[i]==0 && b[i]==0){if(t == 0){c[i] = 0;}else{c[i] = 1;}t = 0;}else if(a[i]==1 && b[i]==1){if(t == 0){c[i] = 0;}else{c[i] = 1;}t = 1;}else{if(t == 0){c[i] = 1;}else{c[i] = 0;}}}return c;
}

其次,在SHA四轮运算中,每一轮20个步骤,一共执行80步。这80步中,每一步都相同,但每一步使用的Kt,Ft不同,Kt,Ft根据轮数划分成四个阶段,所以SHA的运算分为四轮。

因此,准备代码如下:

//ft、kt
word ft(word b,word c,word d,int t){if(t>=0 && t<=19){return ((b&c)|((~b)&d));}else if(t>=20 && t<=39){return (b^c^d);}else if(t>=40 && t<=59){return ((b&c)|(b&d)|(c&d));}else if(t>=60 && t<=79){return (b^c^d);}
}
word kt(int t){if(t>=0 && t<=19){return 0x5A827999;}else if(t>=20 && t<=39){return 0x6ED9EBA1;}else if(t>=40 && t<=59){return 0x8F1BBCDC;}else if(t>=60 && t<=79){return 0xCA62C1D6;}
}

(3)SHA算法的整体流程

整个流程就很简单啦,不要忘了最后还要加上原始变量。A,B,C,D,E即为160位杂凑码。

void SHA(string plain,int len){byte m[64];MessFill(plain,len,m);word w[80];MessDivi(m,w);word temp,A1=A,B1=B,C1=C,D1=D,E1=E;for(int i=0;i<80;i++){temp = CSLeft(A1,5) + ft(B1,C1,D1,i) + E1 + w[i] + kt(i);E1 = D1;D1 = C1;C1 = CSLeft(B1,30);B1 = A1;A1 = temp;}A = A1+A;B = B1+B;C = C1+C;D = D1+D;E = E1+E;
}

SHA算法的C++实现相关推荐

  1. Java加密与解密的艺术~SHA算法实现

    MesssageDigest类也支持SHA算法,主要包含SHA-1.SHA-256.SHA-384和SHA-512四种算法.通过第三方加密组件包Bouncy Castle,可支持SHA-224算法. ...

  2. sha算法 哈希算法_SHA1哈希算法教程及其用法示例

    sha算法 哈希算法 SHA1 is a hash algorithm that is created by the National Security Agency (NSA). SHA1 hash ...

  3. Java 实现sha_Java实现SHA算法的方法详解

    本文实例讲述了Java实现SHA算法的方法.分享给大家供大家参考,具体如下: 一 简介 安全散列算法 固定长度摘要信息 二 SHA算法 SHA-1.SHA-2(SHA-224.SHA-256.SHA3 ...

  4. 密码学系列之:NIST和SHA算法

    文章目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. ...

  5. 消息摘要算法-SHA算法实现

    简述 SHA算法分为一代和二代,这个是美国安全局发布的一系列的密码散列算法. 基于如下两点安全理由: 1.从消息摘要反推输入信息,从计算理论上来说很困难 2.想找到两组不同的消息对应到相应的消息摘要, ...

  6. 奇妙的安全旅行之SHA算法

    hi,大家好,今天我们开始介绍消息摘要算法中的SHA(Secure Hash Algorithm)安全散列算法.由于其他曾被广泛使用的Hash算法,比如上一篇文章提到的MD5,后来都被发现存在一定的安 ...

  7. SHA算法原理与常用实现

    看本文前,最好先看看之前的这一篇关于MD5算法的介绍. MD5算法原理与常用实现 本文目录 定义 MD5和SHA-1的碰撞问题 常见应用场景 1.类似MD5的应用场景 2.比特币 3.https签名算 ...

  8. SHA算法描述及实现

    SHA 算法的原理及实现 章节目录 简介 算法描述 2.1 数据准备 2.1.1 <数据填充 2.1.2 数据分块 2.1.3 设置初始 Hash 值 2.2 Hash 计算 2.2.1 SHA ...

  9. SHA算法Java实现

    一 简介 安全散列算法 固定长度摘要信息 二 SHA算法 SHA-1.SHA-2(SHA-224.SHA-256.SHA384.SHA-512) 三 SHA算法实现 package com.imooc ...

最新文章

  1. 网站推广——对于网站推广公司来说应如何帮助企业实现网站优化?
  2. C++多态,虚函数,纯虚函数
  3. Eclipse快捷键大全,导包快捷键:ctrl+Shift+/【转】
  4. jpa 查询 列表_终极JPA查询和技巧列表–第2部分
  5. [think]需求从来就没变过,变的是我们对需求的理解
  6. CANOpen定时器
  7. python递归函数对照表_python-访问递归函数中附加到列表的值
  8. nvm管理node版本
  9. Linux安装MySQL-MariaDB版本
  10. GIS游程编码两种方法
  11. 横河涡街流量计安装参数说明及要求
  12. SecureCRT 终端仿真程序 v7.0.0.326 中文绿色便携破解版
  13. 主板怎么开启csm_电脑无法识别M.2固态硬盘BIOS开启CSM设置方法
  14. Scc Puzzle
  15. vue使用html2canvas截取div内容生成海报~ vue生成海报
  16. Android 开发摆脱数据线 - Android studio 无线调试App
  17. 计算机新生导论感言,大学生感言与寄语新生
  18. 在基于Windows系统的PHP虚拟主机上实现域名的301永久重定向
  19. Ckfinder+2.1+Ckeditor+3.6.2+配置详解(.NET)
  20. Flask框架——数据库操作命令(增删改查)

热门文章

  1. StringEscapeUtils.escapeHtml的具体使用
  2. 计算机软件盗版经济问题,计算机软件盗版的法律规制
  3. 【2019.06.16】Django + 微信小程序 实现微信小程序1——小程序基本信息,开发规范
  4. java导出word表格
  5. deepin 使用问题记录
  6. 『深度概念』一文读懂Octave Convolution(OctConv)八度卷积
  7. 上海哪里学python_小白学python_上海房价知多少
  8. 【Sonar】Sonar理论篇
  9. linux brctl 网桥配置
  10. img标签的src使用base64显示图片