本帖最后由 shileiprince 于 2015-10-26 11:20 编辑 最近有个项目数据通信需要加密数据,stm官网给的AES128_CTR加密我模拟运行了一下结果和预期的不一样。例子没有修改过。那位用过能指点一下那里出错了。 /** ****************************************************************************** * @file AES128_CTR/main.c * @author MCD Application Team * @version V2.0.6 * @date 25-June-2013 * @brief Main program body ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2> * * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.st.com/software_license_agreement_liberty_v2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include <stdio.h> #include "crypto.h" /** @addtogroup STM32_Crypto_Examples * @{ */ /* Private typedef -----------------------------------------------------------*/ typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus; /* Private define ------------------------------------------------------------*/ #define PLAINTEXT_LENGTH 64 /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ const uint8_t Plaintext[PLAINTEXT_LENGTH] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }; /* Key to be used for AES encryption/decryption */ uint8_t Key[CRL_AES128_KEY] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }; /* Initialization Vector, used only in non-ECB modes */ uint8_t IV[CRL_AES_BLOCK] = { 0xf0 , 0xf1 , 0xf2 , 0xf3 , 0xf4 , 0xf5 , 0xf6 , 0xf7, 0xf8 , 0xf9 , 0xfa , 0xfb , 0xfc , 0xfd , 0xfe , 0xff }; /* Buffer to store the output data */ uint8_t OutputMessage[PLAINTEXT_LENGTH]; /* Size of the output data */ uint32_t OutputMessageLength = 0; const uint8_t Expected_Ciphertext[PLAINTEXT_LENGTH] = { 0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26, 0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce, 0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff, 0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff, 0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e, 0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0, 0x3e, 0xab, 0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1, 0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee }; /* Private function prototypes -----------------------------------------------*/ int32_t STM32_AES_CTR_Encrypt(uint8_t* InputMessage, uint32_t InputMessageLength, uint8_t *AES128_Key, uint8_t *InitializationVector, uint32_t IvLength, uint8_t *OutputMessage, uint32_t *OutputMessageLength); int32_t STM32_AES_CTR_Decrypt(uint8_t* InputMessage, uint32_t InputMessageLength, uint8_t *AES128_Key, uint8_t *InitializationVector, uint32_t IvLength, uint8_t *OutputMessage, uint32_t *OutputMessageLength); TestStatus Buffercmp(const uint8_t* pBuffer, uint8_t* pBuffer1, uint16_t BufferLength); /* Private functions ---------------------------------------------------------*/ /** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c, system_stm32l1xx.c, system_stm32f0xx.c, system_stm32f2xx.c, system_stm32f30x.c, system_stm32f37x.c, or system_stm32f4xx.c file depending on device. */ int32_t status = AES_SUCCESS; /* DeInitialize STM32 Cryptographic Library */ Crypto_DeInit(); /* Encrypt DATA with AES in CTR mode */ status = STM32_AES_CTR_Encrypt( (uint8_t *) Plaintext, PLAINTEXT_LENGTH, Key, IV, sizeof(IV), OutputMessage, &OutputMessageLength); if (status == AES_SUCCESS) { if (Buffercmp(Expected_Ciphertext, OutputMessage, PLAINTEXT_LENGTH) == PASSED) { /* add application traintment in case of AES CTR encrption is passed */ } else { /* add application traintment in case of AES CTR encrption is failed */ } } else { /* Add application traintment in case of encryption/decryption not success possible values * of status: * AES_ERR_BAD_CONTEXT, AES_ERR_BAD_PARAMETER, AES_ERR_BAD_OPERATION */ } status = STM32_AES_CTR_Decrypt( (uint8_t *) Expected_Ciphertext, PLAINTEXT_LENGTH, Key, IV, sizeof(IV), OutputMessage, &OutputMessageLength); if (status == AES_SUCCESS) { if (Buffercmp(Plaintext, OutputMessage, PLAINTEXT_LENGTH) == PASSED) { /* add application traintment in case of AES CTR encrption is passed */ } else { /* add application traintment in case of AES CTR encrption is failed */ } } else { /* Add application traintment in case of encryption/decryption not success possible values * of status: * AES_ERR_BAD_CONTEXT, AES_ERR_BAD_PARAMETER, AES_ERR_BAD_OPERATION */ } /* Infinite loop */ while (1) {} } /** * @brief AES CTR Encryption example. * @param InputMessage: pointer to input message to be encrypted. * @param InputMessageLength: input data message length in byte. * @param AES128_Key: pointer to the AES key to be used in the operation * @param InitializationVector: pointer to the Initialization Vector (IV) * @param IvLength: IV length in bytes. * @param OutputMessage: pointer to output parameter that will handle the encrypted message * @param OutputMessageLength: pointer to encrypted message length. * @retval error status: can be AES_SUCCESS if success or one of * AES_ERR_BAD_CONTEXT, AES_ERR_BAD_PARAMETER, AES_ERR_BAD_OPERATION * if error occured. */ int32_t STM32_AES_CTR_Encrypt(uint8_t* InputMessage, uint32_t InputMessageLength, uint8_t *AES128_Key, uint8_t *InitializationVector, uint32_t IvLength, uint8_t *OutputMessage, uint32_t *OutputMessageLength) { AESCTRctx_stt AESctx; uint32_t error_status = AES_SUCCESS; int32_t outputLength = 0; /* Set flag field to default value */ AESctx.mFlags = E_SK_DEFAULT; /* Set key size to 16 (corresponding to AES-128) */ AESctx.mKeySize = 16; /* Set iv size field to IvLength*/ AESctx.mIvSize = IvLength; /* Initialize the operation, by passing the key. * Third parameter is NULL because CTR doesn't use any IV */ error_status = AES_CTR_Encrypt_Init(&AESctx, AES128_Key, InitializationVector ); /* check for initialization errors */ if (error_status == AES_SUCCESS) { /* Encrypt Data */ error_status = AES_CTR_Encrypt_Append(&AESctx, InputMessage, InputMessageLength, OutputMessage, &outputLength); if (error_status == AES_SUCCESS) { /* Write the number of data written*/ *OutputMessageLength = outputLength; /* Do the Finalization */ error_status = AES_CTR_Encrypt_Finish(&AESctx, OutputMessage + *OutputMessageLength, &outputLength); /* Add data written to the information to be returned */ *OutputMessageLength += outputLength; } } return error_status; } /** * @brief AES CTR Decryption example. * @param InputMessage: pointer to input message to be decrypted. * @param InputMessageLength: input data message length in byte. * @param AES128_Key: pointer to the AES key to be used in the operation * @param InitializationVector: pointer to the Initialization Vector (IV) * @param IvLength: IV length in bytes. * @param OutputMessage: pointer to output parameter that will handle the decrypted message * @param OutputMessageLength: pointer to decrypted message length. * @retval error status: can be AES_SUCCESS if success or one of * AES_ERR_BAD_CONTEXT, AES_ERR_BAD_PARAMETER, AES_ERR_BAD_OPERATION * if error occured. */ int32_t STM32_AES_CTR_Decrypt(uint8_t* InputMessage, uint32_t InputMessageLength, uint8_t *AES128_Key, uint8_t *InitializationVector, uint32_t IvLength, uint8_t *OutputMessage, uint32_t *OutputMessageLength) { AESCTRctx_stt AESctx; uint32_t error_status = AES_SUCCESS; int32_t outputLength = 0; /* Set flag field to default value */ AESctx.mFlags = E_SK_DEFAULT; /* Set key size to 16 (corresponding to AES-128) */ AESctx.mKeySize = 16; /* Set iv size field to IvLength*/ AESctx.mIvSize = IvLength; /* Initialize the operation, by passing the key. * Third parameter is NULL because CTR doesn't use any IV */ error_status = AES_CTR_Decrypt_Init(&AESctx, AES128_Key, InitializationVector ); /* check for initialization errors */ if (error_status == AES_SUCCESS) { /* Decrypt Data */ error_status = AES_CTR_Decrypt_Append(&AESctx, InputMessage, InputMessageLength, OutputMessage, &outputLength); if (error_status == AES_SUCCESS) { /* Write the number of data written*/ *OutputMessageLength = outputLength; /* Do the Finalization */ error_status = AES_CTR_Decrypt_Finish(&AESctx, OutputMessage + *OutputMessageLength, &outputLength); /* Add data written to the information to be returned */ *OutputMessageLength += outputLength; } } return error_status; } /** * @brief Compares two buffers. * @param pBuffer, pBuffer1: buffers to be compared. * @param BufferLength: buffer's length * @retval PASSED: pBuffer identical to pBuffer1 * FAILED: pBuffer differs from pBuffer1 */ TestStatus Buffercmp(const uint8_t* pBuffer, uint8_t* pBuffer1, uint16_t BufferLength) { while (BufferLength--) { if (*pBuffer != *pBuffer1) { return FAILED; } pBuffer++; pBuffer1++; } return PASSED; } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t* file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) {} } #endif /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
你图片不是生成lib文件的吗?stm32的加密库本来就是lib文件。我这边仿真只是使用时候加密解密的数据不对。
用硬件仿真。没问题