基于liboqs的FALCON密钥与签名存储及验证问题求助
解决liboqs Falcon-512密钥、签名的存储与验证问题
核心问题分析
- 直接合并写入字节到文件:读取时无法区分两个字节块,第二次读取会得到空字节
- Base64处理不完整:未完成「字节→Base64字符串→写入文件」和「读取字符串→Base64解码→字节」的完整流程
- 误用cryptography模块:liboqs返回的密钥是原始字节,不是该模块的密钥对象,因此无法调用其序列化方法
正确解决方案
方案1:二进制文件分别存储(推荐)
将公钥、签名存入独立的二进制文件,从根源避免数据混淆。
生成并写入文件的代码(signer.py)
import oqs import pprint message = "Secret messagea".encode('utf-8') algo = "Falcon-512" with oqs.Signature(algo) as falcon: # 生成密钥对与签名 pub_key = falcon.generate_keypair() pri_key = falcon.export_secret_key() sign = falcon.sign(message) # 本地验证签名(确认生成正确) check = falcon.verify(message, sign, pub_key) print("Valid signature?", check) # 写入公钥到二进制文件 with open("falcon_pubkey.bin", "wb") as f: f.write(pub_key) # 写入签名到二进制文件 with open("falcon_signature.bin", "wb") as f: f.write(sign) # 可选:保存私钥(仅用于后续签名,验证环节不需要) with open("falcon_privkey.bin", "wb") as f: f.write(pri_key)
读取并验证的代码(verifier.py)
import oqs message = "Secret messagea".encode('utf-8') algo = "Falcon-512" # 读取公钥 with open("falcon_pubkey.bin", "rb") as f: pub_key = f.read() # 读取签名 with open("falcon_signature.bin", "rb") as f: sign = f.read() # 执行签名验证 with oqs.Signature(algo) as falcon: is_valid = falcon.verify(message, sign, pub_key) print("Signature verification result:", is_valid)
方案2:Base64编码存储(适合文本格式传输)
将字节数据编码为Base64字符串,存入文本文件,读取时解码回原始字节。
生成并写入文件的代码(signer.py)
import oqs import base64 message = "Secret messagea".encode('utf-8') algo = "Falcon-512" with oqs.Signature(algo) as falcon: pub_key = falcon.generate_keypair() sign = falcon.sign(message) check = falcon.verify(message, sign, pub_key) print("Valid signature?", check) # 编码为Base64字符串 pub_key_b64 = base64.b64encode(pub_key).decode('utf-8') sign_b64 = base64.b64encode(sign).decode('utf-8') # 写入文本文件(每行存储一个数据) with open("falcon_data.txt", "w") as f: f.write(pub_key_b64 + "\n") f.write(sign_b64 + "\n")
读取并验证的代码(verifier.py)
import oqs import base64 message = "Secret messagea".encode('utf-8') algo = "Falcon-512" # 读取文本文件并解码 with open("falcon_data.txt", "r") as f: pub_key_b64 = f.readline().strip() sign_b64 = f.readline().strip() pub_key = base64.b64decode(pub_key_b64) sign = base64.b64decode(sign_b64) # 执行签名验证 with oqs.Signature(algo) as falcon: is_valid = falcon.verify(message, sign, pub_key) print("Signature verification result:", is_valid)
原方法失败原因解释
- 合并写入字节文件:
file.read()会一次性读取文件所有内容,第二次file.read()只能读到空字节,无法拆分公钥和签名。 - Base64处理错误:仅执行了解码步骤,未先将字节编码为Base64字符串再写入文件,导致读取后解码的数据不匹配。
- cryptography模块误用:liboqs返回的密钥是原始二进制字节流,不是cryptography库的密钥对象,因此不能调用
public_bytes()这类方法。若需PEM格式,可手动添加PEM头尾(如-----BEGIN FALCON PUBLIC KEY-----),但liboqs本身支持直接处理原始字节,无需转换即可验证。
内容的提问来源于stack exchange,提问作者Blake
相关产品推荐
相关产品推荐

