SHA-256算法中,使用64个4字节整型常量。这些常量表示前64个质数立方根小数部分的前32位。

要取立方根小数部分,需要了解double类型(8字节==64位)的内存布局,对应标准IEEE 754,以下为double类型64位从高到低的解释

  • 1 bit 符号位 S
  • 11 bit 阶码位 E
  • 52 bit 小数位 M

转为十进制的公式:

(−1)S×2E−1023×[1+∑i=152(Mi×2−i)](-1)^S \times 2^{E-1023} \times [1+\sum_{i=1}^{52}(M_i \times 2^{-i}) ] (−1)S×2E−1023×[1+i=1∑52​(Mi​×2−i)]

以质数2为例,它的小数部分如下:

0.259921049894873≈4×16−1+2×16−2+8×16−3+...0.259921049894873 \approx 4 \times 16 ^{-1} + 2 \times 16 ^{-2} + 8 \times 16 ^{-3} + ... 0.259921049894873≈4×16−1+2×16−2+8×16−3+...

对应的十六进制为0x428a2f98。

需要注意的则是阶码部分,转换为十进值是乘以2的次方,反过来则是除以2的次方(右移)。

C

#include <stdio.h>
#include <math.h>
int main(int argc, char* argv[])
{int arrPrimeNum[80] = {0};int i = 0, j = 0;double dNum = 0;char bFlag = 0;int nCountPrime = 0;int nNum = 1;unsigned int nTmp = 0;long long int llNum = 0;while (80 != nCountPrime){nNum += 1;bFlag |= 1;j = sqrt(nNum);for (i = 2; i <= j; ++i){if (nNum % i == 0){bFlag &= 0;break;}}if (bFlag){arrPrimeNum[nCountPrime++] = nNum;}}for (i = 0; i < nCountPrime; ++i){dNum = exp(log(arrPrimeNum[i]) / 3);llNum = *(long long*)&dNum;/*IEEE 754fractional part: 0-51 from left to rightSHA-256 need 32-bit word>> (52-4*8) == 20SHA-512 need 64-bit wordBig integer library is needed to implementeg. arrPrimeNum[0] == 2step code == b01111111111-1023 == 0shift right (20 - 0)0 01111111111 01000010 10001010 00101111 10011000 11010111 00101000 101101000010 10001010 00101111 10011000arrPrimeNum[4] == 11step code == b10000000000-1023 == 1shift right (20 - 1)0 10000000000 00011100 10101011 01100001 00101101 11111001 10100100 01100011100 10101011 01100001 00101101 1*/nTmp = 20 - (((llNum >> 52) & 0x7FF) - 0x3FF );printf("0x%08llx, ", (llNum >> nTmp) & 0xFFFFFFFF);if ((i + 1) % 8 == 0){printf("\n");}}getchar();return 0;
}

python

上面用c语言生成了sha-256的4字节常数序列,而sha-512的常数序列与之类似,使用80个8字节整型常量,这些常量表示前80个质数立方根小数部分的前64位。

小数部分取64位,就不能利用double类型实现了,因为double类型一共就64位,根据IEEE 754,小数部分只有52位。所以需要借助大数库来生成sha-512的常数序列,这里借助gmpy库来实现。

import gmpy2
from gmpy2 import mpfr, floor, next_prime
def convert_primes_cube_fractional_part_to_hex_constant(prime, hex_chars=8):"""Note if you want the first 8 decimal (base=10) digits of a number,you multiply the fractional part by 10**8 and then look at the integer part In this case we want first 8 hex digits, so multiply fractional part by 16**8and then look at integer part (and return in hexadecimal)."""cube_root = mpfr(prime)**(1/mpfr(3))frac_part = cube_root - floor(cube_root)# format_str = '%%0%dx' % hex_chars  # format_str will be '%08x' if hex_chars=8 so always emits # 8 zero-padded hex digits # return format_str % floor(frac_part*(16**hex_chars))strRet = "{0:1a}".format(floor(frac_part*(16**hex_chars)))# 0xc.19bf174p+28strRet = strRet[2:]strRet = strRet.replace(".","")# c19bf174p+28strRet = strRet[:strRet.index("p+")]# c19bf174while(len(strRet) < 8):strRet = "0" + strRetreturn strRet;def generate_n_primes(n=64):p = 2i = 0while i < n:yield pp = next_prime(p)i += 1# SHA-256 constants
# for i,p in enumerate(generate_n_primes(64)):
#     if i % 8 == 0:
#         print("")
#     print(convert_primes_cube_fractional_part_to_hex_constant(p, hex_chars=8), end=" ")# SHA-512 constants
gmpy2.get_context().precision=100
for i,p in enumerate(generate_n_primes(80)):if i % 4 == 0:print("")print(convert_primes_cube_fractional_part_to_hex_constant(p, hex_chars=16), end=" ")

