含空字符(\ X00),我有以下字符串加密字符串:無法解密使用OpenSSL的
char *str = "\x45\x00\x10";
我需要使用的OpenSSL加密它,把它通過網絡和解密找回同一字符串。
我用於加密以下代碼(編程下在Ubuntu Linux操作系統):
int do_encrypt(char *cipher, char *key, char *iv, char *plaintext, int len)
{
unsigned char outbuf[BUFSIZE];
int outlen, tmplen;
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, plaintext, len))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
outlen += tmplen;
EVP_CIPHER_CTX_cleanup(&ctx);
outbuf[outlen] = '\0';
strcpy(cipher,outbuf);
return 1;
}
我使用下面的代碼進行解密:
int do_decrypt(char *plain, char *key, char *iv, char *cipher)
{
unsigned char outbuf[BUFSIZE];
int outlen, tmplen;
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
if(!EVP_DecryptUpdate(&ctx, outbuf, &outlen, cipher, strlen(cipher)))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
if(!EVP_DecryptFinal_ex(&ctx, outbuf + outlen, &tmplen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
outlen += tmplen;
EVP_CIPHER_CTX_cleanup(&ctx);
outbuf[outlen] = '\0';
strcpy(plain,outbuf);
return outlen;
}
當我str加密使用所述第一函數,並通過第三個參數爲3(我不希望傳遞的strlen(STR),因爲它不會加密整個字符串),並使用第二功能解密,我得到下面的純文本回:
\x45\x00\x00 // recovered plain text
我應該對我的代碼做些什麼修正,以便我可以加密整個字符串並仍然得到整個字符串,即使原始字符串包含空字符?
謝謝。
不要使用設計用於空終止字符串(如'strcpy'和'strlen')存儲在無符號'char'陣列的二進制數據的功能。你需要明確地跟蹤長度;密文包含從0到255的所有值。 – erickson 2012-04-14 05:05:21