python写一个sm3 hash加密算法代码

代码语言:python

所属分类:其他

代码描述:python写一个sm3 hash加密算法代码

代码标签: python sm3 hash 加密 算法 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

# -*- coding:utf-8 -*-
 
"""
:author: liyebei
:date: 2022-08-06
:description: SM3加密算法。 适用于python2.7+, python3.5+(用python3时暂不支持对中文的加密)
"""
 
# 初始值
iv = 0x7380166f4914b2b9172442d7da8a0600a96f30bc163138aae38dee4db0fb0e4e
MAX = 2 ** 32
 
 
def str2bin(msg):
    """
    字符串转比特串
    :param msg: 字符串
    :return: 转换之后的比特串
    """
    l = len(msg)
    s_dec = 0
    for m in msg:
        s_dec = s_dec << 8
        s_dec += ord(m)
 
    msg_bin = bin(s_dec)[2:].zfill(l * 8)
    return msg_bin
 
 
def int2bin(a, k):
    """
    将整数转化为比特串
    :param a: 待转化的整数
    :param k: 比特串的长度
    :return: 转化后长度为k的比特串
    """
    return bin(a)[2:].zfill(k)
 
 
def int2hex(a, k):
    """
    整数转化为16进制的字符串,前补0补齐k位数
    :param a: 整数
    :param k: 补齐后的字符串长度
    :return: 转化后的16进制形式字符串
    """
    return hex(a)[2:].zfill(k)
 
 
def bin2hex(a, k):
    """
    比特串转化为16进制的字符串,前补0补齐k位数
    :param a: 待转化的比特串
    :param k: 补齐后的字符串长度
    :return: 长度为k的16进制字符串
    """
    #return hex(int(a, 2))[2:].zfill(k)
    #对于python2需去除长整型引入的字符L
    return hex(int(a, 2))[2:].replace('L', '').zfill(k)
 
 
def msg_fill(msg_bin):
    """
    对消息进行填充。填充后的消息满足:(l+1+k) mod 512 = 448 k取最小值
    :param msg_bin: 比特串形式的消息
    :return: 填充后的消息(比特串形式)
    """
    l = len(msg_bin)
    k = 448 - (l + 1) % 512
    if k < 0:
        k += 512
 
    l_bin = int2bin(l, 64)
    msg_filled = msg_bin + '1' + '0' * k + l_bin
 
    return msg_filled
 
 
def iteration_func(msg):
    """
    迭代压缩
    :param msg: 填充后的比特串消息
    :return: 迭代压缩后的消息,长度为64的字符串
    """
    # 将填充后的消息按512比特进行分组
    n = len(msg) // 512
    b = []
    for i in range(n):
        b.append(msg[512 * i:512 * (i + 1)])
 
    # 对消息进行迭代压缩
    v = [int2bin(iv, 256)]
    for i in range(n):
        v.append(cf(v[i], b[i]))
 
    return bin2hex(v[n], 64)
 
 
def msg_extension(bi):
    """
    消息扩展, 将消息分组bi扩展生成132个字W0, W1, · · · , W67, W0', W1&.........完整代码请登录后点击上方下载按钮下载查看

网友评论0