当前位置: 首页 > 知识库问答 >
问题:

Arduino AES128加密-解密问题

解高昂
2023-03-14

我的Arduino板上有以下代码:

#include <Crypto.h>
#include <base64.hpp>
#define BLOCK_SIZE 16
uint8_t key[BLOCK_SIZE] = { 1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7 };
uint8_t iv[BLOCK_SIZE] = { 7,6,5,4,3,2,1,9,8,7,6,5,4,3,2,1 };

void bufferSize(char* text, int &length)
{
  int i = strlen(text);
  int buf = round(i / BLOCK_SIZE) * BLOCK_SIZE;
  length = (buf <= i) ? buf + BLOCK_SIZE : length = buf;
}

void encrypt(char* plain_text, char* output, int length)
{
  byte enciphered[length];
  AES aesEncryptor(key, iv, AES::AES_MODE_128, AES::CIPHER_ENCRYPT);
  aesEncryptor.process((uint8_t*)plain_text, enciphered, length);
  int encrypted_size = sizeof(enciphered);
  char encoded[encrypted_size];
  encode_base64(enciphered, encrypted_size, (unsigned char*)encoded);
  strcpy(output, encoded);
}

void decrypt(char* enciphered, char* output, int length)
{
  length = length + 1; //re-adjust
  char decoded[length];
  decode_base64((unsigned char*)enciphered, (unsigned char*)decoded);
  bufferSize(enciphered, length);
  byte deciphered[length];
  AES aesDecryptor(key, iv, AES::AES_MODE_128, AES::CIPHER_DECRYPT);
  aesDecryptor.process((uint8_t*)decoded, deciphered, length);
  strcpy(output, (char*)deciphered);
}

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    ; //wait
  }

}

void loop() {
  char plain_text[] = "123456789";
  unsigned long time = 0;

  time = micros();
  encrypt;
  int length = 0;
  bufferSize(plain_text, length);
  char encrypted[length];
  encrypt(plain_text, encrypted, length);
  Serial.println(encrypted); 
  decrypt;
  length = strlen(encrypted);
  char decrypted[length];
  decrypt(encrypted, decrypted, length);
  Serial.print("Decrypted: ");
  Serial.println(decrypted);
  delay(1000);
}

它可以加密和解密,我在串行下一个输出:

njf 00 xnz 92 nvczkexeuhkg = = < br >解密:123456789

但问题是,如果我使用在线工具进行解密https://www.devglan.com/online-tools/aes-encryption-decryption,键1234567891234567、IV 7654321987654321和CBC 128(即使ECB 128没有IV),我只收到一条错误消息:

给定的最后一个块没有正确填充。如果在解密过程中使用了错误的密钥,就会出现这样的问题。

我的代码有什么问题?

共有2个答案

曾昂然
2023-03-14

如果您将密钥指定为1234567891234567,在线工具可能会错误地解释它,它们大多数都希望密钥以十六进制提供,因此您应该尝试将密钥指定为010203040506080901020304050607,这同样适用于IV

方焱
2023-03-14

几乎所有的在线“AES工具”都做得很差,通常是由对密码学知之甚少的人制作的——不要依赖它们来测试代码。

相反,用定义良好的测试向量来测试你的代码,就像这些。我在下面包含了第一个测试案例:

Key       : 0x06a9214036b8a15b512e03d534120006
IV        : 0x3dafba429d9eb430b422da802c9fac41
Plaintext : "Single block msg"
Ciphertext: 0xe353779c1079aeb82708942dbe77181a
 类似资料:
  • 问题内容: 我有以下加密数据: 对其进行解密的密码是: (这是来自胡言乱语的例子) 在命令行中使用openssl: 输出为: 使用我的NodeJS应用程序: 我在一行中遇到以下错误。 我想念什么吗?谢谢。 问题答案: 加密的数据以8字节的“魔术”开头,表示存在盐(的ASCII编码)。然后接下来的8个字节是盐。现在是个坏消息:Node.js似乎没有对EVP_BytesToKey方法使用盐: 那是盐。

  • 问题内容: 我有以下Go代码 输出是 使用以下CryptoJS加密 并且可以用解密 输出是-这是正确的输出 为什么Go会有不同的输出? 问题答案: 请检查您的错误。总是 https://play.golang.org/p/dRLIT51u4I 更具体地说,字节75处的值为,超出了base64可用字符的范围。在ascii中,它是ENQ(查询)字符。至于为什么它最终出现在您的最终base64字符串中,

  • 问题内容: 我迅速编写了一个应用程序,我需要AES加密和解密功能,我从另一个.Net解决方案中接收了加密数据,但是我找不到解决办法。 这是我的.net加密: 我需要迅速解密功能。 问题答案: 我找到了解决方案,它是一个很好的库。 跨平台256位AES加密/解密。 此项目包含在所有平台(C#,iOS,Android)上均可使用的256位AES加密的实现。关键目标之一是通过简单的实现使AES在所有平台

  • 问题内容: 我找到了在PHP中对字符串进行编码/解码的示例。起初它看起来非常好,但是不会起作用:-( 有人知道问题出在哪里吗? 结果是: 加密: 解密: 问题答案: 并且 在您的代码中未定义。查看有效的解决方案( 但不安全! ): 停! 这个例子是 不安全的! 不要使用它! **但是此代码中还有其他问题,使其变得不安全,尤其是使用ECB(这不是_加密_模式,只能在其上定义加密模式的构造块)。

  • 我在这个网站上用AES-256加密一个虚拟字符串: https://www.devglan.com/online-tools/aes-encryption-decryption 具有以下参数: null 当我尝试用OpenSSL从命令行解密它时: 我得到这个错误:

  • 我加密的是对称的AES密钥,它加密我的实际数据,所以密钥长度是16字节。当简单的base64编码密钥时,一切都正常,所以我知道这个RSA加密有问题。 下面是我的iOS调用的一个示例: 下面是我的Java调用的一个示例: null 当我进行更多测试时,我看到了这个页面(http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/pkcs/pkcs1/rsa