C++ Miracl库如何实现G1、GT群元素及Big对象的序列化与反序列化?
C++版Miracl库序列化相关问题解答
关于直接保存G1对象的40个字节是否可行
这种方案不推荐使用,隐患非常大:sizeof(G1)返回的是G1类实例在当前编译环境下的内存占用大小,内存布局会受编译选项、字节对齐规则、曲线参数配置、编译器版本的影响,跨程序、跨设备、跨编译环境直接加载原始内存字节大概率会解析失败,还可能读取到未初始化的垃圾值,引发不可预期的错误。Miracl自带的序列化方案
不需要借助第三方库,Miracl本身已经为Big、G1、G2、GT这类密码学常用类型提供了标准化的序列化/反序列化接口:
- 针对
Big大数类型:可以调用toBinary()方法将大数转换为字节流,调用fromBinary()方法从字节流还原大数,字节长度可以提前通过大数对应的模长计算得到,加密解密两端保持统一即可。 - 针对
G1/G2/GT群元素类型:可以调用toBytes()方法将群元素导出为标准字节流,支持压缩模式(减少序列化后的体积),调用fromBytes()方法即可从字节流还原群元素。只要加密、解密两个程序初始化时使用的是完全一致的曲线参数,还原后的群元素和原始元素完全等价,不会影响加密解密的正确性。
- 实现拆分加密、解密程序的步骤
你可以按照以下逻辑修改现有的单程序示例:
- 加密程序:完成密钥生成、加密逻辑后,将密文包含的所有
Big、G1、GT对象依次调用对应序列化接口转为字节流,按自定义的格式写入文件即可。 - 解密程序:初始化相同的曲线参数后,从文件按顺序读取对应长度的字节流,依次调用反序列化接口还原为对应的
Big、群元素对象,再执行解密逻辑即可。
内容的提问来源于stack exchange,提问作者zbo
相关产品推荐
相关产品推荐

