文章目录

  • SHA-256算法
    • 算法简介
    • 功能实现
    • 全部代码
    • 实验结果

SHA-256算法

算法简介

  • 对于长度小于2^64位的消息,SHA256会产生一个160位的消息摘要。
  • 当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。
  • 在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
  • 是对SHA1函数的扩展

功能实现

  • 加密文件
  • 加密字符串
  • 检验哈希值

全部代码

# -*-coding:utf-8-*-
"""
File Name: SHA-256算法.pyProgram IDE: PyCharmCreate Time: 2021-10-04 14:13Create By Author: 陆依依"""# 检验正确性
import hashlib      # 字符串转为2进制
def Encode(string):return ''.join([(8 - len(bin(ord(s)).replace('0b', ''))) * '0' + bin(ord(s)).replace('0b', '') for s in string])# 填充消息
def Padding(message):# 将字节转为字符message = ''.join([chr(message[i]) for i in range(len(message))])l = len(message) * 8 % 512if l + 1 > 448:k = 512 - (l + 1 - 448)else:k = 448 - l - 1a = bin(len(message) * 8).replace('0b', '')b = '0' * (64 - len(a)) + ac = ''for i in range(0, 64, 8):           # 后64bitc = c + chr(int(b[i: i+8], 2))message = message + chr(128) + chr(0) * int(k / 8) + creturn message# 循环右移t位
def ROTR(t, num):temp = (32 - len(bin(num).replace('0b', ''))) * '0' + bin(num).replace('0b', '')return int(temp[32-t:] + temp[:32-t], 2)# 右移t位
def SHR(t, num):temp = (32 - len(bin(num).replace('0b', ''))) * '0' + bin(num).replace('0b', '')return int(temp[:32-t], 2)# 逻辑函数
def FF(t, x, y=0, z=0):if t == 1:return (x & y) ^ (~x & z)elif t == 2:return (x & y) ^ (x & z) ^ (y & z)elif t == 3:return ROTR(2, x) ^ ROTR(13, x) ^ ROTR(22, x)elif t == 4:return ROTR(6, x) ^ ROTR(11, x) ^ ROTR(25, x)elif t == 5:return ROTR(7, x) ^ ROTR(18, x) ^ SHR(3, x)elif t == 6:return ROTR(17, x) ^ ROTR(19, x) ^ SHR(10, x)# 加密
def Encrypt(message):message = Padding(message)# 初始化变量H0 = int('6A09E667', 16)H1 = int('BB67AE85', 16)H2 = int('3C6EF372', 16)H3 = int('A54FF53A', 16)H4 = int('510E527F', 16)H5 = int('9B05688C', 16)H6 = int('1F83D9AB', 16)H7 = int('5BE0CD19', 16)# 常量K = [int('428a2f98', 16), int('71374491', 16), int('b5c0fbcf', 16), int('e9b5dba5', 16),int('3956c25b', 16), int('59f111f1', 16), int('923f82a4', 16), int('ab1c5ed5', 16),int('d807aa98', 16), int('12835b01', 16), int('243185be', 16), int('550c7dc3', 16),int('72be5d74', 16), int('80deb1fe', 16), int('9bdc06a7', 16), int('c19bf174', 16),int('e49b69c1', 16), int('efbe4786', 16), int('0fc19dc6', 16), int('240ca1cc', 16),int('2de92c6f', 16), int('4a7484aa', 16), int('5cb0a9dc', 16), int('76f988da', 16),int('983e5152', 16), int('a831c66d', 16), int('b00327c8', 16), int('bf597fc7', 16),int('c6e00bf3', 16), int('d5a79147', 16), int('06ca6351', 16), int('14292967', 16),int('27b70a85', 16), int('2e1b2138', 16), int('4d2c6dfc', 16), int('53380d13', 16),int('650a7354', 16), int('766a0abb', 16), int('81c2c92e', 16), int('92722c85', 16),int('a2bfe8a1', 16), int('a81a664b', 16), int('c24b8b70', 16), int('c76c51a3', 16),int('d192e819', 16), int('d6990624', 16), int('f40e3585', 16), int('106aa070', 16),int('19a4c116', 16), int('1e376c08', 16), int('2748774c', 16), int('34b0bcb5', 16),int('391c0cb3', 16), int('4ed8aa4a', 16), int('5b9cca4f', 16), int('682e6ff3', 16),int('748f82ee', 16), int('78a5636f', 16), int('84c87814', 16), int('8cc70208', 16),int('90befffa', 16), int('a4506ceb', 16), int('bef9a3f7', 16), int('c67178f2', 16)]# 分块处理for i in range(0, len(message), 64):temp = Encode(message[i:i + 64])W = [int(temp[j:j + 32], 2) for j in range(0, 512, 32)]for j in range(16, 64):W.append((FF(6, W[j-2]) + W[j-7] + FF(5, W[j-15]) + W[j-16]) % (2**32))# 寄存器A = H0B = H1C = H2D = H3E = H4F = H5G = H6H = H7for j in range(0, 64):T1 = (H + FF(4, E) + FF(1, E, F, G) + K[j] + W[j]) % (2**32)T2 = (FF(3, A) + FF(2, A, B, C)) % (2**32)H = GG = FF = EE = (D + T1) % (2**32)D = CC = BB = AA = (T1 + T2) % (2**32)H0 = (H0 + A) % (2**32)H1 = (H1 + B) % (2**32)H2 = (H2 + C) % (2**32)H3 = (H3 + D) % (2**32)H4 = (H4 + E) % (2**32)H5 = (H5 + F) % (2**32)H6 = (H6 + G) % (2**32)H7 = (H7 + H) % (2**32)return str((8 - len(str(hex(H0)).replace('0x', ''))) * '0' + str(hex(H0)).replace('0x', '') +(8 - len(str(hex(H1)).replace('0x', ''))) * '0' + str(hex(H1)).replace('0x', '') +(8 - len(str(hex(H2)).replace('0x', ''))) * '0' + str(hex(H2)).replace('0x', '') +(8 - len(str(hex(H3)).replace('0x', ''))) * '0' + str(hex(H3)).replace('0x', '') +(8 - len(str(hex(H4)).replace('0x', ''))) * '0' + str(hex(H4)).replace('0x', '') +(8 - len(str(hex(H5)).replace('0x', ''))) * '0' + str(hex(H5)).replace('0x', '') +(8 - len(str(hex(H6)).replace('0x', ''))) * '0' + str(hex(H6)).replace('0x', '') +(8 - len(str(hex(H7)).replace('0x', ''))) * '0' + str(hex(H7)).replace('0x', ''))# demo
if __name__ == "__main__":while(True):path = ''     # 默认文件路径choose = int(input('请选择加密对象:1)文件  2)非文件\t'))if choose == 2:message = input('请输入待加密内容:').encode('utf-8')else:path = input('请输入完整文件路径:')message = open(path, 'rb').readlines()temp = message[0]for i in range(1, len(message)):temp = temp + message[i]message = tempprint('手动实现:' + Encrypt(message))print('调库检验:' + hashlib.sha256(message).hexdigest())print('hash是否相等?\t' + str(hashlib.sha256(message).hexdigest() == Encrypt(message)))

