不完全解密 C++ 和 WCHAR
Incomplete decryption C++ and WCHAR
用C++写一个WCHAR加解密模块
static UINT OGL_KEYTABLE_SIZE = 22;
static int oglKeyTable[] = { 10, 71, 45, 13, 16, 19, 49, 55, 78, 125, 325,
10, 71, 45, 13, 16, 19, 49, 55, 78, 125, 325 };
PCWSTR encryptString(PCWSTR Message)
{
int size = lstrlenW(Message);
WCHAR Encrypted[200];
for (wchar_t i = 0; i < size; i++) {
if (((Message[i] + oglKeyTable[i%OGL_KEYTABLE_SIZE]) <= 255)
&&
((Message[i] + oglKeyTable[i%OGL_KEYTABLE_SIZE]) != 0)
)
Encrypted[i] = (Message[i] + oglKeyTable[i%OGL_KEYTABLE_SIZE]);
else
Encrypted[i] = Message[i];
}
Encrypted[size]= '[=10=]';
int Esize = lstrlenW(Encrypted);
printf("\n%ls", Message);
printf("\n%ls", Encrypted);
size = lstrlenW(Encrypted);
WCHAR Decrypted[200];
for (wchar_t i = 0; i < size; i++) {
if (Encrypted[i] <= 255 ) {
Decrypted[i] = (Encrypted[i] - oglKeyTable[i%OGL_KEYTABLE_SIZE]);
}
}
Decrypted[size] = '[=10=]';
printf("\n%ls", Decrypted);
return Encrypted;
}
但是逻辑在某处失败了,我得到的解密不完整
- 原始消息:
Apple tastes good and it__is__very__good__for
health !
- 加密消息:
K+¥yu3Ñÿ-±e}gö|¦wQÿ+ß
s+îlyåÉû-Grâªît¦éòû¡po|gòrq¦ÑƒnP
- 解密消息:Apple tast
你的密码有一些严重的问题。您只允许 [1, 255] 范围内的密文值,但两次使用 325 的密钥组件,然后将其添加到明文中。在加密期间,您然后在这些情况下决定明文字符也是密文字符。但是在解密过程中你不区分加密的两个分支。
WCHAR Decrypted[200];
for (wchar_t i = 0; i < size; i++) {
if ((Encrypted[i] - oglKeyTable[i%OGL_KEYTABLE_SIZE]) > 0) {
Decrypted[i] = (Encrypted[i] - oglKeyTable[i%OGL_KEYTABLE_SIZE]);
} else {
Decrypted[i] = Encrypted[i];
}
}
我不确定这是否适用于每个关键组件,但这是问题的正确原因,因为在解密过程中会得到负字符。缺少的第一个字符位于 i == 10
,这与 325 键组件一致。
更好的方法是保留密钥并使用模运算符保持在正确的范围内:
Encrypted[i] = ((Message[i] + oglKeyTable[i%OGL_KEYTABLE_SIZE]) % 255) + 1;
以及解密过程中的等效逆向。如果这样做,您将不再需要这两个分支。它与 Vigenère 密码有一些相似之处。
旧解决方案:
问题是您使用 lstrlenW
来获取基于空终止的 returns 密文的长度。密文看起来是随机的,因此它在密文中的任何地方都必然有 [=14=]
个字节。您应该使用 size
值进行解密,而不是用 lstrlenW(Encrypted)
.
覆盖它
用C++写一个WCHAR加解密模块
static UINT OGL_KEYTABLE_SIZE = 22;
static int oglKeyTable[] = { 10, 71, 45, 13, 16, 19, 49, 55, 78, 125, 325,
10, 71, 45, 13, 16, 19, 49, 55, 78, 125, 325 };
PCWSTR encryptString(PCWSTR Message)
{
int size = lstrlenW(Message);
WCHAR Encrypted[200];
for (wchar_t i = 0; i < size; i++) {
if (((Message[i] + oglKeyTable[i%OGL_KEYTABLE_SIZE]) <= 255)
&&
((Message[i] + oglKeyTable[i%OGL_KEYTABLE_SIZE]) != 0)
)
Encrypted[i] = (Message[i] + oglKeyTable[i%OGL_KEYTABLE_SIZE]);
else
Encrypted[i] = Message[i];
}
Encrypted[size]= '[=10=]';
int Esize = lstrlenW(Encrypted);
printf("\n%ls", Message);
printf("\n%ls", Encrypted);
size = lstrlenW(Encrypted);
WCHAR Decrypted[200];
for (wchar_t i = 0; i < size; i++) {
if (Encrypted[i] <= 255 ) {
Decrypted[i] = (Encrypted[i] - oglKeyTable[i%OGL_KEYTABLE_SIZE]);
}
}
Decrypted[size] = '[=10=]';
printf("\n%ls", Decrypted);
return Encrypted;
}
但是逻辑在某处失败了,我得到的解密不完整
- 原始消息:
Apple tastes good and it__is__very__good__for health !
- 加密消息:
K+¥yu3Ñÿ-±e}gö|¦wQÿ+ß s+îlyåÉû-Grâªît¦éòû¡po|gòrq¦ÑƒnP
- 解密消息:Apple tast
你的密码有一些严重的问题。您只允许 [1, 255] 范围内的密文值,但两次使用 325 的密钥组件,然后将其添加到明文中。在加密期间,您然后在这些情况下决定明文字符也是密文字符。但是在解密过程中你不区分加密的两个分支。
WCHAR Decrypted[200];
for (wchar_t i = 0; i < size; i++) {
if ((Encrypted[i] - oglKeyTable[i%OGL_KEYTABLE_SIZE]) > 0) {
Decrypted[i] = (Encrypted[i] - oglKeyTable[i%OGL_KEYTABLE_SIZE]);
} else {
Decrypted[i] = Encrypted[i];
}
}
我不确定这是否适用于每个关键组件,但这是问题的正确原因,因为在解密过程中会得到负字符。缺少的第一个字符位于 i == 10
,这与 325 键组件一致。
更好的方法是保留密钥并使用模运算符保持在正确的范围内:
Encrypted[i] = ((Message[i] + oglKeyTable[i%OGL_KEYTABLE_SIZE]) % 255) + 1;
以及解密过程中的等效逆向。如果这样做,您将不再需要这两个分支。它与 Vigenère 密码有一些相似之处。
旧解决方案:
问题是您使用 lstrlenW
来获取基于空终止的 returns 密文的长度。密文看起来是随机的,因此它在密文中的任何地方都必然有 [=14=]
个字节。您应该使用 size
值进行解密,而不是用 lstrlenW(Encrypted)
.