我试图在salsa20库中使用crypto++代码。( http://www.cryptopp.com/)两个程序之间的通信。
两个程序使用相同的代码,如下所示
std::string salsaDo(std::string key, std::string msg, byte iv[STREAM_IV_LENGTH]) {
//Set up byte arrays for proccess
byte *plaintextBytes = (byte *)msg.c_str();
byte *ciphertextBytes = new byte[msg.length()];
byte *reversetextBytes = new byte[msg.length()];
//Set up key array
byte* keyBytes = (byte *)key.substr(0, STREAM_KEY_LENGTH).c_str();
//Peform encryption method
Salsa20::Encryption salsa;
salsa.SetKeyWithIV(keyBytes, STREAM_KEY_LENGTH, iv);
salsa.ProcessData(ciphertextBytes, plaintextBytes, msg.length());
salsa.SetKeyWithIV(keyBytes, STREAM_KEY_LENGTH, iv);
salsa.ProcessData(reversetextBytes, ciphertextBytes, msg.length());
std::string ivStr((char*)iv, STREAM_IV_LENGTH);
std::cout << "____\nK:" << key.c_str();
std::cout << "\nI:" << ivStr.c_str();
std::cout << "\nM:" << msg.c_str();
std::cout << "\nE:" << std::string((const char *)ciphertextBytes, msg.length()).c_str();
std::cout << "\nR:" << std::string((const char *)reversetextBytes, msg.length()).c_str();
std::cout << "\n____\n";
//return msg;
//return string
return std::string((const char *)ciphertextBytes, msg.length());
}这些程序的图像在http://s21.postimg.org/wgfmkjcn9/encrypt.png上
解释:
发布于 2015-10-25 20:58:27
这段代码有一些问题。
substr()调用返回一个包含子字符串的临时std::string对象。这个临时std::string的生存期通过计算整行(完整表达式)来扩展。std::string::c_str()返回的C字符串的生存期与std::string相同,只是变异操作使其失效。因此,在这个完整表达式中,keyBytes很可能是行执行后无效的指针。
您可以通过将key覆盖到所需的子字符串来解决此问题。在这种情况下,分配给key确保通过使用它的位置延长生存期:
key = key.substr(0,STREAM_KEY_LENGTH);const字节* keyBytes = static_cast(key.c_str());salsaDo()函数泄漏内存。所创建的字节数组:
字节*密文字节=新的bytemsg.length();字节*逆序字节=新的bytemsg.length();
。。并没有被释放。考虑使用std::unique_ptr<byte[]>:
std::unique_ptr ciphertextBytes(新bytemsg.length());std::unique_ptr reversetextBytes(新bytemsg.length());byte iv[STREAM_IV_LENGTH]被视为已经编写了byte* iv。
您可以向数组传递一个引用。另外,对于const-正确性,您应该标记初始化向量字节const:
字符串salsaDo(std::string,std::string,const字节(&iv)STREAM_IV_LENGTH) {//.}std::string来存储密钥,也不会使用任何字节数组,例如返回的加密字节。考虑使用std::unique_ptr<byte[]>或std::shared_ptr<byte[]>,或者传递对const数组的引用,或者传递指针和长度(例如const byte* key和size_t keyLength)。https://stackoverflow.com/questions/33333327
复制相似问题