这个类实现了SM4加密算法的核心功能,包括密钥生成、ECB模式加解密、CBC模式加解密等。你可以使用它来对字符串或者二进制数据进行加解密处理。

Description

在上面的代码中,我们首先创建了一个SM4Core对象,并设置了加密密钥为[0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10],然后对字符串'Hello, world!'进行加密处理,并输出加密结果;接着将SM4Core对象的模式设置为SM4_DECRYPT,对加密结果进行解密处理,并输出解密结果。

Example

import { SM4Core } from './SM4Core'

const sm4 = new SM4Core()
const key = [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10]
const ctx: any = { isPadding: true }
sm4.sm4_setkey_enc(ctx, key)
const plaintext = 'Hello, world!'
const input = []
for (let i = 0; i < plaintext.length; i++) {
input.push(plaintext.charCodeAt(i))
}
const ciphertext = sm4.sm4_crypt_ecb(ctx, input)
console.log('ciphertext:', ciphertext)
ctx.mode = sm4.SM4_DECRYPT
const decryptedtext = sm4.sm4_crypt_ecb(ctx, ciphertext)
let output = ''
for (let i = 0; i < decryptedtext.length; i++) {
output += String.fromCharCode(decryptedtext[i])
}
console.log('decryptedtext:', output)

Hierarchy

  • SM4Core

Constructors

Properties

CK: number[] = ...

定义 CK 数组,用于SM4算法的轮函数中的密钥异或操作

FK: number[] = ...

定义 FK 数组,用于SM4算法的轮函数中的常量异或操作

SM4_DECRYPT: number = 0

定义 SM4_DECRYPT 常量,表示解密操作

SM4_ENCRYPT: number = 1

定义 SM4_ENCRYPT 常量,表示加密操作

SboxTable: number[] = ...

定义 SboxTable 数组,用于SM4算法的S盒置换操作

