Python3 SM3 encoder

本文介绍并实现了SM3密码哈希算法的Python版本,包括从Python2到Python3的适配。主要内容涵盖SM3算法的核心步骤,如初始化、消息预处理、压缩函数等,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用块内容
参考原始python 2 版本
http://co63oc.blog.51cto.com/904636/954086

修改为python3 版本,主要区别是python2-3中struct.pack的返回值的类型不同,python3的返回为byte类型,python2为str 类型。

import struct 

IV="7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e" 

IV = int(IV.replace(" ", ""), 16) 

a = [] 
for i in range(0, 8): 
        a.append(0) 
        a[i] = (IV >> ((7 - i) * 32)) & 0xFFFFFFFF 
IV = a

def out_hex(list1): 
        for i in list1: 
                print ("%08x" % i) 
        print ("\n") 

def rotate_left(a, k): 
        k = k % 32 
        return ((a << k) & 0xFFFFFFFF) | ((a & 0xFFFFFFFF) >> (32 - k)) 

T_j = [] 
for i in range(0, 16): 
        T_j.append(0) 
        T_j[i] = 0x79cc4519 
for i in range(16, 64): 
        T_j.append(0) 
        T_j[i] = 0x7a879d8a 

def FF_j(X, Y, Z, j): 
        if 0 <= j and j < 16: 
                ret = X ^ Y ^ Z 
        elif 16 <= j and j < 64: 
                ret = (X & Y) | (X & Z) | (Y & Z) 
        return ret 

def GG_j(X, Y, Z, j): 
        if 0 <= j and j < 16: 
                ret = X ^ Y ^ Z 
        elif 16 <= j and j < 64: 
                #ret = (X | Y) & ((2 ** 32 - 1 - X) | Z) 
                ret = (X & Y) | ((~ X) & Z) 
        return ret 

def P_0(X): 
        return X ^ (rotate_left(X, 9)) ^ (rotate_left(X, 17)) 

def P_1(X): 
        return X ^ (rotate_left(X, 15)) ^ (rotate_left(X, 23)) 


def hash_msg(msg): 
        len1 = len(msg) 
        reserve1 = len1 % 64 
        msg1 = msg.encode() + struct.pack("B",128)
        reserve1 = reserve1 + 1 
        for i in range(reserve1, 56): 
                msg1 = msg1 + struct.pack("B",0) 

        bit_length = (len1) * 8 
        bit_length_string = struct.pack(">Q", bit_length) 
        msg1 = msg1 + bit_length_string 

        print (len(msg1) )
        group_count = int(len(msg1) / 64 )
        print(group_count)

        m_1 = B = [] 
        for i in range(0, group_count): 
                B.append(0) 
                B[i] = msg1[i*64:(i+1)*64] 

        V = [] 
        V.append(0) 
        V[0] = IV 
        for i in range(0, group_count): 
                V.append(0) 
                V[i+1] = CF(V[i], B[i]) 

        return V[i+1] 
print ("abc") 
y = hash_msg("abc") 
print ("result: ")
out_hex(y) 

"""
66c7f0f4 62eeedd9 d1f2d46b dc10e4e2 4167c487 5cf2f7a2 297da02b 8f4ba8e0
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值