国密算法Go语言实现(详解)(三) ——SM3(杂凑算法)
原创代码:https://github.com/ZZMarquis/gm
引用时,请导入原创代码库。本文仅以注释方式详解代码逻辑,供学习研究使用。
对原创代码的修改内容
- 修改了部分常量、变量、结构体属性的名称, 以便与GO语言标准包规范相统一
- 加入中文注释,解释代码逻辑
- 在SM3算法中,将常数BlockSize修改为“字节长度”而不是“字长”,与GO语言标准包相统一
注释者及联系邮箱
Paul Lee
paul_lee0919@163.com
// p0() 为国标4.4条规定的置换函数。
// 直接引入GO语言标准库bits.RotateLeft32()方法。
func p0(x uint32) uint32 {
r9 := bits.RotateLeft32(x, 9)
r17 := bits.RotateLeft32(x, 17)
return x ^ r9 ^ r17
}
p0() 为国标4.4条规定的置换函数。
值得称道的是,作者直接引入了GO语言标准库bits.RotateLeft32()方法,简化了代码。
// p1() 为国标4.4条规定的置换函数。
// 直接引入GO语言标准库bits.RotateLeft32()方法。
func p1(x uint32) uint32 {
r15 := bits.RotateLeft32(x, 15)
r23 := bits.RotateLeft32