Methods

  • 从数组b中索引位置i开始,获取一个32位无符号整数(大端模式)

    Description

    在 SM4Core 类中,该方法常被用于解析密钥、明文、密文等数据。由于 SM4 加密算法采用的是大端模式,因此需要通过该方法将小端模式的数据转换为大端模式的数据。

    Example

    const sm4 = new SM4Core()
    const input = [0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xff]
    const result = sm4.GET_ULONG_BE(input, 0)
    console.log(result) // 305419896

    Parameters

    • b: number[]

      数组

    • i: number

      索引位置

    Returns number

    一个32位无符号整数

  • 将一个32位无符号整数 n,按照大端(网络字节序)模式,写入到数组 b 的索引位置 i 处。

    Example

    const sm4 = new SM4Core()
    const output = []
    sm4.PUT_ULONG_BE(305419896, output, 0)
    console.log(output) // [18, 52, 86, 120]

    Parameters

    • n: number

      32位无符号整数

    • b: number[]

      数组

    • i: number

      索引位置

    Returns void

  • 对给定的32位无符号整数 x 进行左旋转操作,旋转 n 位。

    Description

    该方法的作用是对给定的32位无符号整数 x 进行左旋转操作,将其左旋转 n 位,并将结果以32位无符号整数的形式返回。

    在 SM4Core 类中,该方法主要被用于 SM4 算法中的置换操作。由于 SM4 算法中使用的所有整数都需要转换为32位无符号整数,因此需要使用左旋转操作来避免出现计算错误。

    Example

    const sm4 = new SM4Core()
    const result = sm4.ROTL(0x12345678, 8)
    console.log(result) // 0x34567812

    Parameters

    • x: number

      32位无符号整数

    • n: number

      左旋转位数

    Returns number

    左旋转后的32位无符号整数

  • 对给定的32位无符号整数 x 进行左移操作,移动 n 位。

    Description

    在 SM4Core 类中,该方法主要被用于 SM4 算法中的置换操作。由于 SM4 算法中使用的所有整数都需要转换为32位无符号整数,因此对于一些比较小的数据,需要进行左移操作,以避免出现计算错误。

    Example

    const sm4 = new SM4Core()
    const result = sm4.SHL(0x12345678, 8)
    console.log(result) // 0x34567800

    Parameters

    • x: number

      32位无符号整数

    • n: number

      左移位数

    Returns number

    左移后的32位无符号整数

  • 用于交换给定数组中两个元素的位置。

    Description

    该方法的作用是用于交换给定数组 sk 中下标为 i 和 (31 - i) 的两个元素的位置。

    在 SM4Core 类中,该方法主要被用于 SM4 解密算法中轮密钥反转。由于 SM4 解密算法需要将轮密钥进行反转,所以需要使用这个方法来交换轮密钥数组中的元素的位置。

    Example

    const sm4 = new SM4Core()
    const sk = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
    sm4.SWAP(sk, 3)
    console.log(sk) // [1, 2, 3, 30, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 4, 31, 32]

    Parameters

    • sk: number[]

      数组

    • i: number

      元素下标

    Returns void

  • 用于对给定的明文或密文进行填充。

    Description

    该方法的作用是对给定的明文或密文进行填充。在加密模式下,会将输入的数据按照 SM4 算法的规则进行填充;在解密模式下,会将数据中的填充字节删除。

    在 SM4Core 类中,该方法主要被用于 SM4 加密算法和解密算法中对数据进行预处理或后处理。

    Example

    const sm4 = new SM4Core()
    const input = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    const encrypted = sm4.encrypt(input, [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10])
    console.log(encrypted) // [-13, -90, 96, 49, -18, 48, 55, 92, 52, -14, -69, 13, 43, -51, 70, -88]
    const padded = sm4.padding(input, sm4.SM4_ENCRYPT)
    console.log(padded) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7]

    Parameters

    • input: number[]

      输入的明文或密文(由8位无符号整数构成的数组)

    • mode: number

      填充模式:加密模式为 this.SM4_ENCRYPT,解密模式为 this.SM4_DECRYPT

    Returns number[]

    返回填充后的结果(由8位无符号整数构成的数组)

  • 对给定的32位无符号整数 ka 进行 SM4 算法中的计算轮密钥操作。

    Description

    该方法的作用是对给定的32位无符号整数 ka,进行 SM4 算法中的计算轮密钥操作,并将结果以32位无符号整数的形式返回。

    在 SM4Core 类中,该方法主要被用于 SM4 算法中计算轮密钥。在计算轮密钥操作中,需要将输入数据进行 S 盒置换操作,并通过特定的运算得到最终的轮密钥值。

    Example

    const sm4 = new SM4Core()
    const result = sm4.sm4CalciRK(0x12345678)
    console.log(result) // 0xF2CA43F2

    Parameters

    • ka: number

      32位无符号整数

    Returns number

    计算得到的32位无符号整数(轮密钥)

  • 对给定的四个32位无符号整数 x0、x1、x2 和 x3 进行 SM4 算法中的 F(X) 置换操作。

    Description

    该方法的作用是对给定的四个32位无符号整数 x0、x1、x2 和 x3,以及一个32位无符号整数 rk(轮密钥),进行 SM4 算法中的 F(X) 置换操作,并将结果以32位无符号整数的形式返回。

    在 SM4Core 类中,该方法主要被用于 SM4 算法中的轮函数操作。在 F(X) 置换操作中,需要将四个 32 位无符号整数进行异或操作,并通过 L' 置换操作得到最终结果。

    Example

    const sm4 = new SM4Core()
    const result = sm4.sm4F(0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210, 0x01234567)
    console.log(result) // 0x44C8FC20

    Parameters

    • x0: number

      32位无符号整数

    • x1: number

      32位无符号整数

    • x2: number

      32位无符号整数

    • x3: number

      32位无符号整数

    • rk: number

      32位无符号整数(轮密钥)

    Returns number

    置换后的32位无符号整数

  • 对给定的32位无符号整数 ka 进行 SM4 算法中的 L' 置换操作。

    Description

    该方法的作用是对给定的32位无符号整数 ka,进行 SM4 算法中的 L' 置换操作,并将结果以32位无符号整数的形式返回。

    在 SM4Core 类中,该方法主要被用于 SM4 算法中的轮函数操作。L' 置换操作是轮函数中的关键步骤之一,在这个操作中,需要先对每个元素进行 S 盒置换操作,然后再进行 L 置换操作。由于整个过程都是基于32位无符号整数进行计算,因此需要使用一系列辅助函数(包括 PUT_ULONG_BE、GET_ULONG_BE、sm4Sbox、ROTL、SHL 等)对数据进行处理。

    Example

    const sm4 = new SM4Core()
    const result = sm4.sm4Lt(0x12345678)
    console.log(result) // 0x3C6EF372

    Parameters

    • ka: number

      32位无符号整数

    Returns number

    置换后的32位无符号整数

  • 对给定的8位无符号整数 inch 进行 SM4 算法中的 S 盒置换操作。

    Description

    该方法的作用是对给定的8位无符号整数 inch,进行 SM4 算法中的 S 盒置换操作,并将结果以8位无符号整数的形式返回。

    在 SM4Core 类中,该方法主要被用于 SM4 算法中的轮函数操作。S 盒置换操作是轮函数中的关键步骤之一,在这个操作中,需要将输入数据映射到一个不同的输出值,从而增强加密算法的混淆性。

    Example

    const sm4 = new SM4Core()
    const result = sm4.sm4Sbox(0x12)
    console.log(result) // 0xA4

    Parameters

    • inch: number

      8位无符号整数

    Returns number

    置换后的8位无符号整数

  • 用于对给定的数据进行 SM4 加密或解密操作(CBC 模式)。

    Description

    该方法的作用是对给定的数据进行 SM4 加密或解密操作,使用 CBC(密码分组链接)模式。在加密模式下,此方法需要输入一个初始化向量 iv,并依次对输入数据的每一块明文进行异或操作后再执行一轮轮加密;在解密模式下,此方法需要输入一个初始化向量 iv,依次对输入数据的每一块密文进行一轮轮解密,然后再与前一块密文进行异或操作。

    在 SM4Core 类中,该方法主要被用于 SM4 加密算法和解密算法的 CBC 模式实现。

    Example

    const sm4 = new SM4Core()
    const ctx = new sm4.sm4_context()
    ctx.isPadding = true
    ctx.mode = sm4.SM4_ENCRYPT
    const iv = [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32,

    Parameters

    • ctx: any

      上下文对象,由 sm4_context 类生成

    • iv: number[]

      初始化向量,由8位无符号整数构成的数组。在 CBC 模式下,第一块明文需要与初始化向量进行异或操作,然后再进行加密;后续的每一块明文需要与前一块密文进行异或操作,然后再进行加密。

    • input: number[]

      输入数据(由8位无符号整数构成的数组)

    Returns number[]

    返回加密或解密后的结果(由8位无符号整数构成的数组)

  • 用于对给定的数据进行 SM4 加密或解密操作(ECB 模式)。

    Description

    该方法的作用是对给定的数据进行 SM4 加密或解密操作,使用 ECB(电子密码本)模式。在加密模式下,此方法对输入数据依次执行一轮轮加密;在解密模式下,此方法对输入数据依次执行一轮轮解密。

    在 SM4Core 类中,该方法主要被用于 SM4 加密算法和解密算法的 ECB 模式实现。

    Example

    const sm4 = new SM4Core()
    const ctx = new sm4.sm4_context()
    ctx.isPadding = true
    ctx.mode = sm4.SM4_ENCRYPT
    const input = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    const output = sm4.sm4_crypt_ecb(ctx, input)
    console.log(output) // [-13, -90, 96, 49, -18, 48, 55, 92, 52, -14, -69, 13, 43, -51, 70, -88]

    Parameters

    • ctx: any

      上下文对象,由 sm4_context 类生成

    • input: number[]

      输入数据(由8位无符号整数构成的数组)

    Returns number[]

    返回加密或解密后的结果(由8位无符号整数构成的数组)

  • 用于对给定的数据进行一轮 SM4 加密或解密操作。

    Description

    该方法的作用是对给定的数据进行一轮 SM4 加密或解密操作,并将结果保存到输出数组 output 中。在加密模式下,此方法实现一轮轮加密;在解密模式下,此方法实现一轮轮解密。

    在 SM4Core 类中,此方法主要被用于 SM4 加密算法和解密算法中的核心计算过程。

    Example

    const sm4 = new SM4Core()
    const SK = new Array(32)
    const input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7]
    const output = new Array(16)
    sm4.sm4_setkey(SK, [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10])
    sm4.sm4_one_round(SK, input.slice(0, 16), output)
    console.log(output) // [-13, -90, 96, 49, -18, 48, 55, 92, 52, -14, -69, 13, 43, -51, 70, -88]

    Parameters

    • sk: number[]

      轮密钥数组,由 sm4_setkey 方法生成

    • input: number[]

      输入数据(由8位无符号整数构成的数组)

    • output: number[]

      输出结果(由8位无符号整数构成的数组)

    Returns void

  • 用于对给定的密钥进行预处理,生成一组轮密钥。

    Description

    该方法的作用是对给定的密钥进行预处理,生成一组轮密钥,并将这些轮密钥保存到数组 SK 中。

    在 SM4Core 类中,该方法主要被用于初始化 SM4 加密算法和解密算法的上下文。在这个过程中,需要对给定的密钥进行预处理,并生成一组轮密钥。

    Example

    const sm4 = new SM4Core()
    const SK = new Array(32)
    const key = [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10]
    sm4.sm4_setkey(SK, key)
    console.log(SK) // [305419896, -1062590464, 1056964608, -1021359760, -1057292288, 114755840, -944202752, 165121312, -1071095296, -236173056, -138540800, -878458624, -812756480, 136430848, -586709504, 570425344, -1138791424, 292722176, 83498624, 1061188608, 574619648, -1011042560, 110742528, 910925376, 23401728, 596520192, 397977600, 83627008, 292635776, -805306368, -628647168, 46279808, -1154816000]

    Parameters

    • SK: number[]

      用于保存轮密钥的数组

    • key: number[]

      用于加密或解密的密钥(16个8位无符号整数构成的数组)

    Returns void

  • 用于设置 SM4 解密算法的密钥。

    Description

    该方法的作用是用于设置 SM4 解密算法的密钥,其中 ctx 表示 SM4 算法上下文,而 key 则表示用于解密的密钥(由16个8位无符号整数构成的数组)。

    在 SM4Core 类中,该方法主要被用于初始化 SM4 解密算法的上下文。与加密算法不同,解密算法需要将轮密钥反转。

    Example

    const sm4 = new SM4Core()
    const ctx = { mode: 0, sk: new Array(32) }
    const key = [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10]
    sm4.sm4_setkey_dec(ctx, key)
    console.log(ctx.sk) // [-1154816000, 46279808, -628647168, -805306368, 292635776, 83627008, 397977600, 596520192, 23401728, 910925376, 110742528, -1011042560, 574619648, 1061188608, 83498624, 292722176, -1138791424, 570425344, -586709504, 136430848, -812756480, -878458624, -138540800, -236173056, -1071095296, 165121312, -944202752, 114755840, -1057292288, -1021359760, 1056964608, -1062590464, 305419896]

    Parameters

    • ctx: any

      SM4 算法上下文

    • key: number[]

      用于解密的密钥(16个8位无符号整数构成的数组)

    Returns void

  • 用于设置 SM4 加密算法的密钥。

    Description

    该方法的作用是用于设置 SM4 加密算法的密钥,其中 ctx 表示 SM4 算法上下文,而 key 则表示用于加密的密钥(由16个8位无符号整数构成的数组)。

    在 SM4Core 类中,该方法主要被用于初始化 SM4 加密算法的上下文。在这个过程中,需要对给定的密钥进行预处理,并生成一组轮密钥。

    Example

    const sm4 = new SM4Core()
    const ctx = { mode: 0, sk: new Array(32) }
    const key = [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10]
    const result = sm4.sm4_setkey_enc(ctx, key)
    console.log(result) // true
    console.log(ctx.sk) // [305419896, -1062590464, 1056964608, -1021359760, -1057292288, 114755840, -944202752, 165121312, -1071095296, -236173056, -138540800, -878458624, -812756480, 136430848, -586709504, 570425344, -1138791424, 292722176, 83498624, 1061188608, 574619648, -1011042560, 110742528, 910925376, 23401728, 596520192, 397977600, 83627008, 292635776, -805306368, -628647168, 46279808, -1154816000]

    Parameters

    • ctx: any

      SM4 算法上下文

    • key: number[]

      用于加密的密钥(16个8位无符号整数构成的数组)

    Returns boolean

    如果操作成功,则返回 true;否则返回 false。

Generated using TypeDoc