使用AES_cbc_encrypt进行加解密,加密后数据解密一直失败

BluceTao 2023-07-23 14:27:28

以下是测试代码:

const char* shaestr=“shenglishenglish”;
const char* siv = "0000000000000000";		

ERPTY_ERROR_CODE GdEncrypt(const char* rawBuff, unsigned char** encrpyBuf)
		{
			int erro = 0;
			if (rawBuff == NULL) {
				return INVAILD_INPUT;
			}
			// 判断 header
			if (CheckSLENVersion((unsigned char*)rawBuff)) {
				return SUCCESS;
			}
			size_t rawlen = strlen(rawBuff);
			size_t finalSize = 0;
			unsigned char* paddingBuff = NULL;
			paddingBuff = PaddingBuff(rawBuff, rawlen, &finalSize, &erro);
			if (paddingBuff == NULL) {
				return (ERPTY_ERROR_CODE)erro;
			}

			AES_KEY aesKey;
	
			int status = 0;
			status = AES_set_encrypt_key((const unsigned char*)shaestr, g_cryptLength, &aesKey);
			*encrpyBuf = (unsigned char*)calloc(finalSize, sizeof(unsigned char));
			if (*encrpyBuf == NULL) {
				free(paddingBuff);
				return MALLOC_ENCRPY_BUF_ERROR;
			}
            int cipherlen = strlen((const char*)paddingBuff);
			AES_cbc_encrypt(paddingBuff, *encrpyBuf, finalSize, &aesKey, siv, AES_ENCRYPT);

			AES_KEY deaesKey;
			status = AES_set_encrypt_key((const unsigned char*)shaestr, g_cryptLength, &deaesKey);
			int testlen = strlen((const char*)(*encrpyBuf));
            char test[1024] = {0};
			AES_cbc_encrypt(*encrpyBuf, (unsigned char*)test, finalSize, &deaesKey, siv, AES_DECRYPT);
			printf("test decrypt :%s\n", test);

			free((*encrpyBuf));
			return SUCCESS;
		}


int mian() {
    const char* plaintext = "shengli0";
    unsigned char* ciphertext = NULL;
    GdEncrypt(plaintext ,ciphertext );
return 0;
}

 

...全文
1618 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
A11000100A 2023-07-23
  • 打赏
  • 举报
回复

根据您提供的代码和问题描述,可能存在以下原因和解决方案:

  1. 加密后解密失败:在加密函数中,使用了CBC模式,并且使用了初始化向量(IV)。在解密函数中,IV也没有被正确设置。因此,建议在解密函数中设置正确的IV。

解决方案:在解密函数中,添加以下代码:

AES_set_decrypt_key((const unsigned char*)deaesKey, g_cryptLength, &deaesKey);

其中,deaesKey是加密后的密钥,g_cryptLength是加密长度。

  1. IV不同导致解密失败:在加密函数中,使用了不同的IV进行加密和解密。因此,建议在加密和解密函数中都使用相同的IV。

解决方案:可以在加密函数中将IV设置为固定值,例如:

const char* siv = "0123456789abcdef";

然后在解密函数中也使用相同的IV进行解密,例如:

AES_cbc_encrypt(paddingBuff, *encrpyBuf, finalSize, &aesKey, siv, AES_DECRYPT);
  1. 填充错误导致解密失败:在加密函数中,使用了填充模式进行填充。在解密函数中,如果填充模式不正确,可能会导致解密失败。

解决方案:在加密函数中,可以将填充模式设置为PKCS7填充,例如:

AES_cbc_encrypt(paddingBuff, *encrpyBuf, finalSize, &aesKey, siv, AES_ENCRYPT | AES_PKCS7PADDING);

然后在解密函数中,也使用相同的填充模式进行解密,例如:

AES_cbc_encrypt(*encrpyBuf, (unsigned char*)test, finalSize, &aesKey, siv, AES_DECRYPT | AES_PKCS7PADDING);
  1. 密钥长度不匹配导致解密失败:在加密和解密函数中,使用的密钥长度不相同。这可能会导致解密失败。

解决方案:在加密函数中,确保使用的密钥长度与解密函数中使用的密钥长度相同。

希望以上解决方案对您有帮助,如果仍然存在问题,请提供更多详细信息,以便更好地解决您的问题。

BluceTao 2023-07-23
  • 打赏
  • 举报
回复

补充补齐函数

        unsigned char* PaddingBuff(const char* buf, size_t size, size_t* finalSize, int* err)
        {
            if (size == 0) {
                return NULL;
            }
            int paddingSize = AES_BLOCK_SIZE - (size % AES_BLOCK_SIZE);
            size_t i = 0;
            *finalSize = size + paddingSize;
            unsigned char* newBuff = NULL;
            newBuff = (unsigned char*)calloc(*finalSize, sizeof(char));
            if (newBuff == NULL) {
                *err = MALLOC_ERROR;
                return NULL;
            }
            memcpy(newBuff, buf, size);
            if (paddingSize == AES_BLOCK_SIZE) {
                for (i = size; i < (*finalSize); i++) {
                    newBuff[i] = AES_BLOCK_SIZE;
                }
            } else { // 不足16倍数,补齐
                for (i = size; i < (*finalSize); i++) {
                    newBuff[i] = paddingSize;
                }
            }
            newBuff[i] = '\0';
            *err = SUCCESS;
            return newBuff;
        }
```c


```

33,322

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