数字签名MD4、MD5

2023-10-29

在本文中:

  • 模二加,记为 ⨁ \bigoplus :是二进制位的异或操作。如1模二加1和0模二加1都等于0;1模二加0等于1;
  • 模 2 32 加 模2^{32}加 232,计为 + + +:意思是普通加法的结果再进行 模 2 32 加 模2^{32}加 232计算。
    模 2 4 加 模2^4加 24. 若,a = 14,b=15,(+)表示 模 2 4 加 模2^4加 24
    则, a ( + ) b = ( a + b )    m o d    2 4 = ( 14 + 15 ) m o d 16 = 29    m o d    16 = 13 a(+)b=(a+b)\;mod \;2^4 = (14+15)mod 16 = 29\;mod\;16=13 a(+)b=(a+b)mod24=(14+15)mod16=29mod16=13

Hash函数

密码学中的Hash函数是将任意长度的消息压缩到某一固定长度的消息摘要的单向函数。它主要用于数字签名和消息的完整性检测。

  • 经过hash函数之后的值不可以再恢复成原来的消息;
  • 且任意两个不同的消息不可能得到相同的hash值。
  • 进入hash函数之前,变更一个字节会导致其hash值较之前截然不同。

MD4

MD5是在MD4的基础上进行更改的,所以二者思想和算法相似。

总 体 步 骤 : \color{blue}总体步骤:

  • 数字填充,将输入的数据填充为512位的倍数。
  • 分组处理,每512位(64字节)位一组,按组进行处理。
  • 处理结束后便得到128位的结果。

1 、 数 字 填 充 : \color{blue}1、数字填充: 1

该步骤仅作用在最后一组不满512位的那一组。

  • 在左边填充1
  • 之后一直补k个0,使得(n+1+k) ≡ \equiv 448 m o d mod mod 512
  • 最后追加64位的整数,其内容是数据所占的比特数的大小。
    在这里插入图片描述

2 、 分 组 处 理 : \color{blue}2、分组处理: 2

  • 把每一个分组X(64个字节)分为16个子分块 x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]x[15](每个有4个字节)
  • x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]x[15] 依次同四个寄存器A.B.C.D进行三轮不同的运算。(A、B、C、D都有初始值。)
    即, x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]x[15]先和ABCD进行第一轮运算,(一轮刚好有16个运算,对应着16个子分块x,以下类似。)
    之后, x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]x[15]再与ABCD进行第二轮运算,
    最后, x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]x[15]与ABCD进行第三轮运算。
  • 每一轮有16个运算,使得 x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]x[15]每个参加一次运算。
  • 每一个运算又分为4步。(F函数、与子分块模 2 32 2^{32} 232加、与常数k模 2 32 2^{32} 232加、循环左移)

下图表示每一轮中每一次的运算过程。
在这里插入图片描述
上图中,
F函数每一轮会有所不同。
“数据子分块”会随着16次运算的不同,取到 x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]x[15]
常量k每一轮也会不同。
循环左移操作,每一轮都有他自己的规则。
简 单 讲 , 每 一 轮 中 的 每 一 次 运 算 都 不 相 同 。 简单讲,每一轮中的每一次运算都不相同。
在 图 中 也 可 以 注 意 到 , 将 运 算 后 的 值 给 了 下 一 次 的 B , 原 B 给 了 C , 原 D 给 了 A 。 \color{red}在图中也可以注意到,将运算后的值给了下一次的B,原B给了C,原D给了A。 BBCDA

a) F函数:

