Closed zjcnew closed 4 years ago
you can try to code
# 电子密码本(ECB) def encrypt_ecb(plain_text, key): """ SM4(ECB)加密 :param plain_text: 明文 :param key: 密钥, 小于等于16字节 """ plain_text = _padding(plain_text, mode=SM4_ENCRYPT) if plain_text is None: return # 密钥检验 key = _key_iv_check(key_iv=key) plain_hex = _hex(plain_text) cipher_hex_list = [] for i in _range(len(plain_text) // BLOCK_BYTE): sub_hex = plain_hex[i * BLOCK_HEX:(i + 1) * BLOCK_HEX] cipher = encrypt(clear_num=int(sub_hex, 16), mk=int(_hex(key), 16)) cipher_hex_list.append(num2hex(num=cipher, width=BLOCK_HEX)) cipher_text = b64encode(_unhex(''.join(cipher_hex_list))) return cipher_text if PY2 else cipher_text.decode(E_FMT) def decrypt_ecb(cipher_text, key): """ SM4(ECB)解密 :param cipher_text: 密文 :param key: 密钥, 小于等于16字节 """ cipher_text = b64decode(cipher_text) cipher_hex = _hex(cipher_text) # 密码检验 key = _key_iv_check(key_iv=key) plain_hex_list = [] for i in _range(len(cipher_text) // BLOCK_BYTE): sub_hex = cipher_hex[i * BLOCK_HEX:(i + 1) * BLOCK_HEX] plain = decrypt(cipher_num=int(sub_hex, 16), mk=int(_hex(key), 16)) plain_hex_list.append(num2hex(num=plain, width=BLOCK_HEX)) plain_text = _padding(_unhex(''.join(plain_hex_list)), mode=SM4_DECRYPT) return plain_text if PY2 else plain_text.decode(E_FMT) # 密码块链接(CBC) def encrypt_cbc(plain_text, key, iv): """ SM4(CBC)加密 :param plain_text: 明文 :param key: 密钥, 小于等于16字节 :param iv: 初始化向量, 小于等于16字节 """ plain_text = _padding(plain_text, mode=SM4_ENCRYPT) if plain_text is None: return # 密钥检验 key = _key_iv_check(key_iv=key) # 初始化向量监测 iv = _key_iv_check(key_iv=iv) plain_hex = _hex(plain_text) ivs = [int(_hex(iv), 16)] for i in _range(len(plain_text) // BLOCK_BYTE): sub_hex = plain_hex[i * BLOCK_HEX:(i + 1) * BLOCK_HEX] cipher = encrypt(clear_num=(int(sub_hex, 16) ^ ivs[i]), mk=int(_hex(key), 16)) ivs.append(cipher) cipher_text = b64encode(_unhex(''.join([num2hex(num=c, width=BLOCK_HEX) for c in ivs[1:]]))) return cipher_text if PY2 else cipher_text.decode(E_FMT) def decrypt_cbc(cipher_text, key, iv): """ SM4(CBC)解密 :param cipher_text: 密文 :param key: 密钥 小于等于16字节 :param iv: 初始化向量 小于等于16字节 """ cipher_text = b64decode(cipher_text) cipher_hex = _hex(cipher_text) # 密钥检测 key = _key_iv_check(key_iv=key) # 初始化向量检测 iv = _key_iv_check(key_iv=iv) ivs = [int(_hex(iv), 16)] plain_hex_list = [] for i in _range(len(cipher_text) // BLOCK_BYTE): sub_hex = cipher_hex[i * BLOCK_HEX:(i + 1) * BLOCK_HEX] cipher = int(sub_hex, 16) plain = (ivs[i] ^ decrypt(cipher_num=cipher, mk=int(_hex(key), 16))) ivs.append(cipher) plain_hex_list.append(num2hex(num=plain, width=BLOCK_HEX)) plain_text = _padding(_unhex(''.join(plain_hex_list)), mode=SM4_DECRYPT) return plain_text if PY2 else plain_text.decode(E_FMT)
you can try to code