【问题标题】:how can i decrypt an encrypted message in AES which is of alphanumeric form ? In the code below, encryption gives alphanum. but decryption is wrongw如何解密字母数字形式的 AES 加密消息?在下面的代码中,加密给出了字母数字。但解密是错误的
【发布时间】:2021-04-09 09:35:29
【问题描述】:

如何解密字母数字形式的 AES 加密消息?在下面的代码中,加密给出了字母数字序列,但解密产生了错误的明文。

unsigned char key[16] = {
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
};

int originalLen = strlen((const char *)message);
int lenofPaddedMessage = originalLen;

if (lenofPaddedMessage % 16 != 0)
    lenofPaddedMessage = (lenofPaddedMessage / 16 + 1) * 16;

unsigned char *paddedMessage = new unsigned char[lenofPaddedMessage];
for (int i = 0; i < lenofPaddedMessage; i++) {
    if (i >= originalLen)
        paddedMessage[i] = 0;
    else
        paddedMessage[i] = message[i];
}
for (int i = 0; i < lenofPaddedMessage; i += 16)
    AES_Encrypt(paddedMessage + i, key);

cout << " Encrypted message:" << endl;
for (int i = 0; i < lenofPaddedMessage; i++) {
    cout << (paddedMessage[i]) << endl;
    cout << " ";
}

unsigned char expandedKey[176];

int messageLen = strlen((const char *)paddedMessage);
unsigned char *decryptedMessage = new unsigned char[messageLen];
for (int i = 0; i < messageLen; i += 16) {
    AESDecrypt(paddedMessage + i, expandedKey, decryptedMessage + i);
}
cout << "Decrypted message in hex:" << endl;
for (int i = 0; i < messageLen; i++) {
    cout << hex << (int)decryptedMessage[i];
    cout << " ";
}
cout << endl;
cout << "Decrypted message: ";
for (int i = 0; i < messageLen; i++) {
    cout << decryptedMessage[i];
    cout << endl;
}

【问题讨论】:

  • 如果密文是“字母数字”形式,则需要先将其解码为二进制,然后再解密。它的解码方式直接与它的编码方式、基本十六进制、base64 等相关。我们不知道,如果你不知道,你需要找出来。无关,我发现您的加密库不一致使用下划线(AES_Encrypt 与 AESDecrypt)有问题。
  • 加密信息是十六进制的,我可以解密吗?WhozCraig
  • 删除了之前的评论,因为它没有应有的好。请尽一切努力使您的代码尽可能可读。一件简单的事情是确保它正确缩进。另一种方法是将其拆分为可读性好的方法调用(例如填充消息可能是一个单独的调用)。
  • 花了一些时间找出方法,但我使用 clang-format -i -style="{BasedOnStyle: llvm, IndentWidth: 4}" yourcode.cpp 进行了回流。

标签: c++ cryptography


【解决方案1】:
int messageLen = strlen((const char *)paddedMessage);

加密的填充消息由随机字节组成,而不是字符。很可能这些字节包含一个零,然后strlen 将不起作用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 2014-08-01
  • 1970-01-01
相关资源
最近更新 更多