第一轮: f ( X , Y , Z ) = ( X ⋀ Y ) ⋁ ( X ‾ ⋀ Z )    f(X,Y,Z)=(X\bigwedge Y) \bigvee(\overline{X}\bigwedge Z)\; f(X,Y,Z)=(XY)(XZ) (注: X ‾ \overline{X} X表示X的补。)
第二轮: g ( X , Y , Z ) = ( X ⋀ Y ) ⋁ ( X ⋀ Z ) ⋁ ( Y ⋀ Z )    g(X,Y,Z)=(X\bigwedge Y) \bigvee(X\bigwedge Z)\bigvee(Y\bigwedge Z)\; g(X,Y,Z)=(XY)(XZ)(YZ)
第三轮: h ( X , Y , Z ) = X ⨁ Y ⨁ Z    h(X,Y,Z)=X\bigoplus Y\bigoplus Z\; h(X,Y,Z)=XYZ (注:“ ⨁ \bigoplus ”为模二加操作)

b) 与子分块相加:(模 2 32 2^{32} 232加)

每一轮的子分块参加运算的顺序都不相同。

c) 与常数k(16进制)相加:(模 2 32 2^{32} 232加)

第一轮:0
第二轮:5A827999
第三轮:6ED9EDA1

d) 循环左移:

第一轮:第一次运算左移3位,第二次运算左移7位,第三次运算左移11位,第四次运算左移19位,第五次运算同第一次运算一样左移3位,依次往复循环。
第二轮:以左移3、5、9、13进行循环
第三轮:以3、9、11、15循环左移

A、B、C、D的初始值

A:67452301 (4byte)
B:EFCDAB89 (4byte)
C:98BADCFE (4byte)
D:10325476 (4byte)

                                 先 介 绍 生 成 流 程 , 3 轮 的 16 次 运 算 放 在 最 后 面 给 出 。 \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\color{gray}先介绍生成流程,3轮的16次运算放在最后面给出。 316

3 、 得 到 128 b i t 的 输 出 : \color{blue}3、得到128bit的输出: 3128bit

经过3轮最终得到的A、B、C、D与初值A、B、C、D分别进行 模 2 32 加 模2^{32}加 232运算后,将得到的结果进行合并,就得到了最终的128位(16字节)。

MD5

MD5和MD4的核心思想和算法都是一样的,二者的主要区别在于:

  1. 增加第四轮F函数,为: I ( X 、 Y 、 Z ) = ( X ⋁ Z ‾ ) ⨁ Y    I(X、Y、Z)=(X\bigvee {\overline{Z}})\bigoplus Y\; I(XYZ)=(XZ)Y (注: X ‾ \overline{X} X表示X的补。)
  2. 第二轮F函数由 g ( X , Y , Z ) = ( X ⋀ Y ) ⋁ ( X ⋀ Z ) ⋁ ( Y ⋀ Z ) g(X,Y,Z)=(X\bigwedge Y) \bigvee(X\bigwedge Z)\bigvee(Y\bigwedge Z) g(X,Y,Z)=(XY)(XZ)(YZ) 变为 g ( X , Y , Z ) = ( X ⋀ Y ) ⋁ ( Y ⋀ Z ‾ ) g(X,Y,Z)=(X\bigwedge Y) \bigvee(Y\bigwedge \overline{Z}) g(X,Y,Z)=(XY)(YZ)
  3. 第二、三轮的子分块 x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]x[15]的次序被改变
  4. 第一轮的移位数发生改变
  5. 每一步都有一个唯一的加法常量k(16步有16个)
  6. 每一步都要加上上一步的结果

总结

在这里插入图片描述

最后的最后,给出MD4的3轮16次运算过程

第一轮:
  • A = ( A + f ( B , C , D ) + x [ 0 ] ) < < 3 A=(A+f(B,C,D)+x_{[0]})<<3 A=(A+f(B,C,D)+x[0])<<3

