以函数式编程思想实现安全散列算法 - 512 (SHA-512)

给定一个长度为 Nstring S,我们的任务是找到给定字符串 SSHA-512 哈希值

示例:

> 输入: S = "GeeksforGeeks"

> 输出: acc10c4e0b38617f59e88e49215e2e894afaee5ec948c2af6f44039f03c9fe47a9210e01d5cd926c142bdc9179c2ad30f927a8faf69421ff60a5eaddcf8cb9c

>

>

>

> 输入: S = "hello world"

> 输出:

> 309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f

方法: 让我们按照以下步骤来解决这个问题:

  • 将给定字符串转换为二进制形式
  • 在字符串后追加 ‘1‘,然后不断追加 ‘0‘,直到字符串的长度满足 < (N%(1024 – 128)) 的条件。
  • 在字符串 S 中添加 N 的 128位 二进制表示
  • 计算大小为 1024 的块的数目,并将其存储在变量 chunks 中,即 N/1024
  • string S 划分为 16 个块,每个块包含 64 个字符。
  • 通过执行以下操作将块的数量扩展到 80 个:
  • 遍历范围 [16, 80],然后找到 4 个值,即 WordA, WordB, WordC, WordD,如下所示:
  • WordA = rotateright(Message[g – 2], 19) ^ rotateright(Message[g – 2], 61) ^ shift_right(Message[g – 2], 6)
  • WordB = Message[g – 7]
  • WordC = rotateright(Message[g – 15], 1) ^ rotateright(Message[g – 15], 8) ^ shift_right(Message[g – 15], 7)
  • WordD = Message[g – 16]
  • Message[g] 的值更新为 (WordA + WordB + WordC + WordD)
  • 初始化 8 个变量,分别为 A, B, C, D, E, F, G, H,类型为 64位,用于存储给定字符串 S 的最终哈希值。
  • 遍历数组 Block[] 并执行以下步骤:
  • 通过逐一旋转,使用哈希函数更新 A, B, C, D, E, F, G, H 的值,共进行 80 次迭代。
  • 现在,通过将 A, B, C, D, E, F, G, H 的先前值与新更新的值相加,来更新 A, B, C, D, E, F, G, H 的值。
  • 完成上述步骤后,打印 A, B, C, D, E, F, G, H十六进制值,即可获得给定字符串的哈希值。

下面是上述方法的实现:

Java

`

import java.math.BigInteger;

public class Main {
    static final BigInteger[] Constants = {
        new BigInteger("428a2f98d728ae22", 16), new BigInteger("7137449123ef65cd", 16), new BigInteger("b5c0fbcfec4d3b2f", 16),
        new BigInteger("e9b5dba58189dbbc", 16), new BigInteger("3956c25bf348b538", 16), new BigInteger("59f111f1b605d019", 16),
        new BigInteger("923f82a4af194f9b", 16), new BigInteger("ab1c5ed5da6d8118", 16), new BigInteger("d807aa98a3030242", 16),
        new BigInteger("12835b0145706fbe", 16), new BigInteger("243185be4ee4b28c", 16), new BigInteger("550c7dc3d5ffb4e2", 16),
        new BigInteger("72be5d74f27b896f", 16), new BigInteger("80deb1fe3b1696b1", 16), new BigInteger("9bdc06a725c71235", 16),
        new BigInteger("c19bf174cf692694", 16), new BigInteger("e49b69c19ef14ad2", 16), new BigInteger("efbe4786384f25e3", 16),
        new BigInteger("0fc19dc68b8cd5b5", 16), new BigInteger("240ca1cc77ac9c65", 16), new BigInteger("2de92c6f592b0275", 16),
        new BigInteger("4a7484aa6ea6e483", 16), new BigInteger("5cb0a9dcbd41fb44", 16), new BigInteger("76f988da831153b5", 16),
        new BigInteger("983e5152ee66dfab", 16), new BigInteger("a831c66d2db43210", 16), new BigInteger("b00327c898fb213f", 16),
        new BigInteger("bf597fc7beef0ee4", 16), new BigInteger("c6e00bf33da88fc2", 16), new BigInteger("d5a79147930aa725", 16),
        new BigInteger("06ca6351e003826f", 16), new BigInteger("142929670a0e6e70", 16), new BigInteger("27b70a8546d22ffc", 16),
        new BigInteger("2e1b21385c26c926", 16), new BigInteger("4d2c6dfc5ac42aed", 16), new BigInteger("53380d139d95b3df", 16),
        new BigInteger("650a73548baf63de", 16), new BigInteger("766a0abb3c77b2a8", 16), new BigInteg
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/35508.html
点赞
0.00 平均评分 (0% 分数) - 0