unsigned int AESDecrypt(AESInfo_t *aesInfoP, unsigned char *pPlainText, const unsigned char *pCipherText, unsigned int dataLen) { unsigned int i; unsigned char *pPlainTextBack = pPlainText; if (pPlainText != pCipherText) { memcpy(pPlainText, pCipherText, dataLen); } //当mode=AES_MODE_CBC时需要从最后一块数据开始解密 pPlainText += dataLen - 4 * Nb; for (i = dataLen / (4 * Nb); i > 0 ; i--, pPlainText -= 4 * Nb) { BlockDecrypt(aesInfoP, pPlainText); if (AES_MODE_CBC == aesInfoP->mode) { if (1 == i) {//原来的第一块数据是初始变量加密的 XorBytes(pPlainText, aesInfoP->pIV, 4 * Nb); } else { XorBytes(pPlainText, pPlainText - 4 * Nb, 4 * Nb); } } } //因为数据需要16字节对齐,可能有填充数据,需要去除后面的填充数据 return AESDelPKCS7Padding(pPlainTextBack, dataLen); }具体解释
时间: 2024-04-25 10:26:31 浏览: 139
深入解析unsigned int 和 int
这段代码实现了AES解密函数AESDecrypt,它的参数包括一个AESInfo_t类型的结构体指针aesInfoP,一个指向解密后的明文的缓冲区pPlainText,一个指向密文的缓冲区pCipherText,以及数据长度dataLen。函数返回值为unsigned int类型。
首先,将指向明文缓冲区的指针pPlainText保存在一个指针变量pPlainTextBack中,然后判断pPlainText是否与pCipherText相等。如果不相等,则将pCipherText中的数据复制到pPlainText中。这个步骤是为了防止解密时修改密文数据。
接着,根据AES的工作模式,当mode=AES_MODE_CBC时需要从最后一块数据开始解密。因此,将pPlainText指针指向最后一块数据。然后使用循环从最后一块数据开始逐块解密,直到所有数据块都被解密。在每次解密后,如果AES的工作模式是CBC,需要对解密后的数据进行异或操作。对于最后一块数据,需要使用初始变量进行异或操作。对于其他块数据,需要使用前一块数据进行异或操作。
最后,因为数据需要16字节对齐,可能有填充数据,需要去除后面的填充数据。这个步骤使用AESDelPKCS7Padding函数实现,它返回去除填充后的数据长度。
阅读全文