解释:
初始    A    \;A\; A与经过经过第一轮    F 函 数    \;F函数\; F    B , C , D    \;B,C,D\; B,C,D进行    模 2 32 加 \;模2^{32}加 232
得到的结果再与数据子分块 x [ 0 ] x_{[0]} x[0]进行    模 2 32 加 \;模2^{32}加 232
得到的结果再向左移动    3    \;3\; 3位,
将最终得到的结果作为    A    \;A\; A进行下一次运算。

  • D = ( D + f ( A , B , C ) + x [ 1 ] ) < < 7 D=(D+f(A,B,C)+x_{[1]})<<7 D=(D+f(A,B,C)+x[1])<<7
  • C = ( D + f ( D , A , B ) + x [ 2 ] ) < < 17 C=(D+f(D,A,B)+x_{[2]})<<17 C=(D+f(D,A,B)+x[2])<<17
  • B = ( B + f ( C , D , A ) + x [ 3 ] ) < < 19    B=(B+f(C,D,A)+x_{[3]})<<19\\\; B=(B+f(C,D,A)+x[3])<<19
  • A = ( A + f ( B , C , D ) + x [ 4 ] ) < < 3 A=(A+f(B,C,D)+x_{[4]})<<3 A=(A+f(B,C,D)+x[4])<<3
  • D = ( D + f ( A , B , C ) + x [ 5 ] ) < < 7 D=(D+f(A,B,C)+x_{[5]})<<7 D=(D+f(A,B,C)+x[5])<<7
  • C = ( D + f ( D , A , B ) + x [ 6 ] ) < < 17 C=(D+f(D,A,B)+x_{[6]})<<17 C=(D+f(D,A,B)+x[6])<<17
  • B = ( B + f ( C , D , A ) + x [ 7 ] ) < < 19    B=(B+f(C,D,A)+x_{[7]})<<19\\\; B=(B+f(C,D,A)+x[7])<<19
  • A = ( A + f ( B , C , D ) + x [ 8 ] ) < < 3 A=(A+f(B,C,D)+x_{[8]})<<3 A=(A+f(B,C,D)+x[8])<<3
  • D = ( D + f ( A , B , C ) + x [ 9 ] ) < < 7 D=(D+f(A,B,C)+x_{[9]})<<7 D=(D+f(A,B,C)+x[9])<<7
  • C = ( D + f ( D , A , B ) + x [ 10 ] ) < < 17 C=(D+f(D,A,B)+x_{[10]})<<17 C=(D+f(D,A,B)+x[10])<<17
  • B = ( B + f ( C , D , A ) + x [ 11 ] ) < < 19    B=(B+f(C,D,A)+x_{[11]})<<19\\\; B=(B+f(C,D,A)+x[11])<<19
  • A = ( A + f ( B , C , D ) + x [ 12 ] ) < < 3 A=(A+f(B,C,D)+x_{[12]})<<3 A=(A+f(B,C,D)+x[12])<<3
  • D = ( D + f ( A , B , C ) + x [ 13 ] ) < < 7 D=(D+f(A,B,C)+x_{[13]})<<7 D=(D+f(A,B,C)+x[13])<<7
  • C = ( D + f ( D , A , B ) + x [ 14 ] ) < < 17 C=(D+f(D,A,B)+x_{[14]})<<17 C=(D+f(D,A,B)+x[14])<<17
  • B = ( B + f ( C , D , A ) + x [ 15 ] ) < < 19    B=(B+f(C,D,A)+x_{[15]})<<19\\\; B=(B+f(C,D,A)+x[15])<<19
