我正在尝试创建一个简单的应用程序,它能够加密和解密一些简单的数据。 CryptEncrypt
工作正常。要加密的字符串是:This is a sample string.
。此字符串的加密数据为:¼╩b╒áó√ $~ë▀i▐└╕ ]Φwµσ╨|V╜▐µáïÅ╚
到目前为止一切都很好。
我有加密文本后,我将其复制到另一个字符串。该字符串将在解密时使用。由于某种原因,只有一半的字符串将被复制到新的缓冲区中,因此它不能被解密。
无论我如何尝试。我假设在加密字符串中有一些特殊字符,因此它不会按预期复制。例如,如果我使用sprintf(teststring,"%s",Encryptedstring);
,它也只会复制字符串的一半。
CryptEncrypt
以十六进制格式加密数据?答案 0 :(得分:2)
你犯了一个基本错误:
你正在把一个c字符串(我不能说有或没有终结符)交给CryptEncrypt
,并以某种方式神奇地期望得到一个相同长度的有效c字符串。
例如,您提供的输出比输入长得多(最后一部分可能由于缺少0终结符而被垃圾拾取)。
解决方案:正确处理任意二进制数据作为任意二进制数据(memcpy
进行复制)
如果你愿意,你可以将它编码成一些文本表示来获得一个字符串,但这需要更多空间,而且肯定不是CryptEncrypt
的任务。
答案 1 :(得分:2)
我的建议是,当你谈论加密时,不要谈论字符串。您的字符串只是加密函数的原始数据块,因此请对其进行处理。将数据作为字符串处理的问题是,如果找到空字符,字符串往往会终止,并且您可能会在加密块中获得空字节。
这就是字符串函数不能用于加密数据的原因。如果要将数据从缓冲区复制到另一个缓冲区,请使用memcpy而不是sprintf或strcpy。
答案 2 :(得分:0)
我猜sprintf会在遇到'\ 0'字符时停止复制。你应该使用memcpy