首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Salsa20的Crypto++

使用Salsa20的Crypto++
EN

Stack Overflow用户
提问于 2015-10-25 05:32:53
回答 1查看 690关注 0票数 1

我试图在salsa20库中使用crypto++代码。( http://www.cryptopp.com/)两个程序之间的通信。

两个程序使用相同的代码,如下所示

代码语言:javascript
复制
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

解释:

  • Step1 :纯文本加密(服务器-M到服务器-E)
  • Step2 :加密文本被解密(服务器-E到服务器-R,客户机-M到客户端-E)这两个应该给出相同的结果,但不要
  • Step3 :再次运行client-E以检查它是否等于服务器发送的msg。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-25 20:58:27

这段代码有一些问题。

  1. 这一行技术上调用未定义的行为: keyBytes =(字节*)key.substr(0,STREAM_KEY_LENGTH).c_str(); 在这种情况下,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());
  2. 这个salsaDo()函数泄漏内存。所创建的字节数组: 字节*密文字节=新的bytemsg.length();字节*逆序字节=新的bytemsg.length(); 。。并没有被释放。考虑使用std::unique_ptr<byte[]>: std::unique_ptr ciphertextBytes(新bytemsg.length());std::unique_ptr reversetextBytes(新bytemsg.length());
  3. C++在技术上不支持将数组传递给函数。实际上,参数byte iv[STREAM_IV_LENGTH]被视为已经编写了byte* iv。 您可以向数组传递一个引用。另外,对于const-正确性,您应该标记初始化向量字节const: 字符串salsaDo(std::string,std::string,const字节(&iv)STREAM_IV_LENGTH) {//.}
  4. 我不会使用std::string来存储密钥,也不会使用任何字节数组,例如返回的加密字节。考虑使用std::unique_ptr<byte[]>std::shared_ptr<byte[]>,或者传递对const数组的引用,或者传递指针和长度(例如const byte* keysize_t keyLength)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33333327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档