在本文中:

  • 模二加,记为 ⨁ \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。 在图中也可以注意到,将运算后的值给了下一次的B,原B给了C,原D给了A。

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)=(X⋀Y)⋁(X⋀Z) (注: 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)=(X⋀Y)⋁(X⋀Z)⋁(Y⋀Z)
第三轮: h ( X , Y , Z ) = X ⨁ Y ⨁ Z h(X,Y,Z)=X\bigoplus Y\bigoplus Z\; h(X,Y,Z)=X⨁Y⨁Z (注:“ ⨁ \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次运算放在最后面给出。 先介绍生成流程,3轮的16次运算放在最后面给出。

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

经过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(X、Y、Z)=(X⋁Z)⨁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)=(X⋀Y)⋁(X⋀Z)⋁(Y⋀Z) 变为 g ( X , Y , Z ) = ( X ⋀ Y ) ⋁ ( Y ⋀ Z ‾ ) g(X,Y,Z)=(X\bigwedge Y) \bigvee(Y\bigwedge \overline{Z}) g(X,Y,Z)=(X⋀Y)⋁(Y⋀Z)
  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

数字签名MD4、MD5相关推荐

  1. 如何利用openssl来计算md4, md5, sha1, sha256, sha384, sha512等常用哈希值?

    转载:http://blog.csdn.net/stpeace/article/details/41922115 openssl的库的用法, 前面已经介绍了, 所以不再啰嗦, 直接给出代码: [cpp ...

  2. Hash MSDN MD4 MD5 SHA1 CRC 详细解释

    让我们先来了解一些基本知识,了解hash. Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image), ...

  3. C#毕业设计——基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码)——数字签名系统

    基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于MD5+RSA的数字签名设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告PPT模板及论 ...

  4. [C++杂谈]:MD5以及XML数字签名

    背景:工程发布到生产,在研发介入阶段可以修改相关配置文件,但当研发退出,由生产完全接手的时候,将禁止修改相关配置文件.因此需要工程能够校验相应的文件是否是和发布时保持一致.当前考虑将需要校验的文件的M ...

  5. 【实习项目记录】(一)加密算法MD5和RSA

    什么是md5加密? MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA ...

  6. java-信息安全(一)-BASE64,MD5,SHA,HMAC,RIPEMD算法

    概述 信息安全基本概念: BASE64 编码格式 Base58 编码 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm, ...

  7. iOS MD5 (消息摘要算法5)

    一.MD5定义     MD5即Message-Digest Algorithm 5(消息-摘要算法5),为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护(又译摘要算法.哈希算法),主 ...

  8. md5加密算法的C(C++)代码实现

    算法的应用 md5的典型应用是对一段信息(message)产生信息摘要(message-digest),以防止被篡改.比如,在unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的 ...

  9. 简要分析用MD5加密算法加密信息(如有疑问,敬请留言)

    一.引言 最近看了媒体的一篇关于"网络上公开叫卖个人隐私信息"报导,不法分子通过非法手段获得的个人隐私信息,其详细.准确程度简直令人瞠口结舌.在互联网飞速发展的现在,我们不难想到, ...

最新文章

  1. 实例分割综述(单阶段/两阶段/实时分割算法汇总)
  2. 独家 | 别用csv存储了-这种文件格式比csv快150倍(附链接)
  3. mysql经典总结文章_MySQL基础篇(01):经典实用查询案例,总结整理
  4. Android 应用软件开发(九)控件续
  5. 匿名函数 lambda
  6. 人身三流指什么_保险合同的主体是什么,主体的变更是什么?
  7. mysql nb3 备份_Navicat mysql 数据库备份和使用,备份以后是nb3文件-Go语言中文社区...
  8. Spring Boot+Vue从零开始搭建博客系统veblog(一):项目前端_vuejs环境搭建
  9. kpw3刷安卓教程2019_买kindle paperwhite4的别急,或许3更好用,因为3可以刷安卓!...
  10. C标准中的转义字符以及ASC码表
  11. python 100以内3的倍数_在python中确定3或5的倍数
  12. 上海2016年房价己见
  13. UG二次开发GRIP总结简明教程
  14. 阿里云、腾讯云、百度云、京东云、华为云、他们之间的不同之处?
  15. ImageMagick被爆存在零日漏洞 或导致重要信息被窃取
  16. 12.面向对象(继承/super/接口/抽象类)
  17. 【iis】解决:Could not load type ‘System.ServiceModel.Activation.HttpModule‘ from assemb
  18. 在sublime中插入图片
  19. a^x求导是怎么来的呢?
  20. vue中使用xlsx实现excel表的导入和导出

热门文章

  1. 深入钻研Augular两年 谈谈其究竟适用于哪些场合
  2. 如何快速掌握MYSQL?附牛客网精选的50道SQL题目详解【入门推荐】
  3. Code Sign error: No matching provisioning profile found: Your build settings specify a provisioni...
  4. 关于“文心一言”,ChatGPT如是说
  5. 水星MW4530R刷机总结
  6. 通达信,MACD底背离(买入信号之一)
  7. LTE QPSK 16QAM星座图、调制符号与bit序列映射关系
  8. java里remark是什么意思_remark是什么意思_remark在线翻译_英语_读音_用法_例句_海词词典...
  9. Python读取excel表格数据并绘制成柱状图 | 数据排序、柱状图颜色、标签乱码等问题通通能够解决!
  10. Mogafx欧元每周预测