实验结果

SHA-256哈希函数实现相关推荐

  1. 哈希算法(哈希函数)的基本使用

    哈希算法(哈希函数)的基本使用 什么是哈希? 哈希的原理和特点 数组与哈希表 哈希函数 哈希函数的冲突与碰撞 哈希算法 哈希的应用 什么是哈希? 如果我们需要誊抄一本新华字典,那么有什么方法呢?比如当 ...

  2. SHA 256算法是什么?哈希算法有哪些特点,主要应用在哪里?

    无论数字证书品牌.价格和类型如何,所有SSL证书的通用规范是采用SHA 256算法,您可以在证书详细信息或产品信息中列出的功能中看到.对于非技术人员来说,SHA 256 算法通常是个谜,但是锐成信息将 ...

  3. Hash+哈希+哈希函数

    Hash+哈希+哈希函数 hash == 散列 == 哈希 是一种有损压缩技术 是一种数字指纹技术 哈希是一种加密算法 哈希函数(Hash Function),也称为散列函数或杂凑函数.哈希函数是一个 ...

  4. 单向散列函数-指纹-哈希函数

    单向散列函数-指纹-哈希函数 1. 什么是单向散列函数 2.单向散列函数的性质 2.1. 根据任意长度的消息计算出固定长度的散列值 2.2. 能够快速计算出散列值 2.3. 消息不同散列值也不同 2. ...

  5. Go-哈希函数与消息认证详解(含代码)

    目录 哈希函数 简介 历史 特性 安全性 MD族 md4 md5 SHA系列 SHA-1 SHA-2 消息认证 消息认证的目的 消息认证码 认证码与检错码 HMAC的Go实现 crypto/hmac包 ...

  6. “中国诺贝尔奖”首位女得主王小云:哈希函数是区块链的起源性技术,区块链已扩展到供应链金融等多领域...

    "哈希函数.数字签名算法.加密算法是密码学三类基础算法,其中哈希函数是起源性技术." 本文旨在传递更多市场信息,不构成任何投资建议. 火星财经APP(微信:hxcj24h)一线报道 ...

  7. Hash(哈希)相关知识(哈希函数、哈希查找)

    Hash(哈希)相关知识 前言 一. 哈希函数 1. 函数特性 1.1 基本的哈希函数 1.2 加密的哈希函数 2. 常见的哈希函数构造法 2.1 直接寻址法 2.2 数字分析法 2.3 平方取中法 ...

  8. 哈希函数的原理及应用

    哈希(Hash)函数又称为散列函数.杂凑函数.它是一种单向密码体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程. 哈希函数可以将满足要求的任意长度的输入经过变换后得到固定长度的输出.这 ...

  9. php 整数转换为32 位,PHP哈希函数返回一个整数(32位int)(PHP hashing function that returns an integer (32bit int))...

    PHP哈希函数返回一个整数(32位int)(PHP hashing function that returns an integer (32bit int)) 目标是使用INT(不是BIGINT或ME ...

  10. 哈希表 哈希函数 时间_您需要了解的哈希函数

    哈希表 哈希函数 时间 安全从业人员的功能表中有一个工具可以帮助每个人理解,无论他们对计算机进行什么操作:加密哈希函数. 这听起来听起来像是神秘的,技术性的,甚至可能很无聊,但是我对什么是哈希以及它们 ...

最新文章

  1. 8.6 多元高斯分布模型-机器学习笔记-斯坦福吴恩达教授
  2. 创业互联网公司如何搭建自己的技术架构
  3. tp5,thinkphp5,隐藏index.php,隐藏入口文件
  4. richtextbox自动滚动到最下面_软网app:滚动截图将超长网页“一网打尽”
  5. 利用冒泡排序法实现select option按中文排序组件
  6. 课后作业-阅读任务-阅读笔记-2
  7. 云中台技术架构_为什么开放基础架构在云中很重要
  8. 找回WordPress登录密码的方法
  9. android 虚拟wifi定位,基于Android手机的WiFi定位系统设计
  10. html强制使用雅黑字体,网页中使用微软雅黑字体(css调用微软雅黑)
  11. 【Java 并发编程】Java 创建线程池的正确姿势: Executors 和 ThreadPoolExecutor 详解...
  12. eclipse配置tomcat9.0
  13. A micro Lie theory for state estimation in robotics002
  14. Jetson Xavier NX系统安装至 nvme 硬盘
  15. 三相全控tc787触发电路_开关电源常用的几种保护电路
  16. 网站丨这四个网站好像有点好玩
  17. MiniUI Api 方法
  18. GET/POST 和TCP/UDP 区别
  19. Resize a VMWare disk (zz)
  20. 中国移动利润减少超过百亿,5G网络建设进度不如4G网络

热门文章

  1. 网络工程师提高篇 | 路由重发布你了解多少?从原理到配置,瑞哥带你学习一波!
  2. 使用SQLPLUS创建用户名和表空间
  3. linux chown sh,chown命令示例
  4. 第十届极客大挑战——复现未解决的web和RE
  5. 计算机辅助物理化学实验 唐典勇课后答案,计算机辅助物理化学实验(第2版)...
  6. SQL实战(2)——国庆期间每类视频点赞量和转发量
  7. 华为CE系列和S系列交换机堆叠配置及mad检测
  8. 一文看懂传统服务器、云服务器和虚拟主机之间的区别
  9. /proc/sysrq-trigger
  10. 史上非常简单、快速的解决Excel导出遇到Excel导出错误