上海市网站设计公司,教育网站建设情况报告,义乌建设银行交罚款网站,杭州优化排名哪家好目录
1.数据的不同表现形式签名值不一样#xff1f;
2.Binascii模块简介
3.问题定位
4.问题总结 1.数据的不同表现形式签名值不一样#xff1f;
Happy Muscle试运行了一段时间#xff0c;组内同事再一次提出了新的需求#xff1a;需要对bin文件签名。 PS#xff1a;服…目录
1.数据的不同表现形式签名值不一样
2.Binascii模块简介
3.问题定位
4.问题总结 1.数据的不同表现形式签名值不一样
Happy Muscle试运行了一段时间组内同事再一次提出了新的需求需要对bin文件签名。 PS服了你把bin导成asc文件再签名不行吗 不过内部客户也是客户就是上帝还是抓点紧继续完善工具。
这个思路还是很明确拖转bin文件到输入框显示路径供用户检查后台根据路径识别bin文件解析成算法所需格式最终完成签名。
前几步还是非常简单问题出在解析bin文件转为算法所需格式上现象如下 将bin文件解析为算法所需格式并打印出来完全木有问题呀(上图红框)为啥这个签名值不对头呢 Openssl 签名值 HappyMuscle对原始数据签名 HappyMuscle解析bin后的签名 那问题就出在了对原始数据和bin文件的解析上来看代码
if self.rb_rsa_genkey_2.isChecked() :filepath self.te_rsa_plaintext.toPlainText()[8:]binfile open(filepath,rb).read()asymobjcal.rsa_pt binascii.b2a_hex(binfile)
else:asymobjcal.rsa_pt binascii.unhexlify(self.te_rsa_plaintext.toPlainText().strip().replace(\n,).replace(0x, ).replace(,,).replace( ,))
2.Binascii模块简介
这里用到了binascii模块该模块包含许多在二进制和各种ascii编码的二进制表示之间进行转换的方法常见方法总结如下
binascii.b2a_hex(data[, sep[, bytes_per_sep1]])
将二进制数据转为十六进制的表现形式如下 binascii.b2a_hex(b\xb9\x01\xef)
bb901ef
sep可以是单个符合或者字节对象如果配置了就会在步长(bytes_per_sep)后加入符号如下 binascii.hexlify(b\xb9\x01\xef, -)
bb9-01-efbinascii.b2a_hex(b\xb9\x01\xef, b_, 2)
bb9_01efbinascii.b2a_hex(b\xb9\x01\xef, b , -2)
bb901 ef 方法hexlify(data[, sep[, bytes_per_sep1]])有同样的效果。
binascii.a2b_hex(hexstr)
很明显这个就是返回十六进制字符串hexstr表示的二进制数据就是b2a_hex()的逆向返回的是data。
binascii.crc32(data[, value])
用于计算data的CRC-32的校验和如下
print(binascii.crc32(bhello world))
# Or, in two pieces:
crc binascii.crc32(bhello)
crc binascii.crc32(b world, crc)
print(crc32 {:#010x}.format(crc))
在给文件或者数据签名时 所需要的数据类型为bytes
那么问题就很好定位了。
3.问题定位
在代码实现里如果是以bin的形式加载进来我是先读取文件再转为调用b2a_hex打印出来b0008022079.....类型为byte然后再去签名 但在这个时候我们来查看rsa_pt的类型 字节长度居然来到了4880再回过头看文档这句话非常关键 Return the hexadecimal representation of the binary data. Every byte of data is converted into the corresponding 2-digit hex representation. The returned bytes object is therefore twice as long as the length of data. 转为十六进制表现形式长度为原来的两倍
回过头来既然我都可以调用b2a_hex()那说明现在binfile类型本身就是byte我们debug来看下 这个字节长度就是没问题的直接将这个文件读取在送入签名就可以了解决如下
asymobjcal.rsa_pt open(filepath,rb).read()
最终完成签名 4.问题总结
这个问题归根结底还是在于自己对于模块各种方法的返回类型不够了解在使用python时基本都是边写边查也没有仔细看官方文档。
通过解决这个小问题Happy Muscle功能进一步增强就酱