参考资料

https://crypto.stackexchange.com/questions/41496/how-to-generate-the-sha-2-constants

如何生成SHA2常数序列相关推荐

  1. 【数字信号处理】序列表示与运算 ( 序列乘以常数 | 序列相加 | 序列移位 | 序列尺度变换 )

    文章目录 一.序列表示 二.序列运算 1.序列乘以常数 2.序列相加 3.序列移位 4.序列尺度变换 一.序列表示 任何序列 , 都可以使用 若干 加权延时 单位脉冲序列 的 线性组合 表示 ; x( ...

  2. matlab生成实指数序列、matlab茎状图

    生成实指数序列:注意是 .^: 画一下图,以星号展示: stem(Y) 将数据序列Y从x轴到数据值按照茎状形式画出,以圆圈终止: 如果Y是一个矩阵,则将其 每一列按照分隔方式画出:

  3. IJCAI 2018:中科院计算所:增强对话生成一致性的序列到序列模型

    IJCAI 2018:中科院计算所:增强对话生成一致性的序列到序列模型 文章来源:企鹅号 - 读芯术 你和"懂AI"之间,只差了一篇论文 号外!又一拨顶会论文干货来袭! 2018年 ...

  4. python生成正态分布随机数_python 生成呈正态分布序列

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明.股市波动是不可预知的,但是股票的涨幅概率却呈现了正态分布的特点, 那么python如何生成呈正态分布 ...

  5. Pandas 生成随机整数序列

    首先使用np.random生成随机数,然后变成dataframe 即可 import pandas as pd import numpy as npdf1 = pd.DataFrame(np.rand ...

  6. Sql Server常用命令整理篇:生成连续日期序列并循环

    1.生成日期序列 特别注意:经验证number不能超过2048,超过部分不可用 --生成日期序列,特别注意,经验证number不能超过2048,超过部分不可用 select observedate s ...

  7. 深度学习 —— 使用RNN-RBM建模和生成复调音乐序列

    RNN-RBM RNN-RBM是一个能量基础模型,用于时间序列的密度估计,其中向量在时间戳可位于高维度.可用于描述多峰条件分布,其中是时间的序列历史,通过一些列条件RBM(每个时间戳一个),参数依赖于 ...

  8. [MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit

    前言:         同事的业务场景是,按照cid.author分组,再按照id倒叙,取出前2条记录出来.         oracle里面可以通过row_number() OVER (PARTIT ...

  9. matlab怎么生成阶跃序列,signal processing--matlab-3(单位阶跃序列)

    下面来做一个单元阶跃序列的例子: matlab的程序如下: 先定义函数: function [x,n]=LST_2_1_b(n0,n1,n2) n=[n1:n2]; x=[(n-n0)>=0]; ...

最新文章

  1. 不使用powerdesigner手工绘制用例图例题详解
  2. HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义...
  3. Linux 获取设备树源文件(DTS)里描述的资源
  4. 你真的做好数字化运营了吗?来直播间,给你加点儿“灵感”丨教育专题
  5. 【caffe-Windows】cifar实例编译之model的使用
  6. LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)
  7. Expression Template(表达式模板,ET)
  8. android蓝牙串口arduino源码,android – Arduino:使用串口和软件串口与蓝牙模块
  9. bzoj 3357: [Usaco2004]等差数列(DP+map)
  10. 5点击换gif_小米10最酷截图,只需三步,打造视频带壳+GIF动图
  11. 【leetcode】链表题(python)
  12. 多媒体计算机技术特性,多媒体计算机技术东师20春在线作业2资料
  13. cisco思科交换机命令参考大全
  14. Vue 开发环境搭建步骤
  15. 现在主流的(大多数人用的)3DMAX是哪个版本?
  16. 网络文化经营许可证这样办,省时又便捷!
  17. 七月上(歌词背后的故事)
  18. 限流的抖音号怎么养?养号方法是什么?
  19. Pycharm远程连接服务器(windows下远程修改服务器代码)
  20. 基于BIM+3DGIS物联网技术,如是实现智慧园区(楼宇)可视化管控平台的?

热门文章

  1. How the System Finds and Loads Drivers
  2. pip 安装 nexmo
  3. 第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer
  4. moment.js 中文API
  5. [论文阅读笔记12]An Effective Transition-based Model for Discontinuous NER
  6. 去除百度推广等广告的插件神器
  7. 【内存】UDIMM、RDIMM、SODIMM以及LRDIMM的区别
  8. kindle paperwhite3 android,Kindle Paperwhite3入手20天感受
  9. 分享在实际项目中积累的硬件调试经验 - 调试方法,以及常见调试案例
  10. 智能配时、图片识别…AI为你的春运保驾护航!