SM4,ECB,CBC

from gmssl.sm4 import CryptSM4, SM4_ENCRYPT, SM4_DECRYPT
import binascii
from heapq import heappush, heappop
from collections import OrderedDict
class SM4():
    def __init__(self,key,mode):
        self.key=key.encode('utf-8')
        self.mode=mode
        self.iv = 'adsqqwertyuioplk'.encode('utf-8')
        self.crypt_sm4 = CryptSM4()
    def str_to_hexStr(self, hex_str):

        hex_data = hex_str.encode('utf-8')
        str_bin = binascii.unhexlify(hex_data)
        return str_bin.decode('utf-8')
    def encrypt(self,value):
        if self.mode=='ECB':
            crypt_sm4 = self.crypt_sm4
            crypt_sm4.set_key(self.key, SM4_ENCRYPT)
            encrypt_value = crypt_sm4.crypt_ecb(value.encode('utf-8')) #  bytes类型

        elif self.mode=='CBC':
            crypt_sm4 = self.crypt_sm4
            crypt_sm4.set_key(self.key, SM4_ENCRYPT)
            encrypt_value = crypt_sm4.crypt_cbc(self.iv , value.encode('utf-8')) #  bytes类型
        return encrypt_value.hex()

    def decrypt(self,encrypt_value):
        if self.mode=='ECB':
            crypt_sm4 = self.crypt_sm4
            crypt_sm4.set_key(self.key, SM4_DECRYPT)
            decrypt_value = crypt_sm4.crypt_ecb(bytes.fromhex(encrypt_value)) #  bytes类型

        elif self.mode=='CBC':
            crypt_sm4 = self.crypt_sm4
            crypt_sm4.set_key(self.key, SM4_DECRYPT)
            decrypt_value = crypt_sm4.crypt_cbc(self.iv , bytes.fromhex(encrypt_value)) #  bytes类型

        return self.str_to_hexStr(decrypt_value.hex())

str_data = "1234567890QWERTY"
key="3l5butlj26hvv313"
print("请输入加密模式")
mode=input()
SM4 = SM4(key,mode)
print("待加密内容:", str_data)
encoding = SM4.encrypt(str_data)
print("国密sm4加密后的结果:", encoding)
print("国密sm4解密后的结果:", SM4.decrypt(encoding))

### SM4加密算法ECB模式与CBC模式的区别 #### ECB模式特点 在ECB(Electronic Codebook)模式下,SM4加密算法对待加密的消息按固定长度分组,并对每一组分别进行独立的加密操作。这意味着相同的明文块会得到完全一致的密文输出[^1]。 这种特性使得ECB模式易于实现且支持多线程并行计算,提高了效率;然而,由于缺乏前后关联性,当输入存在重复的数据片段时,这些部分会在对应的密文中显现出来,从而降低了安全性[^4]。 #### CBC模式特点 相比之下,在CBC(Cipher Block Chaining)模式里,除了初始向量外,每一个新的明文块都会先与其前面一个被加密后的密文块做异或运算后再送入到SM4引擎中去处理。这样即使两个不同的位置上有相等的内容也不会产生相同的密文序列,增强了抗攻击能力[^2]。 不过需要注意的是,因为每次都需要等待上一轮的结果才能继续下一步的操作,所以相较于ECB而言,整体性能有所下降。 ```csharp // C# 实现SM4-CBC模式简单示例 using System; using Org.BouncyCastle.Crypto.Parameters; // 假设使用 Bouncy Castle 库 using Org.BouncyCastle.Crypto.Engines; public class Sm4Example { public static byte[] EncryptWithSm4Cbc(byte[] key, byte[] iv, byte[] plainTextBytes){ var engine = new Sm4Engine(); var parameters = new ParametersWithIV(new KeyParameter(key), iv); engine.Init(true, parameters); int blockSize = engine.GetBlockSize(); byte[] output = new byte[engine.ProcessBlock(plainTextBytes, 0, blockSize)]; return output; } } ``` #### 场景适用性分析 - **适合采用ECB的情况** 对于那些不涉及敏感信息传输的应用场景来说,比如图像压缩等领域内某些特定类型的文件头校验码生成等场合,可以选择ECB模式以获得更高的吞吐率[^3]。 - **推荐使用CBC的情形** 当涉及到网络通信、存储重要资料或者其他任何需要高度保密性的环境当中,则应优先考虑运用CBC模式来保障信息安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值