银行卡密码键盘 SM4 ECB模式+ANSI X9.8 格式标准(带主账号信息)PIN 加解密示例

1.软加解密示例

————————————————————————————————————————————------
已知数据:
银行测试主密钥TMK: 1234567890ABCDEFABCDEF0987654321
通过签到接口得到:
工作密钥密文KeyValue :3D66234C49E4296FF9C78D8BACBD6A76
工作密钥校验值CheckValue : 861E83E31FAEBF10

——————————————————————————————————————————————

1.计算PIN_BLOCK,方法为ANSI X9.8 格式标准(带主账号信息)
银行卡密码明文 PIN 123654
账号:6230606601007726888

主账号和PIN 按位异或(32位)
pin: 06123654FFFFFFFFFFFFFFFFFFFFFFFF
PAN: 00000000000000000000660100772688
XOR: 06123654FFFFFFFFFFFF99FEFF88D977

即 PIN_BLOCK 为 06123654FFFFFFFFFFFF99FEFF88D977

跟银行确认好,PIN_BLOCK 是 16位还是32位的。

在这里插入图片描述


2.把签到接口的返回值 KeyValue(工作密钥密文)由密文解密为明文,
方法为SM4 ecb模式

解密数据 3D66234C49E4296FF9C78D

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用pycryptodom库编写SM4算法的Enc模式,Dec模式Ecb模式解密示例代码: ```python from Crypto.Cipher import SM4 # SM4密函数,使用ECB模式 def sm4_encrypt_ecb(key, plaintext): cipher = SM4.new(key, SM4.MODE_ECB) ciphertext = cipher.encrypt(plaintext) return ciphertext.hex() # SM4解密函数,使用ECB模式 def sm4_decrypt_ecb(key, ciphertext): cipher = SM4.new(key, SM4.MODE_ECB) plaintext = cipher.decrypt(bytes.fromhex(ciphertext)) return plaintext.decode() # SM4密函数,使用CBC模式 def sm4_encrypt_cbc(key, iv, plaintext): cipher = SM4.new(key, SM4.MODE_CBC, iv) ciphertext = cipher.encrypt(plaintext) return ciphertext.hex() # SM4解密函数,使用CBC模式 def sm4_decrypt_cbc(key, iv, ciphertext): cipher = SM4.new(key, SM4.MODE_CBC, iv) plaintext = cipher.decrypt(bytes.fromhex(ciphertext)) return plaintext.decode() # 测试代码 if __name__ == '__main__': # SM4密钥,长度为16字节 key = b'0123456789abcdef' # 明文,长度必须是16的倍数 plaintext = b'Hello, SM4!' # 初始化向量,长度为16字节 iv = b'1234567890abcdef' # 测试ECB模式解密 ciphertext = sm4_encrypt_ecb(key, plaintext) print('SM4 ECB mode encrypted ciphertext:', ciphertext) decrypted_plaintext = sm4_decrypt_ecb(key, ciphertext) print('SM4 ECB mode decrypted plaintext:', decrypted_plaintext) # 测试CBC模式解密 ciphertext = sm4_encrypt_cbc(key, iv, plaintext) print('SM4 CBC mode encrypted ciphertext:', ciphertext) decrypted_plaintext = sm4_decrypt_cbc(key, iv, ciphertext) print('SM4 CBC mode decrypted plaintext:', decrypted_plaintext) ``` 注:本示例代码仅供参考,请勿用于非法用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值