简单加密算术库 (SEAL) 和 seal::Ciphertext 变量

Simple Encrypted Arithmetic Library (SEAL) and the seal::Ciphertext variable(简单加密算术库 (SEAL) 和 seal::Ciphertext 变量)
本文介绍了简单加密算术库 (SEAL) 和 seal::Ciphertext 变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

I'm using the Simple Encrypted Arithmetic Library (SEAL) library from Microsoft Cryptography Research Group. Is there a way to get the content of seal::Ciphertext variable? I've tried to understand the ciphertext.h and ciphertext.cpp and found the:

/**
Saves the ciphertext to an output stream. The output is in binary format and not 
human-readable. The output stream must have the "binary" flag set.

@param[in] stream The stream to save the ciphertext to
@see load() to load a saved ciphertext.
*/
void save(std::ostream &stream) const;

/**
Loads a ciphertext from an input stream overwriting the current ciphertext.

@param[in] stream The stream to load the ciphertext from
@see save() to save a ciphertext.
*/
void load(std::istream &stream);

But I coudn't find another option to get the content of anyseal::Ciphertext variable that is not a binary stream or just a pointer to some memory address and save it a string.

If any of you have download the SEAL library from the link above and extracted it without changing anything. You can find all the allowed operations on seal::Ciphertext in SEAL_2.3.1SEALsealciphertext.h and SEAL_2.3.1SEALsealciphertext.cpp

解决方案

Short answer is that there are no other ways of accessing the ciphertext data in SEAL. The pointer returned by Ciphertext::data will give you direct access to the ciphertext data and in that sense allows you to do any kind of computation on it, e.g. converting to a human-readable string if for some reason you would want to do that.

Of course to do anything intelligible you need to know the data layout of the ciphertext. In the BFV scheme a ciphertext consists of a pair of polynomials (c0, c1) with large (size coeff_modulus) coefficients. Since operating on polynomials with such large coefficients is inconvenient, SEAL 2.3.1 instead uses a composite coeff_modulus and stores both c0 and c1 modulo each of the prime factors specified in the coeff_modulus (denote these factors q1,q2,...,qk). Each qi fits into a 64-bit word, so all of these 2k polynomials have word-size coefficients.

The ciphertext coefficient data layout is as follows (contiguous in memory):

[ c0 mod q1 ][ c0 mod q2 ]...[ c0 mod qk ][ c1 mod q1 ][ c1 mod q2 ]...[ c1 mod qk ]

where each [ ci mod qj ] looks like

[ c0[0] mod qj ][ c1[0] mod qj ]...[ cn-1[0] mod qj ]

Here I used ci[k] to denote the degree k coefficient of ci. Note that each coefficient is stored in a uint64_t.

Ciphertext::data returns a pointer to the constant coefficient of the c0 polynomial with respect to the first modulus in your coeff_modulus, i.e. to c0[0] mod q1. In addition to this coefficient data, a Ciphertext contains a few other fields that you can read using the member functions.

这篇关于简单加密算术库 (SEAL) 和 seal::Ciphertext 变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Rising edge interrupt triggering multiple times on STM32 Nucleo(在STM32 Nucleo上多次触发上升沿中断)
How to use va_list correctly in a sequence of wrapper functions calls?(如何在一系列包装函数调用中正确使用 va_list?)
OpenGL Perspective Projection Clipping Polygon with Vertex Outside Frustum = Wrong texture mapping?(OpenGL透视投影裁剪多边形,顶点在视锥外=错误的纹理映射?)
How does one properly deserialize a byte array back into an object in C++?(如何正确地将字节数组反序列化回 C++ 中的对象?)
What free tiniest flash file system could you advice for embedded system?(您可以为嵌入式系统推荐什么免费的最小闪存文件系统?)
Volatile member variables vs. volatile object?(易失性成员变量与易失性对象?)