我试图用mbedtls/erc.h扩展加密消息
这是我的密码:
void encrypt(char * plainText, char * key, unsigned char * outputBuffer){
mbedtls_aes_context aes;
mbedtls_aes_init( &aes );
mbedtls_aes_setkey_enc( &aes, (const unsigned char*) key, strlen(key) * 8 );
mbedtls_aes_crypt_ecb( &aes, MBEDTLS_AES_ENCRYPT, (const unsigned char*)plainText, outputBuffer);
mbedtls_aes_free( &aes );
}
void decrypt(unsigned char * chipherText, char * key, unsigned char * outputBuffer){
mbedtls_aes_context aes;
mbedtls_aes_init( &aes );
mbedtls_aes_setkey_dec( &aes, (const unsigned char*) key, strlen(key) * 8 );
mbedtls_aes_crypt_ecb(&aes, MBEDTLS_AES_DECRYPT, (const unsigned char*)chipherText, outputBuffer);
mbedtls_aes_free( &aes );
}
void test() {
char * key = "Yq3t6w9z$C&F)J@M";
char *plainText = "Message Message Message Message Message Message Message Message Message Message Message ";
unsigned char cipherTextOutput[16];
unsigned char decipheredTextOutput[16];
encrypt(plainText, key, cipherTextOutput);
decrypt(cipherTextOutput, key, decipheredTextOutput);
Serial.println("\nPlain text:");
Serial.println(plainText);
Serial.println("\nCiphered text:");
for (int i = 0; i < 16; i++) {
char str[3];
sprintf(str, "%02x", (int)cipherTextOutput[i]);
Serial.print(str);
}
Serial.println("\n\nDeciphered text:");
for (int i = 0; i < 16; i++) {
Serial.print((char)decipheredTextOutput[i]);
}
}这是输出:
纯文本:
Message Message Message Message Message Message Message Message Message Message Message 加密文本:
cb91d2da0d1be520239651f63b259be8破译文本:
Message Message 我想加密更大的文本,如何扩展缓冲区?
发布于 2021-12-15 00:03:54
mbedtls_aes_crypt_ecb只加密单个数据块(确切地说是16个字节)。
如果您想加密/解密更多的数据,可以使用其他mbedtls_aes_crypt_*函数之一,例如mbedtls_aes_crypt_cbc。
示例:
void encrypt(char* key, unsigned char* iv, int length, char* plainText, unsigned char* outputBuffer){
mbedtls_aes_context aes;
mbedtls_aes_init(&aes);
mbedtls_aes_setkey_enc(&aes, (const unsigned char*)key, strlen(key)*8);
mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, length, iv, (const unsigned char*)plainText, outputBuffer);
mbedtls_aes_free(&aes);
}
void decrypt(char* key, unsigned char* iv, int length, unsigned char* chipherText, unsigned char* outputBuffer){
mbedtls_aes_context aes;
mbedtls_aes_init(&aes);
mbedtls_aes_setkey_dec(&aes, (const unsigned char*)key, strlen(key)*8);
mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_DECRYPT, length, iv, (const unsigned char*)chipherText, outputBuffer);
mbedtls_aes_free(&aes);
}iv需要是一个具有初始化值的16字节大缓冲区(加密和解密需要相同)。
如果你不想麻烦这个,你只需提供16个字节的零。
(mbedtls_aes_crypt_cbc将在加密/解密时写入此文件)length需要是要编码/解码的字节数(必须是16的倍数)。示例:
const char* message = "Message Message Message Message Message Message Message Message\0";
// encrypt
unsigned char encryped[64];
unsigned char enc_iv[16] = {0};
encrypt("Yq3t6w9z$C&F)J@M", enc_iv, 64, message, encrypted);
// decrypt
unsigned char result[64];
unsigned char dec_iv[16] = {0};
decrypt("Yq3t6w9z$C&F)J@M", dec_iv, 64, encrypted, result);
Serial.print(result)如果您需要,还可以查看可用的不同模式 &选择适合您的用例的最佳方法。
ECB是相当不安全的,因为它单独加密每个块,所以不同块之间的模式被保存在密码文本中。
我建议改用CBC / CFB128 / CFB8。
https://stackoverflow.com/questions/70356786
复制相似问题