Private
CK定义 CK 数组,用于SM4算法的轮函数中的密钥异或操作
Private
FK定义 FK 数组,用于SM4算法的轮函数中的常量异或操作
定义 SM4_DECRYPT 常量,表示解密操作
定义 SM4_ENCRYPT 常量,表示加密操作
Private
Sbox定义 SboxTable 数组,用于SM4算法的S盒置换操作
从数组b中索引位置i开始,获取一个32位无符号整数(大端模式)
在 SM4Core 类中,该方法常被用于解析密钥、明文、密文等数据。由于 SM4 加密算法采用的是大端模式,因此需要通过该方法将小端模式的数据转换为大端模式的数据。
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
数组
索引位置
一个32位无符号整数
对给定的32位无符号整数 x 进行左旋转操作,旋转 n 位。
该方法的作用是对给定的32位无符号整数 x 进行左旋转操作,将其左旋转 n 位,并将结果以32位无符号整数的形式返回。
在 SM4Core 类中,该方法主要被用于 SM4 算法中的置换操作。由于 SM4 算法中使用的所有整数都需要转换为32位无符号整数,因此需要使用左旋转操作来避免出现计算错误。
const sm4 = new SM4Core()
const result = sm4.ROTL(0x12345678, 8)
console.log(result) // 0x34567812
32位无符号整数
左旋转位数
左旋转后的32位无符号整数
对给定的32位无符号整数 x 进行左移操作,移动 n 位。
在 SM4Core 类中,该方法主要被用于 SM4 算法中的置换操作。由于 SM4 算法中使用的所有整数都需要转换为32位无符号整数,因此对于一些比较小的数据,需要进行左移操作,以避免出现计算错误。
const sm4 = new SM4Core()
const result = sm4.SHL(0x12345678, 8)
console.log(result) // 0x34567800
32位无符号整数
左移位数
左移后的32位无符号整数
Private
SWAP用于交换给定数组中两个元素的位置。
该方法的作用是用于交换给定数组 sk 中下标为 i 和 (31 - i) 的两个元素的位置。
在 SM4Core 类中,该方法主要被用于 SM4 解密算法中轮密钥反转。由于 SM4 解密算法需要将轮密钥进行反转,所以需要使用这个方法来交换轮密钥数组中的元素的位置。
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]
数组
元素下标
用于对给定的明文或密文进行填充。
该方法的作用是对给定的明文或密文进行填充。在加密模式下,会将输入的数据按照 SM4 算法的规则进行填充;在解密模式下,会将数据中的填充字节删除。
在 SM4Core 类中,该方法主要被用于 SM4 加密算法和解密算法中对数据进行预处理或后处理。
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]
输入的明文或密文(由8位无符号整数构成的数组)
填充模式:加密模式为 this.SM4_ENCRYPT
,解密模式为 this.SM4_DECRYPT
返回填充后的结果(由8位无符号整数构成的数组)
对给定的32位无符号整数 ka 进行 SM4 算法中的计算轮密钥操作。
该方法的作用是对给定的32位无符号整数 ka,进行 SM4 算法中的计算轮密钥操作,并将结果以32位无符号整数的形式返回。
在 SM4Core 类中,该方法主要被用于 SM4 算法中计算轮密钥。在计算轮密钥操作中,需要将输入数据进行 S 盒置换操作,并通过特定的运算得到最终的轮密钥值。
const sm4 = new SM4Core()
const result = sm4.sm4CalciRK(0x12345678)
console.log(result) // 0xF2CA43F2
32位无符号整数
计算得到的32位无符号整数(轮密钥)
对给定的四个32位无符号整数 x0、x1、x2 和 x3 进行 SM4 算法中的 F(X) 置换操作。
该方法的作用是对给定的四个32位无符号整数 x0、x1、x2 和 x3,以及一个32位无符号整数 rk(轮密钥),进行 SM4 算法中的 F(X) 置换操作,并将结果以32位无符号整数的形式返回。
在 SM4Core 类中,该方法主要被用于 SM4 算法中的轮函数操作。在 F(X) 置换操作中,需要将四个 32 位无符号整数进行异或操作,并通过 L' 置换操作得到最终结果。
const sm4 = new SM4Core()
const result = sm4.sm4F(0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210, 0x01234567)
console.log(result) // 0x44C8FC20
32位无符号整数
32位无符号整数
32位无符号整数
32位无符号整数
32位无符号整数(轮密钥)
置换后的32位无符号整数
对给定的32位无符号整数 ka 进行 SM4 算法中的 L' 置换操作。
该方法的作用是对给定的32位无符号整数 ka,进行 SM4 算法中的 L' 置换操作,并将结果以32位无符号整数的形式返回。
在 SM4Core 类中,该方法主要被用于 SM4 算法中的轮函数操作。L' 置换操作是轮函数中的关键步骤之一,在这个操作中,需要先对每个元素进行 S 盒置换操作,然后再进行 L 置换操作。由于整个过程都是基于32位无符号整数进行计算,因此需要使用一系列辅助函数(包括 PUT_ULONG_BE、GET_ULONG_BE、sm4Sbox、ROTL、SHL 等)对数据进行处理。
const sm4 = new SM4Core()
const result = sm4.sm4Lt(0x12345678)
console.log(result) // 0x3C6EF372
32位无符号整数
置换后的32位无符号整数
对给定的8位无符号整数 inch 进行 SM4 算法中的 S 盒置换操作。
该方法的作用是对给定的8位无符号整数 inch,进行 SM4 算法中的 S 盒置换操作,并将结果以8位无符号整数的形式返回。
在 SM4Core 类中,该方法主要被用于 SM4 算法中的轮函数操作。S 盒置换操作是轮函数中的关键步骤之一,在这个操作中,需要将输入数据映射到一个不同的输出值,从而增强加密算法的混淆性。
const sm4 = new SM4Core()
const result = sm4.sm4Sbox(0x12)
console.log(result) // 0xA4
8位无符号整数
置换后的8位无符号整数
用于对给定的数据进行 SM4 加密或解密操作(CBC 模式)。
该方法的作用是对给定的数据进行 SM4 加密或解密操作,使用 CBC(密码分组链接)模式。在加密模式下,此方法需要输入一个初始化向量 iv,并依次对输入数据的每一块明文进行异或操作后再执行一轮轮加密;在解密模式下,此方法需要输入一个初始化向量 iv,依次对输入数据的每一块密文进行一轮轮解密,然后再与前一块密文进行异或操作。
在 SM4Core 类中,该方法主要被用于 SM4 加密算法和解密算法的 CBC 模式实现。
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,
上下文对象,由 sm4_context
类生成
初始化向量,由8位无符号整数构成的数组。在 CBC 模式下,第一块明文需要与初始化向量进行异或操作,然后再进行加密;后续的每一块明文需要与前一块密文进行异或操作,然后再进行加密。
输入数据(由8位无符号整数构成的数组)
返回加密或解密后的结果(由8位无符号整数构成的数组)
用于对给定的数据进行 SM4 加密或解密操作(ECB 模式)。
该方法的作用是对给定的数据进行 SM4 加密或解密操作,使用 ECB(电子密码本)模式。在加密模式下,此方法对输入数据依次执行一轮轮加密;在解密模式下,此方法对输入数据依次执行一轮轮解密。
在 SM4Core 类中,该方法主要被用于 SM4 加密算法和解密算法的 ECB 模式实现。
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]
上下文对象,由 sm4_context
类生成
输入数据(由8位无符号整数构成的数组)
返回加密或解密后的结果(由8位无符号整数构成的数组)
用于对给定的数据进行一轮 SM4 加密或解密操作。
该方法的作用是对给定的数据进行一轮 SM4 加密或解密操作,并将结果保存到输出数组 output 中。在加密模式下,此方法实现一轮轮加密;在解密模式下,此方法实现一轮轮解密。
在 SM4Core 类中,此方法主要被用于 SM4 加密算法和解密算法中的核心计算过程。
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]
轮密钥数组,由 sm4_setkey
方法生成
输入数据(由8位无符号整数构成的数组)
输出结果(由8位无符号整数构成的数组)
用于对给定的密钥进行预处理,生成一组轮密钥。
该方法的作用是对给定的密钥进行预处理,生成一组轮密钥,并将这些轮密钥保存到数组 SK 中。
在 SM4Core 类中,该方法主要被用于初始化 SM4 加密算法和解密算法的上下文。在这个过程中,需要对给定的密钥进行预处理,并生成一组轮密钥。
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]
用于保存轮密钥的数组
用于加密或解密的密钥(16个8位无符号整数构成的数组)
用于设置 SM4 解密算法的密钥。
该方法的作用是用于设置 SM4 解密算法的密钥,其中 ctx 表示 SM4 算法上下文,而 key 则表示用于解密的密钥(由16个8位无符号整数构成的数组)。
在 SM4Core 类中,该方法主要被用于初始化 SM4 解密算法的上下文。与加密算法不同,解密算法需要将轮密钥反转。
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]
SM4 算法上下文
用于解密的密钥(16个8位无符号整数构成的数组)
用于设置 SM4 加密算法的密钥。
该方法的作用是用于设置 SM4 加密算法的密钥,其中 ctx 表示 SM4 算法上下文,而 key 则表示用于加密的密钥(由16个8位无符号整数构成的数组)。
在 SM4Core 类中,该方法主要被用于初始化 SM4 加密算法的上下文。在这个过程中,需要对给定的密钥进行预处理,并生成一组轮密钥。
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]
SM4 算法上下文
用于加密的密钥(16个8位无符号整数构成的数组)
如果操作成功,则返回 true;否则返回 false。
Generated using TypeDoc
这个类实现了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