c – ECIES公钥序列化
发布时间:2020-12-16 07:13:41 所属栏目:百科 来源:网络整理
导读:我写的是Client / Server加密程序,想要发送ECIES公钥.为此我必须将公钥序列化为文件,将文件读取到字节数组,发送此字节数组.另一方面:接收字节数组,将其写入文件,从文件反序列化公钥.所以,我写了一些测试项目,尝试与伟大的系统分开进行,并且(当所有这个模块
我写的是Client / Server加密程序,想要发送ECIES公钥.为此我必须将公钥序列化为文件,将文件读取到字节数组,发送此字节数组.另一方面:接收字节数组,将其写入文件,从文件反序列化公钥.所以,我写了一些测试项目,尝试与伟大的系统分开进行,并且(当所有这个模块都能成功运行时)只需将它插入我的项目中.该项目的代码是:
class EncoderRSA { public: EncoderRSA(); void keyGeneration(); std::string encrypt(std::string plainText); std::string decrypt(std::string cypher); void setRsaPublicKey(char *publicKeyInCharArray); char *getRsaPublicKey(); private: AutoSeededRandomPool prng; // Pseudo Random Number Generator ECIES<ECP>::Decryptor rsaDecryptor; ECIES<ECP>::Encryptor rsaEncryptor; }; 而且,严格来说,素数(问题)方法: char *EncoderRSA::getRsaPublicKey() { std::string file = "publicKey.txt"; //Save public key in file FileSink sink(file.c_str()); this->rsaEncryptor.GetPublicKey().Save(sink); //Read file with public key into the buffer std::ifstream infile (file.c_str(),std::ifstream::binary); if (!infile.is_open()) { std::cout << "Can't open file to write" << std::endl; exit(1); } // get size of file infile.seekg (0,infile.end); long size = infile.tellg(); infile.seekg (0); // allocate memory for file content char* buffer = new char[size]; infile.read (buffer,size); infile.close(); return buffer; } void EncoderRSA::setRsaPublicKey(char *publicKeyInCharArray) { std::string file = "publicKey.txt"; int size = strlen(publicKeyInCharArray); //Write received public key in file std::ofstream outfile (file.c_str(),std::ofstream::binary); if (!outfile.is_open()) { std::cout << "Can't open file to write" << std::endl; exit(1); } outfile.write (publicKeyInCharArray,size); outfile.close(); // release dynamically-allocated memory delete[] publicKeyInCharArray; //Load public key from file FileSource source(file.c_str(),true); this->rsaEncryptor.AccessPublicKey().Load(source); } main.cpp代码: int main() { char *buffer = keysEncoder.getRsaPublicKey(); cout << "buffer: " << buffer << endl; //... //send buffer //receive buffer from other side //.. keysEncoder.setRsaPublicKey(buffer); string decoded = keysEncoder.decrypt(cypher); cout << "decoded: " << decoded << endl; return 0; } 但它因错误而崩溃: terminate called after throwing an instance of 'CryptoPP::BERDecoderErr' wait(): BER decode error Aborted (core dumped) Process returned 134 (0x86) execution time: 2.891 为什么? 解决方法
我删除了对RSA的引用,因为它看起来像是在使用ECIES.干得好.
显然,你需要设置一个try / catch: try { ... } catch(const BERDecoderErr& ex) { cerr << ex.what() << endl; }
ASN.1 / DER编码可能会嵌入NULL,因此您无法使用传统的C字符串对其进行操作. 这可能应该返回一个std :: string,因此输出不会在第一个NULL字符处被截断: // get size of file infile.seekg (0,infile.end); long size = infile.tellg(); infile.seekg (0); // allocate memory for file content string buffer(size,'0'); infile.read (&buffer[0],size); infile.close(); return buffer; 可以在Read whole ASCII file into C++ std::string找到另一种从文件执行读取的方法: std::ifstream infile (file.c_str(),std::ifstream::binary); std::string buffer((std::istreambuf_iterator<char>(infile)),std::istreambuf_iterator<char>()); 另一种方法是确保输出和输入中不存在NULL: string Encoder::getPublicKey() { string encodedKey; HexEncoder sink(new StringSink(encodedKey)); Encryptor.GetPublicKey().Save(sink); return encodedKey; } 和: void Encoder::setPublicKey(const string& encodedKey) { StringSource source(encodedKey,new HexDecoder()); Encryptor.AccessPublicKey().Load(source); } 上面的代码使用StringSource和StringSink,因此它可以在内存中运行.如果您确实需要磁盘上的中间文件,请使用FileSource和FileSink. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |