【问题标题】:Extend encrypted message with AES 128 mbedtls使用 AES 128 mbedtls 扩展加密消息
【发布时间】:2022-01-18 05:33:36
【问题描述】:

我正在尝试使用 mbedtls/aes.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 

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

【问题讨论】:

  • 您的硬编码长度为 16。
  • 我已经尝试更改这些值,但更改后我得到了一个破译的结果,例如“␀␟�?`␟�?
  • mbedtls_aes_crypt_ecb(..) 只加密一个块(16 字节)。您需要遍历您的消息并一次加密 16 个字节...

标签: c++ c encryption aes


【解决方案1】:

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)

如果您愿意,还可以查看可用的 different modes 并选择最适合您的用例的。

ECB 相当不安全,因为它单独加密每个块,因此不同块之间的模式保留在密码文本中。

我建议改用CBC / CFB128 / CFB8

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多