常用HMAC,hmac-sm3,hmac-sha系列等

"""
Author: tanglei
DateTime:2024-11-18 完成
微信:ciss_cedar
欢迎一起学习
"""

from enum import Enum

from cryptography.hazmat.primitives import hmac


class HashName(Enum):
    (MD5, sha1, sha224, SHA256, sha384, sha512, blake2b, blake2s,
     shake128,shake256,
     sha3_224, sha3_256, sha3_384, sha3_512, sm3)=(
        'MD5', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512', 'BLAKE2s', 'BLAKE2b',
        'SHAKE128','SHAKE256',
        'SHA3_224', 'SHA3_256', 'SHA3_384', 'SHA3_512', 'SM3')

class Hmac:
    def __init__(self, hash_name,key):
        self.hash_name = hash_name
        self.key=key

    def hmac(self,plaintext:str):
        algorithm=getattr(hmac.hashes, self.hash_name)

        plaintext=plaintext.encode()
        key=bytes.fromhex(self.key)

        if self.hash_name=='BLAKE2b' :
            h_digest = hmac.HMAC(key,algorithm(64))
        elif self.hash_name=='BLAKE2s':
            h_digest = hmac.HMAC(key,algorithm(32))
        elif self.hash_name == 'SHAKE128':
            h_digest = hmac.HMAC(key,algorithm(16))
        elif self.hash_name == 'SHAKE256':
            h_digest = hmac.HMAC(key,algorithm(32))
        else:
            h_digest = hmac.HMAC(key,algorithm())

        h_digest.update(plaintext)
        hmac_bytes=h_digest.finalize()

        return hmac_bytes.hex().upper()

    def hmac_bytes(self, plaintext: bytes):

        if self.hash_name in ('SHAKE128','SHAKE256'):
            hmac_bytes=b'SHAKE128/SHAKE256 Not Support HMAC'
            return hmac_bytes

        algorithm = getattr(hmac.hashes, self.hash_name)

        if self.hash_name=='BLAKE2b' :
            h_digest = hmac.HMAC(self.key,algorithm(64))
        elif self.hash_name=='BLAKE2s':
            h_digest = hmac.HMAC(self.key,algorithm(32))
        elif self.hash_name == 'SHAKE128':
            h_digest = hmac.HMAC(self.key,algorithm(16))
        elif self.hash_name == 'SHAKE256':
            h_digest = hmac.HMAC(self.key,algorithm(32))

        else:
            h_digest = hmac.HMAC(self.key,algorithm())

        h_digest.update(plaintext)
        hmac_bytes = h_digest.finalize()

        return hmac_bytes

def main():
    # 传入str
    key='2934412A66B7A186DC35DC40E926F9EE'
    plaintext = '1'

    Hash_Select = HashName.blake2b.value
    myHmac=Hmac(Hash_Select,key)
    hmac_value=myHmac.hmac(plaintext)
    method = 'hmac'
    print(f'{Hash_Select}.{method}={hmac_value}')


    # 传入bytes

    key='2934412A66B7A186DC35DC40E926F9EE'
    key=bytes.fromhex(key)
    plaintext = '1'
    plaintext=plaintext.encode()
    myHmac=Hmac(HashName.blake2b.value,key)
    hmac_bytes_value=myHmac.hmac_bytes(plaintext)
    method = 'hmac_bytes'
    print(f'{Hash_Select}.{method}={hmac_bytes_value}')

    hmac_value=hmac_bytes_value.hex().upper()
    method = 'hmac_bytes.hex'
    print(f'{Hash_Select}.{method}={hmac_value}')

if __name__ == '__main__':
    main()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值