- /*******************************************************************************
- * Function Name: encrypt_message_cfb
- ********************************************************************************
- * Summary: Function used to encrypt the message through ctr mode.
- *
- * Parameters:
- * char * message - pointer to the message to be encrypted
- * uint8_t size - size of message to be encrypted.
- *
- * Return:
- * void
- *
- *******************************************************************************/
- void encrypt_message_ctr(uint8_t* message, uint8_t size)
- {
- uint32_t srcOffset;
- cy_stc_cryptolite_aes_state_t aes_state;
- cy_stc_cryptolite_aes_buffers_t aesBuffers;
- uint8_t aes_block_count = 0;
- cy_en_cryptolite_status_t res;
- void* result;
- aes_block_count = (size % AES128_ENCRYPTION_LENGTH == 0) ?
- (size / AES128_ENCRYPTION_LENGTH)
- : (1 + size / AES128_ENCRYPTION_LENGTH);
- /* Initializes the AES operation by setting key and key length */
- res = Cy_Cryptolite_Aes_Init(CRYPTOLITE, aes_key, &aes_state, &aesBuffers);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- srcOffset = 0;
- result = memcpy(AesCtrIV_copied, AesCtrIV, sizeof(AesCtrIV));
- if(result == NULL)
- {
- perror("Memory failed\r\n");
- }
- res = Cy_Cryptolite_Aes_Ctr( CRYPTOLITE,
- aes_block_count * AES128_ENCRYPTION_LENGTH,
- &srcOffset,
- AesCtrIV_copied,
- encrypted_msg,
- message,
- &aes_state);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- res = Cy_Cryptolite_Aes_Free(CRYPTOLITE,&aes_state);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- printf("\r\nResult of Encryption:\r\n");
- print_data((uint8_t*) encrypted_msg,
- aes_block_count * AES128_ENCRYPTION_LENGTH );
- }
- /*******************************************************************************
- * Function Name: decrypt_message
- ********************************************************************************
- * Summary: Function used to decrypt the message for ctr mode.
- *
- * Parameters:
- * char * message - pointer to the message to be decrypted
- * uint8_t size - size of message to be decrypted.
- *
- * Return:
- * void
- *
- *******************************************************************************/
- void decrypt_message_ctr(uint8_t* message, uint8_t size)
- {
- uint32_t srcOffset;
- cy_stc_cryptolite_aes_state_t aes_state;
- cy_stc_cryptolite_aes_buffers_t aesBuffers;
- uint8_t aes_block_count = 0;
- cy_en_cryptolite_status_t res;
- void* result;
- aes_block_count = (size % AES128_ENCRYPTION_LENGTH == 0) ?
- (size / AES128_ENCRYPTION_LENGTH)
- : (1 + size / AES128_ENCRYPTION_LENGTH);
- /* Initializes the AES operation by setting key and key length */
- res = Cy_Cryptolite_Aes_Init(CRYPTOLITE, aes_key, &aes_state, &aesBuffers);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- srcOffset = 0;
- /* Start decryption operation*/
- result = memcpy(AesCtrIV_copied, AesCtrIV, sizeof(AesCtrIV));
- if(result == NULL)
- {
- perror("Memory failed\r\n");
- }
- res = Cy_Cryptolite_Aes_Ctr( CRYPTOLITE,
- aes_block_count * AES128_ENCRYPTION_LENGTH,
- &srcOffset,
- AesCtrIV_copied,
- decrypted_msg,
- encrypted_msg,
- &aes_state);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- res = Cy_Cryptolite_Aes_Free(CRYPTOLITE,&aes_state);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- decrypted_msg[size]='\0';
- /* Print the decrypted message on the UART terminal */
- printf("\r\nResult of Decryption:\r\n\n");
- printf("%s", decrypted_msg);
- }
图3。终端输出显示AES CTR模式加解密
AES CFB加解密代码:
- /*******************************************************************************
- * Function Name: encrypt_message_cfb
- ********************************************************************************
- * Summary: Function used to encrypt the message through cfb mode.
- *
- * Parameters:
- * char * message - pointer to the message to be encrypted
- * uint8_t size - size of message to be encrypted.
- *
- * Return:
- * void
- *
- *******************************************************************************/
- void encrypt_message_cfb(uint8_t* message, uint8_t size)
- {
- cy_stc_cryptolite_aes_state_t aes_state;
- cy_stc_cryptolite_aes_buffers_t aesBuffers;
- uint8_t aes_block_count = 0;
- cy_en_cryptolite_status_t res;
- void* result;
- aes_block_count = (size % AES128_ENCRYPTION_LENGTH == 0) ?
- (size / AES128_ENCRYPTION_LENGTH)
- : (1 + size / AES128_ENCRYPTION_LENGTH);
- /* Initializes the AES operation by setting key and key length */
- res = Cy_Cryptolite_Aes_Init(CRYPTOLITE, aes_key, &aes_state, &aesBuffers);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- result = memcpy(AesCfbIV_copied, AesCfbIV, sizeof(AesCfbIV));
- if(result == NULL)
- {
- perror("Memory failed\r\n");
- }
- res = Cy_Cryptolite_Aes_Cfb( CRYPTOLITE,
- CY_CRYPTOLITE_ENCRYPT,
- aes_block_count * AES128_ENCRYPTION_LENGTH,
- AesCfbIV_copied,
- encrypted_msg,
- message,
- &aes_state);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- res = Cy_Cryptolite_Aes_Free(CRYPTOLITE,&aes_state);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- printf("\r\nResult of Encryption:\r\n");
- print_data((uint8_t*) encrypted_msg,
- aes_block_count * AES128_ENCRYPTION_LENGTH );
- }
- /*******************************************************************************
- * Function Name: decrypt_message
- ********************************************************************************
- * Summary: Function used to decrypt the message for cfb mode.
- *
- * Parameters:
- * char * message - pointer to the message to be decrypted
- * uint8_t size - size of message to be decrypted.
- *
- * Return:
- * void
- *
- *******************************************************************************/
- void decrypt_message_cfb(uint8_t* message, uint8_t size)
- {
- cy_stc_cryptolite_aes_state_t aes_state;
- cy_stc_cryptolite_aes_buffers_t aesBuffers;
- uint8_t aes_block_count = 0;
- cy_en_cryptolite_status_t res;
- void* result;
- aes_block_count = (size % AES128_ENCRYPTION_LENGTH == 0) ?
- (size / AES128_ENCRYPTION_LENGTH)
- : (1 + size / AES128_ENCRYPTION_LENGTH);
- /* Initializes the AES operation by setting key and key length */
- res = Cy_Cryptolite_Aes_Init(CRYPTOLITE, aes_key, &aes_state, &aesBuffers);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- /* Start decryption operation*/
- result = memcpy(AesCfbIV_copied, AesCfbIV, sizeof(AesCfbIV));
- if(result == NULL)
- {
- perror("Memory failed\r\n");
- }
- res = Cy_Cryptolite_Aes_Cfb(CRYPTOLITE,
- CY_CRYPTOLITE_DECRYPT,
- aes_block_count * AES128_ENCRYPTION_LENGTH,
- AesCfbIV_copied,
- decrypted_msg,
- encrypted_msg,
- &aes_state);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- res = Cy_Cryptolite_Aes_Free(CRYPTOLITE,&aes_state);
- if(res!=CY_CRYPTOLITE_SUCCESS)
- {
- CY_ASSERT(0);
- }
- decrypted_msg[size]='\0';
- /* Print the decrypted message on the UART terminal */
- printf("\r\nResult of Decryption:\r\n\n");
- printf("%s", decrypted_msg);
- }
图4。终端输出显示AES CFB模式加解密
总结:
英飞凌CYW20829芯片不仅提供了卓越的硬件加解密模块,还提供了ModusToolbox软件生态,功能完善的BSP等软件资源,可以大大简化硬件加解密的设计的同时满足高标准的安全需求。