第二轮:
  • A = ( A + g ( B , C , D ) + x [ 0 ] + 5 A 827999 ) < < 3 A=(A+g(B,C,D)+x_{[0]}+5A827999)<<3 A=(A+g(B,C,D)+x[0]+5A827999)<<3

  • D = ( D + g ( A , B , C ) + x [ 4 ] + 5 A 827999 ) < < 5 D=(D+g(A,B,C)+x_{[4]}+5A827999)<<5 D=(D+g(A,B,C)+x[4]+5A827999)<<5

  • C = ( C + g ( D , A , B ) + x [ 8 ] + 5 A 827999 ) < < 9 C=(C+g(D,A,B)+x_{[8]}+5A827999)<<9 C=(C+g(D,A,B)+x[8]+5A827999)<<9

  • B = ( B + g ( C , D , A ) + x [ 12 ] + 5 A 827999 ) < < 13    B=(B+g(C,D,A)+x_{[12]}+5A827999)<<13\\\; B=(B+g(C,D,A)+x[12]+5A827999)<<13

  • A = ( A + g ( B , C , D ) + x [ 1 ] + 5 A 827999 ) < < 3 A=(A+g(B,C,D)+x_{[1]}+5A827999)<<3 A=(A+g(B,C,D)+x[1]+5A827999)<<3

  • D = ( D + g ( A , B , C ) + x [ 5 ] + 5 A 827999 ) < < 5 D=(D+g(A,B,C)+x_{[5]}+5A827999)<<5 D=(D+g(A,B,C)+x[5]+5A827999)<<5

  • C = ( C + g ( D , A , B ) + x [ 9 ] + 5 A 827999 ) < < 9 C=(C+g(D,A,B)+x_{[9]}+5A827999)<<9 C=(C+g(D,A,B)+x[9]+5A827999)<<9

  • B = ( B + g ( C , D , A ) + x [ 13 ] + 5 A 827999 ) < < 13    B=(B+g(C,D,A)+x_{[13]}+5A827999)<<13\\\; B=(B+g(C,D,A)+x[13]+5A827999)<<13

  • A = ( A + g ( B , C , D ) + x [ 2 ] + 5 A 827999 ) < < 3 A=(A+g(B,C,D)+x_{[2]}+5A827999)<<3 A=(A+g(B,C,D)+x[2]+5A827999)<<3

  • D = ( D + g ( A , B , C ) + x [ 6 ] + 5 A 827999 ) < < 5 D=(D+g(A,B,C)+x_{[6]}+5A827999)<<5 D=(D+g(A,B,C)+x[6]+5A827999)<<5

  • C = ( C + g ( D , A , B ) + x [ 10 ] + 5 A 827999 ) < < 9 C=(C+g(D,A,B)+x_{[10]}+5A827999)<<9 C=(C+g(D,A,B)+x[10]+5A827999)<<9

  • B = ( B + g ( C , D , A ) + x [ 14 ] + 5 A 827999 ) < < 13    B=(B+g(C,D,A)+x_{[14]}+5A827999)<<13\\\; B=(B+g(C,D,A)+x[14]+5A827999)<<13

  • A = ( A + g ( B , C , D ) + x [ 3 ] + 5 A 827999 ) < < 3 A=(A+g(B,C,D)+x_{[3]}+5A827999)<<3 A=(A+g(B,C,D)+x[3]+5A827999)<<3

  • D = ( D + g ( A , B , C ) + x [ 7 ] + 5 A 827999 ) < < 5 D=(D+g(A,B,C)+x_{[7]}+5A827999)<<5 D=(D+g(A,B,C)+x[7]+5A827999)<<5

  • C = ( C + g ( D , A , B ) + x [ 11 ] + 5 A 827999 ) < < 9 C=(C+g(D,A,B)+x_{[11]}+5A827999)<<9 C=(C+g(D,A,B)+x[11]+5A827999)<<9

  • B = ( B + g ( C , D , A ) + x [ 15 ] + 5 A 827999 ) < < 13    B=(B+g(C,D,A)+x_{[15]}+5A827999)<<13\\\; B=(B+g(C,D,A)+x[15]+5A827999)<<13

