Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenSSL AES#U CBC-256在C+中不使用原始文本长度进行解密+;_C++_Security_Encryption_Openssl_Aes - Fatal编程技术网

C++ OpenSSL AES#U CBC-256在C+中不使用原始文本长度进行解密+;

C++ OpenSSL AES#U CBC-256在C+中不使用原始文本长度进行解密+;,c++,security,encryption,openssl,aes,C++,Security,Encryption,Openssl,Aes,我有这个代码,我发现了,所以它的工作。我的问题是加密和解密在同一个文件中。当然,我想把它们分成两个函数。问题是解码器需要原始输入长度。这不是一个安全漏洞吗?在不知道输入的原始长度的情况下,如何减少输入 /* computes the ciphertext from plaintext and key using AES256-CBC algorithm */ string cipher_AES(string key, string message) { size_t inputsleng

我有这个代码,我发现了,所以它的工作。我的问题是加密和解密在同一个文件中。当然,我想把它们分成两个函数。问题是解码器需要原始输入长度。这不是一个安全漏洞吗?在不知道输入的原始长度的情况下,如何减少输入

/* computes the ciphertext from plaintext and key using AES256-CBC algorithm */
string cipher_AES(string key, string message)
{
    size_t inputslength = message.length();
    unsigned char aes_input[inputslength];
    unsigned char aes_key[AES_KEYLENGTH];
    memset(aes_input, 0, inputslength/8);
    memset(aes_key, 0, AES_KEYLENGTH/8);
    strcpy((char*) aes_input, message.c_str());
    strcpy((char*) aes_key, key.c_str());

    /* init vector */
    unsigned char iv[AES_BLOCK_SIZE];
    memset(iv, 0x00, AES_BLOCK_SIZE);

    // buffers for encryption and decryption
    const size_t encslength = ((inputslength + AES_BLOCK_SIZE) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;
    unsigned char enc_out[encslength];
    unsigned char dec_out[inputslength];
    memset(enc_out, 0, sizeof(enc_out));
    memset(dec_out, 0, sizeof(dec_out));

    AES_KEY enc_key, dec_key;
    AES_set_encrypt_key(aes_key, AES_KEYLENGTH, &enc_key);
    AES_cbc_encrypt(aes_input, enc_out, inputslength, &enc_key, iv, AES_ENCRYPT);

    AES_set_decrypt_key(aes_key, AES_KEYLENGTH, &dec_key);
    AES_cbc_encrypt(enc_out, dec_out, encslength, &dec_key, iv, AES_DECRYPT);

    stringstream ss;
    for(int i = 0; i < encslength; i++)
    {
        ss << enc_out[i];
    }
    return ss.str(););
}
/*使用AES256-CBC算法从明文和密钥计算密文*/
字符串密码(字符串密钥、字符串消息)
{
size_t inputslength=message.length();
无符号字符aes_输入[inputslength];
无符号字符aes_密钥[aes_密钥长度];
memset(aes_输入,0,输入长度/8);
memset(aes_键,0,aes_键长度/8);
strcpy((char*)aes_输入,message.c_str());
strcpy((char*)aes_key,key.c_str());
/*初始向量*/
无符号字符iv[AES_块大小];
内存集(iv,0x00,AES_块大小);
//用于加密和解密的缓冲区
常量大小加密长度=((输入长度+AES块大小)/AES块大小)*AES块大小;
未签名字符加密输出[加密长度];
无符号字符dec__out[inputslength];
memset(enc_out,0,sizeof(enc_out));
memset(dec_out,0,sizeof(dec_out));
AES_键enc_键,dec_键;
AES_设置_加密_密钥(AES_密钥、AES_密钥长度和enc_密钥);
AES_cbc_加密(AES_输入、enc_输出、inputslength和enc_密钥、iv、AES_加密);
AES_设置_解密_密钥(AES_密钥、AES_密钥长度和dec_密钥);
AES_cbc_加密(加密输出、解密输出、加密长度和解密密钥、iv、AES_解密);
细流ss;
对于(int i=0;iss首先,AES加密在128位的块中以1:1的比例进行,因此您只需查看密文就可以知道消息大小的16字节精度

然后,对于最后一个块,您只需要确定消息结束的位置。标准解决方案是使用填充(例如),或者只在消息开始处存储消息长度,并将其与消息一起加密

当然,您可以继续使用OpenSSL AES API和填充或其他机制,但OpenSSL已经有了更高级别的API(EVP),可以自动进行AES、CBC和PKCS填充

有关使用EVPAPI的示例,请参见官方OpenSSL wiki页面


无关注释:

    >P>一个固定IV(特别是零IV)是不安全的。考虑生成一个随机IV并将其与密文(例如使用)一起存储。

  • 还请检查AES GCM模式以进行身份验证加密(加密+安全校验和),这样加密的消息将额外成为防篡改的。请参阅


首先,AES加密在128位的数据块中以1:1的比例进行,因此您只需查看密文就可以知道消息大小的16字节精度

然后,对于最后一个块,您只需要确定消息结束的位置。标准解决方案是使用填充(例如),或者只在消息开始处存储消息长度,并将其与消息一起加密

当然,您可以继续使用OpenSSL AES API和填充或其他机制,但OpenSSL已经有了更高级别的API(EVP),可以自动进行AES、CBC和PKCS填充

有关使用EVPAPI的示例,请参见官方OpenSSL wiki页面


无关注释:

    >P>一个固定IV(特别是零IV)是不安全的。考虑生成一个随机IV并将其与密文(例如使用)一起存储。

  • 还请检查AES GCM模式以进行身份验证加密(加密+安全校验和),这样加密的消息将额外成为防篡改的。请参阅


如果要验证解密产生的字节数与加密的字节数相同,则只需要原始长度。原始长度只是加密大小减去用于将大小四舍五入到块大小偶数倍的任何填充。解密将告诉您实际解密的字节数“我在SO上找到了这段代码,它可以正常工作。“哦,天哪,这不是创建安全应用程序的正确方法。密码学有点奇怪,因为它可以在100%的时间内工作,但在安全方面仍然失败。嗨,谢谢,但我的问题不是关于安全性。而是关于消除输入长度。如果我考虑安全性,我会问:“我有我在上面找到的代码,所以,它安全吗?"。这些是完全不同的问题。如果要验证解密产生的字节数与加密的字节数相同,则只需要原始长度。原始长度只是加密的大小减去用于将大小四舍五入到块大小偶数倍的任何填充。解密将告诉您有多少字节被加密实际解密“我有这段代码,我在SO上找到的,它可以工作。”哦,天哪,这不是创建安全应用程序的正确方法。密码学有点奇怪,因为它可以在100%的时间内工作,但在安全方面仍然失败。嗨,谢谢,但我的问题不是关于安全性。而是关于消除输入长度。如果我考虑安全性,我会问:“我有我在上面找到的这个代码,它安全吗?”。这些问题完全不同。非常感谢!非常有用。非常感谢!非常有用