【发布时间】: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