首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用AES 128 mbedtls扩展加密消息

用AES 128 mbedtls扩展加密消息
EN

Stack Overflow用户
提问于 2021-12-14 23:32:16
回答 1查看 308关注 0票数 0

我试图用mbedtls/erc.h扩展加密消息

这是我的密码:

代码语言:javascript
复制
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]);
  }
}

这是输出:

纯文本:

代码语言:javascript
复制
Message Message Message Message Message Message Message Message Message Message Message 

加密文本:

代码语言:javascript
复制
cb91d2da0d1be520239651f63b259be8

破译文本:

代码语言:javascript
复制
Message Message 

我想加密更大的文本,如何扩展缓冲区?

EN

回答 1

Stack Overflow用户

发布于 2021-12-15 00:03:54

mbedtls_aes_crypt_ecb只加密单个数据块(确切地说是16个字节)。

如果您想加密/解密更多的数据,可以使用其他mbedtls_aes_crypt_*函数之一,例如mbedtls_aes_crypt_cbc

示例:

代码语言:javascript
复制
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的倍数)。

示例:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70356786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档