这是一个实现 SM3 哈希算法的 TypeScript 类。SM3 是一种国家密码局(中国)发布的密码散列函数,适用于数字签名、认证等安全领域。

Description

需要注意的是,该类中大部分方法都是私有的,仅提供了两个公共方法用于计算哈希值。在实际使用时,只需要创建一个 SM3 实例,调用 sm3Digest 或者 sm3DigestBytes 方法即可。

使用示例中调用了 sm3Digest 方法计算字符串 'hello world' 的哈希值,返回的是一个 64 位的十六进制字符串。

Example

import { SM3 } from './sm3';
const sm3 = new SM3();
const hash = sm3.sm3Digest('hello world'); // 计算字符串 'hello world' 的哈希值
console.log(hash); // 输出: 7CAE1F2D454C13E6CC20BFFA0C43CB8BE944C47CE9DD1C97C5DCC30CBC00E22B

Hierarchy

  • SM3

Constructors

Methods

  • 对多个数字进行相加操作。

    Description

    这个方法是 SM3 算法中用到的多个数字相加函数。它会将所有传入的数字相加,并返回相加的结果。它通过循环遍历传入的数字列表,每次调用 safe_add() 方法将当前数字与累加和相加,最终得到所有数字的和。

    在下面的示例中,我们创建了一个 SM3 的实例,并使用 addAll() 方法对多个数字进行相加。最后,我们打印返回值,该返回值应该是一个数字。

    Example

    const sm3 = new SM3()
    const mySum1: number = sm3.addAll(1, 2, 3, 4)
    const mySum2: number = sm3.addAll(10, 20, 30, 40, 50)

    console.log(mySum1) // 10
    console.log(mySum2) // 150

    Parameters

    • Rest ...params: number[]

      要相加的数字列表。

    Returns number

    返回所有数字相加的结果。

  • 将给定的数字数组填充到满足 SM3 加密算法的长度,以进行后续的哈希计算。

    Description

    这个方法的作用是将二进制数据填充到满足 SM3 加密算法的长度,以便后续的哈希计算。具体而言,它会在明文二进制串末尾添加 1000 0000 标记,然后向后填充 0 直到达到 512bit(64 字节)的整数倍长度,最后添加一个 64bit 的数字表示明文二进制串的长度。这是 SM3 算法的一个重要步骤,因为计算哈希值需要对明文进行先前规定的填充和处理。

    在下面的示例中,我们首先声明了一个包含 11 个数字的二进制数据数组 myBinaryData 和原始数据长度 myLength。然后我们创建了一个 SM3 的实例,并使用 alignSM3() 方法将 myBinaryData 填充到满足 SM3 算法长度要求,以便进行后续的哈希计算。最后,我们打印返回值,该返回值应该是一个包含大量 0 的数组。

    Example

    const myBinaryData: number[] = [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
    const myLength: number = myBinaryData.length

    const sm3 = new SM3()
    sm3.alignSM3(myBinaryData, myLength)

    console.log(myBinaryData) // [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, -2147483648, 0, 0, 0, 0, 0, 0, 0, 0, ...

    Parameters

    • arr: number[]

      要对齐的数字数组。

    • strLen: number

      原始字符串(或二进制数据)的长度。

    Returns number

    分组数。

  • 对给定的 32 位整数执行循环左移。

    Description

    这个方法的作用是对给定的 32 位整数执行循环左移。它将输入值向左移动指定的位数,并使用按位或运算符组合原始值和移动值。此操作通常用于加密算法中,以增加数据的混淆度并提高安全性。

    在下面的示例中,我们首先声明了一个数字 myNumber 作为要移动的输入值,以及一个数字 n 作为要移动的位数。然后我们创建了一个 SM3 的实例,并使用 bitRol() 方法将 myNumber 循环左移 n 位。最后,我们打印返回值,该返回值应该是一个经过计算的数字。

    Example

    const myNumber: number = 123456

    const sm3 = new SM3()
    const myResult: number = sm3.bitRol(myNumber, 7)

    console.log(myResult) // 1572864

    Parameters

    • input: number

      要移动的输入值。

    • n: number

      左移的位数。

    Returns number

    经过循环左移后的新值。

  • 对给定的 512bit 消息分组进行哈希计算,返回结果。

    Description

    这个方法的作用是对给定的 512bit 消息分组进行哈希计算,并返回结果。具体而言,它会将消息分组扩展到 132 个字

    在下面的示例中,我们首先声明了一个包含 11 个数字的二进制数据数组 myBinaryData 和原始数据长度 myLength。然后我们创建了一个 SM3 的实例,并使用 hash() 方法将 myBinaryData 哈希计算。最后,我们打印返回值,该返回值应该是一个 256 位(64 个十六进制数字)的字符串。

    Example

    const myBinaryData: number[] = [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
    const myLength: number = myBinaryData.length

    const sm3 = new SM3()
    const myHash: string = sm3.hash(myBinaryData)

    console.log(myHash) // "0c94fd55a6b5cfc7d0858b533fb0c1ac80ca36b35e6985f41858d3fe764d2dca"

    Parameters

    • v: number[]

      当前的哈希值。

    • binArr: number[]

      要处理的二进制数组。

    • i: number

      当前消息分组的索引。

    Returns number[]

    经过哈希计算后得到的新哈希值。

  • SM3 压缩函数中用到的 FF 轮函数。

    Description

    这个方法是 SM3 压缩函数中用到的轮函数 FF。它会根据传入的索引值对输入的三个参数 x、y、z 进行处理,并返回一个计算结果。具体而言,当 j 的取值为 0 到 15 时,它会将 x、y 和 z 做异或(XOR)运算并返回;当 j 的取值为 16 到 63 时,它会将 x、y 和 z 做按位与(AND)和按位或(OR)运算并返回。这些计算公式用于哈希计算中的轮函数,以增加散列的随机性和安全性。

    在下面的示例中,我们创建了一个 SM3 的实例,并分别使用 ff() 方法计算了不同参数下的结果。最后,我们打印返回值,该返回值应该是一个数字。

    Example

    const sm3 = new SM3()
    const myResult1: number | undefined = sm3.ff(1, 2, 3, 5)
    const myResult2: number | undefined = sm3.ff(10, 20, 30, 50)

    console.log(myResult1) // 1
    console.log(myResult2) // 24

    Parameters

    • x: number

      当前处理的 a 值。

    • y: number

      当前处理的 b 值。

    • z: number

      当前处理的 c 值。

    • j: number

      当前处理的位置。

    Returns undefined | number

    返回指定位置对应的处理结果。

  • SM3 压缩函数中用到的 GG 轮函数。

    Description

    这个方法是 SM3 压缩函数中用到的轮函数 GG。它会根据传入的索引值对输入的三个参数 x、y、z 进行处理,并返回一个计算结果。具体而言,当 j 的取值为 0 到 15 时,它会将 x、y 和 z 做异或(XOR)运算并返回;当 j 的取值为 16 到 63 时,它会将 x、y 和 z 做按位与(AND)和按位非(NOT)运算并返回。这些计算公式用于哈希计算中的轮函数,以增加散列的随机性和安全性。

    在下面的示例中,我们创建了一个 SM3 的实例,并分别使用 gg() 方法计算了不同参数下的结果。最后,我们打印返回值,该返回值应该是一个数字。

    Example

    const sm3 = new SM3()
    const myResult1: number | undefined = sm3.gg(1, 2, 3, 5)
    const myResult2: number | undefined = sm3.gg(10, 20, 30, 50)

    console.log(myResult1) // 0
    console.log(myResult2) // 30

    Parameters

    • x: number

      当前处理的 a 值。

    • y: number

      当前处理的 b 值。

    • z: number

      当前处理的 c 值。

    • j: number

      当前处理的位置。

    Returns undefined | number

    返回指定位置对应的处理结果。

  • 这是一个实现了 SM3 算法中的 P0 压缩函数的私有方法。

    P0(x) = x XOR (x <<< 9) XOR (x <<< 17)

    Description

    P0 压缩函数是 SM3 算法中的一部分。它使用三种不同的位移来改变输入值,并返回新的结果。具体而言,P0 函数会对输入值进行循环左移 9 位和 17 位,然后与原始值异或运算。此操作旨在增加输入值的混淆度,并为后续的哈希计算做准备。

    在下面的示例中,我们首先声明了一个数字 myNumber 作为输入值。然后我们创建了一个 SM3 的实例,并使用 p0() 方法将 myNumber 通过 P0 压缩函数计算。最后,我们打印返回值,该返回值应该是一个经过计算的数字。

    Example

    const myNumber: number = 123456
    const sm3 = new SM3()
    const myResult: number = sm3.p0(myNumber)
    console.log(myResult) // 1249290316

    Parameters

    • x: number

      输入值。

    Returns number

    经过 P0 压缩函数计算后的值。

  • 这是一个实现了 SM3 算法中的 P1 压缩函数的私有方法。

    P1(x) = x XOR (x <<< 15) XOR (x <<< 23)

    Description

    P0 压缩函数是 SM3 算法中的一部分。它使用三种不同的位移来改变输入值,并返回新的结果。具体而言,P0 函数会对输入值进行循环左移 9 位和 17 位,然后与原始值异或运算。此操作旨在增加输入值的混淆度,并为后续的哈希计算做准备。

    在下面的示例中,我们首先声明了一个数字 myNumber 作为输入值。然后我们创建了一个 SM3 的实例,并使用 p0() 方法将 myNumber 通过 P0 压缩函数计算。最后,我们打印返回值,该返回值应该是一个经过计算的数字。

    Example

    const myNumber: number = 123456

    const sm3 = new SM3()
    const myResult: number = sm3.p0(myNumber)

    console.log(myResult) // 1249290316

    Parameters

    • x: number

      输入值。

    Returns number

    经过 P1 压缩函数计算后的值。

  • 对两个数字进行安全加法操作。

    Description

    这个方法是 SM3 算法中用到的加法运算函数。它会将两个数字相加,并返回相加的结果。为了防止溢出,它会先将两个数字分别按位与运算并将低位相加,然后将高位相加并左移 16 位,最后将两者相或运算得到最终结果。

    在下面的示例中,我们创建了一个 SM3 的实例,并使用 safe_add() 方法对两个数字进行加法运算。最后,我们打印返回值,该返回值应该是一个数字。

    Example

    const sm3 = new SM3()
    const mySum: number = sm3.safe_add(123456789, 987654321)

    console.log(mySum) // 1111111110

    Parameters

    • x: number

      要相加的第一个数字。

    • y: number

      要相加的第二个数字。

    Returns number

    返回相加结果。

  • sm3Digest 方法是 SM3 类的一个公共方法,用于计算给定字符串的 SM3 哈希值。该方法内部调用了私有方法 sm3DigestBytes 计算哈希值。

    Description

    使用示例中首先创建了一个 SM3 实例,定义了一个字符串 message,调用 sm3Digest 方法计算给定字符串的 SM3 哈希值,返回的是一个 64 位的十六进制字符串。最终输出该哈希值。

    Example

    const sm3 = new SM3();
    const message = 'hello world';
    const hash = sm3.sm3Digest(message);
    console.log(hash); // 输出:7CAE1F2D454C13E6CC20BFFA0C43CB8BE944C47CE9DD1C97C5DCC30CBC00E22B

    Parameters

    • str: string

      待计算哈希值的字符串

    Returns string

    计算得到的 64 位十六进制字符串哈希值

  • 计算给定明文二进制数组的 SM3 哈希值。

    Description

    使用示例中首先创建了一个 SM3 实例,然后定义了一个明文二进制数组 binaryData,包含了字符 'hello' 的 UTF-8 编码。调用 sm3DigestBytes 方法计算给定明文二进制数组的 SM3 哈希值,返回的是一个 64 位的十六进制字符串。最终输出该哈希值。

    Example

    const sm3 = new SM3();
    const binaryData = [0x68, 0x65, 0x6c, 0x6c, 0x6f];
    const hash = sm3.sm3DigestBytes(binaryData, binaryData.length);
    console.log(hash); // 输出:31D7678A4F46C820FB695CC9F4A69D9CD32E2B5FE6C1E0CE7D6C3D66BD783568

    Parameters

    • binArr: number[]

      明文二进制数组

    • strLen: number

      明文长度

    Returns string

    计算得到的 64 位十六进制字符串哈希值

  • 将一个字符串转换为一个数字数组,其中每个数字表示字符串中的 16 位字符对应的 UTF-16 编码。

    Description

    这个方法的作用是将字符串转换为二进制数据,通常用于生成哈希值或其他加密算法中。由于在计算哈希值时需要处理大量的二进制数据,因此将其转换为更易处理的数字数组可以方便后续的运算和处理。

    在下面的示例中,我们首先声明了一个字符串 "hello world"。然后我们创建了一个 SM3 的实例,并使用 str2bin() 方法将字符串转换为二进制数据。最后,我们打印返回值,该返回值应该是一个包含 10 个数字的数组。

    Example

    const myString: string = "hello world"

    const sm3 = new SM3()
    const myBinaryData: number[] = sm3.str2bin(myString)

    console.log(myBinaryData) // [1751477356, -275742083, -1687521059, -1717992101, 1919247935, 1701736307, -1976379536, -1038341619, 1936028262, 1869509733]

    Parameters

    • str: string

      要转换的字符串。

    Returns number[]

    表示该字符串的数字数组。

  • 将输入的字符串转换为 UTF-8 编码的字符串。

    Description

    这个方法是 SM3 算法中用到的字符串编码函数。它会将输入的字符串按照 UTF-8 编码方式进行转换,并返回经过编码的字符串。具体而言,它首先按照 UTF-16 解码方法将输入字符串解码为字符编码值,然后根据 Unicode 标准规定的转换方式将字符编码值转换为对应的字节序列。最终得到的经过编码的字符串可以在传输和存储数据时保证字符集的一致性和兼容性。

    在下面的示例中,我们创建了一个 SM3 的实例,并使用 str2rstr_utf8() 方法将一个字符串转换为 UTF-8 编码格式的字符串。最后,我们打印返回值,该返回值应该是一个经过编码的字符串。

    Example

    const sm3 = new SM3()
    const myStr: string = 'Hello, world!'
    const myEncodedStr: string = sm3.str2rstr_utf8(myStr)

    console.log(myEncodedStr) // 'Hello, world!'

    Parameters

    • input: string

      要转换的字符串。

    Returns string

    返回经过 UTF-8 编码的字符串。

  • SM3 压缩函数中用到的常量函数。

    Description

    这个方法是 SM3 压缩函数中用到的常量函数。它会根据传入的索引值返回一个预设的常量值。具体而言,当 j 的取值为 0 到 15 时,它会返回 0x79CC4519;当 j 的取值为 16 到 63 时,它会返回 0x7A879D8A。这些常量值用于哈希计算中的轮函数,以增加散列的随机性和安全性。

    在下面的示例中,我们创建了一个 SM3 的实例,并分别使用 t() 方法获取了第 10 和第 80 个位置的常量值。最后,我们打印返回值,该返回值应该是一个数字。

    Example

    const sm3 = new SM3()
    const myConstant1: number = sm3.t(10)
    const myConstant2: number | undefined = sm3.t(80)

    console.log(myConstant1) // 2043436793
    console.log(myConstant2) // 1227134538

    Parameters

    • j: number

      当前处理的位置。

    Returns undefined | number

    返回指定位置对应的常量值。

  • 将一个数字数组转换为十六进制字符串,每个数字用指定的分隔符分隔。

    Description

    这个方法的作用是将数字数组转换为字符串,通常用于生成哈希值或其他加密算法中。由于在计算哈希值时需要处理大量的二进制数据,因此将其转换为更易读的十六进制字符串可以方便输出和比较。通过指定分隔符,还可以使十六进制字符串更清晰易读。

    在下面的示例中,我们首先声明了一个包含三个数字的数组 myWords 和一个字符串分隔符 '-'。然后我们创建了一个 SM3 的实例,并使用 sm3DigestBytes() 方法将数字数组转换为十六进制字符串。最后,我们打印返回值,该返回值应该是 "000000ff-0000ffff-00ffffff"。

    Example

    const myWords: number[] = [255, 65535, 16777215]
    const mySeparator: string = '-'

    const sm3 = new SM3()
    const myHash: string = sm3.sm3DigestBytes(myWords, mySeparator)

    console.log(myHash) // "000000ff-0000ffff-00ffffff"

    Parameters

    • words: any[]

      要转换为十六进制字符串的数字数组。

    • separator: string

      在每个十六进制值之间使用的字符串分隔符。

    Returns string

    包含所有十六进制值的单个字符串,这些值使用指定的分隔符连接在一起。

Generated using TypeDoc