国密算法Go语言实现(详解)(六) ——SM2(椭圆曲线公钥密码算法)
原创代码:https://github.com/ZZMarquis/gm
引用时,请导入原创代码库。本文仅以注释方式详解代码逻辑,供学习研究使用。
对原创代码的修改内容
- 修改了部分常量、变量、结构体属性的名称, 以便与GO语言标准包规范相统一
- 加入中文注释,解释代码逻辑
注释者及联系邮箱
Paul Lee
paul_lee0919@163.com
const (
// BitSize 代表曲线基础域的比特长度
BitSize = 256
// KeyBytes 代表秘钥的字节长度,其中加7整除8其实是“向上取整”,用以兼容基础域位数不是8的整数倍的情况。
KeyBytes = (BitSize + 7) / 8
// UnCompress 代表椭圆曲线上的点采用“未压缩”的形式存储,占1个字节,详见国标1-4.1.(b)的定义。
UnCompress = 0x04
)
以上为SM2算法定义的三个常数:
- BitSize 代表曲线基础域的比特长度
- KeyBytes 代表秘钥的字节长度,其中加7整除8其实是“向上取整”,用以兼容基础域位数不是8的整数倍的情况
- UnCompress 代表椭圆曲线上的点采用“未压缩”的形式存储,占1个字节,详见国标1-4.1.(b)的定义
// CipherTextType 是为了区分两个版本SM2国标在密文形式上的区别而创设的枚举类
type CipherTextType int32
const (
//C1C2C3 代表旧标准[GM/T 0009-2012]的密文顺序
C1C2C3 CipherTextType = 1
//C1C3C2 代表新标准[GB/T 32918-2016]的密文顺序
C1C3C2 CipherTextType = 2
)
CipherTextType是为了区分新旧两个版本的国标规范而设置的密文顺序标识枚举类,其中:
- C1C2C3 代表旧标准[GM/T 0009-2012]的密文顺序
- C1C3C2 代表新标准[GB/T 32918-2016]的密文顺序
var