第三轮:
  • A = ( A + h ( B , C , D ) + x [ 0 ] + 6 E D 9 E D A 1 ) < < 3 A=(A+h(B,C,D)+x_{[0]}+6ED9EDA1)<<3 A=(A+h(B,C,D)+x[0]+6ED9EDA1)<<3

  • D = ( D + h ( A , B , C ) + x [ 8 ] + 6 E D 9 E D A 1 ) < < 9 D=(D+h(A,B,C)+x_{[8]}+6ED9EDA1)<<9 D=(D+h(A,B,C)+x[8]+6ED9EDA1)<<9

  • C = ( C + h ( D , A , B ) + x [ 4 ] + 6 E D 9 E D A 1 ) < < 11 C=(C+h(D,A,B)+x_{[4]}+6ED9EDA1)<<11 C=(C+h(D,A,B)+x[4]+6ED9EDA1)<<11

  • B = ( B + h ( C , D , A ) + x [ 12 ] + 6 E D 9 E D A 1 ) < < 15    B=(B+h(C,D,A)+x_{[12]}+6ED9EDA1)<<15\\\; B=(B+h(C,D,A)+x[12]+6ED9EDA1)<<15

  • A = ( A + h ( B , C , D ) + x [ 2 ] + 6 E D 9 E D A 1 ) < < 3 A=(A+h(B,C,D)+x_{[2]}+6ED9EDA1)<<3 A=(A+h(B,C,D)+x[2]+6ED9EDA1)<<3

  • D = ( D + h ( A , B , C ) + x [ 10 ] + 6 E D 9 E D A 1 ) < < 9 D=(D+h(A,B,C)+x_{[10]}+6ED9EDA1)<<9 D=(D+h(A,B,C)+x[10]+6ED9EDA1)<<9

  • C = ( C + h ( D , A , B ) + x [ 6 ] + 6 E D 9 E D A 1 ) < < 11 C=(C+h(D,A,B)+x_{[6]}+6ED9EDA1)<<11 C=(C+h(D,A,B)+x[6]+6ED9EDA1)<<11

  • B = ( B + h ( C , D , A ) + x [ 14 ] + 6 E D 9 E D A 1 ) < < 15    B=(B+h(C,D,A)+x_{[14]}+6ED9EDA1)<<15\\\; B=(B+h(C,D,A)+x[14]+6ED9EDA1)<<15

  • A = ( A + h ( B , C , D ) + x [ 1 ] + 6 E D 9 E D A 1 ) < < 3 A=(A+h(B,C,D)+x_{[1]}+6ED9EDA1)<<3 A=(A+h(B,C,D)+x[1]+6ED9EDA1)<<3

  • D = ( D + h ( A , B , C ) + x [ 9 ] + 6 E D 9 E D A 1 ) < < 9 D=(D+h(A,B,C)+x_{[9]}+6ED9EDA1)<<9 D=(D+h(A,B,C)+x[9]+6ED9EDA1)<<9

  • C = ( C + h ( D , A , B ) + x [ 5 ] + 6 E D 9 E D A 1 ) < < 11 C=(C+h(D,A,B)+x_{[5]}+6ED9EDA1)<<11 C=(C+h(D,A,B)+x[5]+6ED9EDA1)<<11

  • B = ( B + h ( C , D , A ) + x [ 13 ] + 6 E D 9 E D A 1 ) < < 15    B=(B+h(C,D,A)+x_{[13]}+6ED9EDA1)<<15\\\; B=(B+h(C,D,A)+x[13]+6ED9EDA1)<<15

  • A = ( A + h ( B , C , D ) + x [ 3 ] + 6 E D 9 E D A 1 ) < < 3 A=(A+h(B,C,D)+x_{[3]}+6ED9EDA1)<<3 A=(A+h(B,C,D)+x[3]+6ED9EDA1)<<3

  • D = ( D + h ( A , B , C ) + x [ 11 ] + 6 E D 9 E D A 1 ) < < 9 D=(D+h(A,B,C)+x_{[11]}+6ED9EDA1)<<9 D=(D+h(A,B,C)+x[11]+6ED9EDA1)<<9

  • C = ( C + h ( D , A , B ) + x [ 7 ] + 6 E D 9 E D A 1 ) < < 11 C=(C+h(D,A,B)+x_{[7]}+6ED9EDA1)<<11 C=(C+h(D,A,B)+x[7]+6ED9EDA1)<<11

  • B = ( B + h ( C , D , A ) + x [ 15 ] + 6 E D 9 E D A 1 ) < < 15    B=(B+h(C,D,A)+x_{[15]}+6ED9EDA1)<<15\\\; B=(B+h(C,D,A)+x[15]+6ED9EDA1)<<15

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数字签名MD4、MD5 的相关文章

  • PHP md5 解释

    我正在开发这个 PHP 项目 并且有很多地方使用了 md5 我什至已经使用过它很多次了 但直到今天我仍然不清楚这个功能是做什么的 我意识到它会解密传入的值 但是如何撤消它以使其恢复到原始值 也许我不清楚整个过程 如果有人有有关该过程的信息
  • 如何比较两段文字?

    我需要删除包含多个段落的文本中的重复段落 我使用类中的函数java security MessageDigest计算每个段落的MD5哈希值 然后将这些哈希值添加到Set If add ed 成功 这意味着最新的段落是重复的 这种方式有风险吗
  • Ant:重命名文件以包含其 MD5

    对于熟悉 ant 的人来说 这个问题可能非常微不足道 到目前为止我只使用了 ant 的基础知识 我知道如何重命名文件 例如我已经使用
  • MD5 是否仍然足以唯一标识文件?

    考虑到 MD5 算法的破坏和安全问题等 MD5 散列文件是否仍然被认为是唯一识别该文件的足够好的方法 安全性不是我在这里最关心的问题 但唯一地标识每个文件才是 有什么想法吗 是的 MD5从安全角度来说已经被彻底攻破 但意外碰撞的概率仍然微乎
  • 将 md5 哈希字节数组转换为字符串

    如何将哈希结果 字节数组 转换为字符串 byte bytePassword Encoding UTF8 GetBytes password using MD5 md5 MD5 Create byte byteHashedPassword m
  • 如何在不使用文本字段的情况下在 MySQL 数据库中存储哈希值

    我正在存储独特的用户代理在 MySQL MyISAM 表中 因此当我必须查看它是否存在于表中时 我会检查md5 hash它存储在 TEXT 字段旁边 User Agents id INT user agent TEXT hash VARCH
  • 在 C 中返回错误的 MD5 哈希值

    我正在尝试为字符串生成 MD5 哈希值 你好世界 使用原始 未修改的 md5 h 和md5c c http www arp harvard edu eng das manuals QNX6libs md5c 8c source html f
  • PHP - MD5、SHA、哈希安全

    我是一个用 PHP 构建的新网站的开发人员 我想知道什么是最好的 用于散列的东西 我已经研究过 md5 和 sha1 但还有更安全的吗 如果这是一个菜鸟问题 我很抱歉 但我是 PHP 安全新手 我正在努力让我的 网站尽可能安全 还有什么是盐
  • BSD md5 与 GNU md5sum 输出格式?

    任何人都知道为什么 BSD md5 程序会产生这种格式的哈希输出 MD5 checksum md5 9eb7a54d24dbf6a2eb9f7ce7a1853cd0 而 GNU md5sum 会产生像这样更合理的格式 9eb7a54d24d
  • Tomcat Digest 与 Manager WebApp

    我正在尝试为 tomcat 管理器应用程序设置摘要密码 我有
  • MD5 输入/输出的最大长度

    可以进行 md5 哈希处理的字符串的最大长度是多少 或者 如果没有限制 如果有 md5 输出值的最大长度是多少 MD5 将任意长度的消息处理为 128 位的固定长度输出 通常表示为 32 个十六进制数字的序列
  • 我如何编写 Perl 脚本来计算目录中每个文件的 MD5 和? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有办法编写Perl脚本来计算目录中每个文件的MD5sum 如果是这样 我该怎么做 有很多方法可以做到这一点 但归结为您需要执行的两个操
  • SHA 足以检查文件重复吗? (PHP 中的 sha1_file)

    假设您想创建一个文件托管站点 供人们上传文件并向他们的朋友发送链接以供稍后检索 并且您想确保文件在我们存储文件的位置重复 那么 PHP 的 sha1 file 是否足以完成该任务 有什么理由不使用 md5 file 来代替吗 对于前端 它将
  • 使用 Python ftplib 获取远程 FTP 服务器中文件的 MD5 值

    使用 ftplib 将文件传输到服务器后 如何确定该文件与本地服务器中的文件的 MD5 from ftplib import FTP import hashlib ftp FTP server ftp login username pass
  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • 如何创建包含多列MD5的GENERATED列?

    我尝试在 PostgreSQL 14 3 中添加下表 CREATE TABLE client cache id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY request VARCHAR
  • md5 哈希冲突。

    如果从 1 数到 X 其中 X 是第一个与前一个数字发生 md5 冲突的数字 那么 X 是哪个数字 我想知道如果我使用 md5 作为序列号 在发生冲突之前我可以期望能够枚举多少个单元 Theoretically you can expect
  • Python:导入 md5 时出错

    我在导入 md5 库时遇到问题 我只是使用下面的代码 import md5 filemd5 md5 new password strip hexdigest 我也尝试过这段代码 from hashlib import md5 filemd5
  • 为什么 python 3 中的 json.dumps() 返回与 python 2 不同的值? [复制]

    这个问题在这里已经有答案了 我需要在 Python 3 中生成 MD5 哈希 以便与在 Python 2 上生成的 MD5 哈希进行比较 但 json dumps 的结果不同 因为在 Python 2 上 元素的位置发生了变化 MD5 结果
  • 如何使用 JNDI 和 Digest-MD5 对 LDAP 进行身份验证

    我正在尝试使用 DIGEST MD5 加密对 LDAP 服务器进行身份验证 使用简单加密时 它工作得很好 但由于显而易见的原因 我无法通过网络以纯文本形式发送密码 奇怪的是 在使用 Softerra LDAP 浏览器时 我可以使用 Dige

