33,322
社区成员




以下是测试代码:
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;
}
根据您提供的代码和问题描述,可能存在以下原因和解决方案:
解决方案:在解密函数中,添加以下代码:
AES_set_decrypt_key((const unsigned char*)deaesKey, g_cryptLength, &deaesKey);
其中,deaesKey
是加密后的密钥,g_cryptLength
是加密长度。
解决方案:可以在加密函数中将IV设置为固定值,例如:
const char* siv = "0123456789abcdef";
然后在解密函数中也使用相同的IV进行解密,例如:
AES_cbc_encrypt(paddingBuff, *encrpyBuf, finalSize, &aesKey, siv, AES_DECRYPT);
解决方案:在加密函数中,可以将填充模式设置为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);
解决方案:在加密函数中,确保使用的密钥长度与解密函数中使用的密钥长度相同。
希望以上解决方案对您有帮助,如果仍然存在问题,请提供更多详细信息,以便更好地解决您的问题。
补充补齐函数
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
```