随机推荐

  • 10个统计分析方法

    为什么要学习统计学习 首先 为了知道如何以及何时使用各种分析方法 理解各种分析方法背后的思想很重要 要想掌握更精巧复杂的方法 你必须先理解较简单的方法 其次 当你想准确地评估一种分析方法的效果时 你得知道其运行的多好或者多么不好 第三 这是
  • Spring Boot引起的“堆外内存泄漏”排查及经验总结

    背景 为了更好地实现对项目的管理 我们将组内一个项目迁移到MDP框架 基于Spring Boot 随后我们就发现系统会频繁报出Swap区域使用量过高的异常 笔者被叫去帮忙查看原因 发现配置了4G堆内内存 但是实际使用的物理内存竟然高达7G
  • 7.1 超级账本

    Matthew Hancock Ed Vaizey以及Linux基金会执行董事Jim Zemlin都认为区块链技术和分布式账本这两个概念是可以互换的 通过分布式账本 几乎任何有价值的东西都可以被跟踪和交易 Jim Zemlin认为 分布式账
  • 10个杀手级应用的Python自动化脚本

    10个杀手级应用的Python自动化脚本 重复的任务总是耗费时间和枯燥的 想象一下 逐一裁剪100张照片 或者做诸如Fetching APIs 纠正拼写和语法等任务 所有这些都需要大量的时间 为什么不把它们自动化呢 在今天的文章中 我将与你
  • VS2012创建ATL工程及使用MFC测试COM组件

    VS2012创建ATL工程及使用MFC测试COM组件 原创 2015年01月22日 16 23 21
  • 浏览器开发者模式F12的基本使用

    chrome浏览器的开发者工具可通过F12快捷键打开 1 调整开发者工具在页面的显示 2 检查界面元素 设备切换 网页或终端 终端选择 断点查看 3 可查看不同手机的界面适配问题 4 如何打断点 5 目标位置界面点击鼠标右键 检查 也可打开
  • ubuntu中conda安装pytorch 和 torch-geometric

    conda创建虚拟环境 conda create n pytorch python 3 7 conda activate pytorch 安装cuda nvidia smi 在这里插入图片描述 https img blog csdnimg
  • 铃木uy125最高时速_6K公里了谈谈轻骑铃木UY125的感受

    这也是很多人关心的 我以前是骑电驴的 电驴的动力弱 上坡无力这些都是常态 大排 公升的我没骑过 所以不谈 仅仅说下我的感受 转弯很灵活 我1米85的个子 极限转弯时 车把不会碰到膝盖 压弯不能太低 会蹭两侧的板子 离地间隙不高 比如上绿化带
  • Qt

    Qt 配置文件QSettings的使用方法 1 简介 配置文件常见的作用是启动软件是保留上次软件退出是的界面状态 如果不保留配置 且软件界面的内容又比较多 重启软件后界面恢复默认 那么每次打开界面都需要重新设置 这样比较麻烦 所以可以使用配
  • Qt中各种消息框对话框的使用

    在程序运行时 经常需要提示用户一些信息 比如警告啊 提示啊 建议啊之类的东西 这些东西基本上是通过消息框与用户进行交互的 Qt中主要是用QMessageBox类来加以实现的 消息框一般分为七种 Question询问消息框 为正常的操作提供一
  • 在小熊派BearPi-HM_Micro_small开发板上安装HAP

    引言 本文介绍如何在小熊派BearPi HM Micro small开发板上安装HAP 参考 https gitee com bearpi bearpi hm micro small blob master applications Bea
  • docker 非root用户修改mount到容器的文件出现“Operation not permitted

    使用环境centos7 x86 64 内核版本4 19 9 docker使用非root用户启动 daemon json配置文件内容如下 cat daemon json userns remap dockertest 映射的user和grou
  • UMG通过参数传递子弹个数给HUD

    今天 看UMG文档 发现无法传递 原因是应该传递到TEXT 而不是EditText 1 在firstpersonCharacter蓝图里 1 创建HUD 并保留HUD指针 2 发射时 子弹数 1 为0时不能发射 3 按R键 子弹数满 25
  • 逻辑回归梯度下降推导

    目录 什么是逻辑回归 逻辑回归的代价函数是怎么来的 逻辑回归求导 参考 什么是逻辑回归 逻辑回归 Logistic Regression 是用于处理因变量为分类变量的回归问题 常见的是二分类或二项分布问题 也可以处理多分类问题 它实际上是属
  • [c++11]多线程编程(五)——unique_lock

    c 11 多线程编程 五 unique lock 转自 https www jianshu com p 34d219380d90 互斥锁保证了线程间的同步 但是却将并行操作变成了串行操作 这对性能有很大的影响 所以我们要尽可能的减小锁定的区
  • el-table树形数据全部展开和收缩(toggleRowExpansion)

    本文主要讲根据element ui文档的toggleRowExpansion实现el table树形数据全部展开和收缩 1 页面效果 2 HTML页面展示 树形数据 直接使用element ui的demo数据 div div
  • Linux下特有的reboot()函数的简介

    1 Linux下c程序通过调用reboot 函数 可以实现系统的重启 挂机 Power Down等功能 2 1 对于libc5或libc4来说 库函数的原型声明中包含四个参数 具体函数原型声明如下 include
  • Linux内核浮点运算

    首次在linux内核驱动使用浮点型运算时出现了 undefined reference to aeabi uidiv 等错误 主要参考 Vedic的博客 toradexsh的博客 根据Vedic的博客修改makefile即可
  • vs2012编译boost_1_53_0

    Boost库的介绍 Boost库是一个经过千锤百炼 可移植 提供源代码的C 库 作为标准库的后备 是C 标准化进程的发动机之一 Boost库由C 标准委员会库工作组成员发起 其中有些内容有望成为下一代C 标准库内容 在C 社区中影响甚大 其
  • 数字签名MD4、MD5

    在本文中 模二加 记为 bigoplus 是二进制位的异或操作 如1模二加1和0模二加1都等于0 1模二加0等于1 模 2 32