如何处理加密字符串?

时间:2014-11-07 19:28:22

标签: c windows cryptography

我正在尝试创建一个简单的应用程序,它能够加密和解密一些简单的数据。 CryptEncrypt工作正常。要加密的字符串是:This is a sample string.。此字符串的加密数据为:¼╩b╒áó√ $~ë▀i▐└╕ ]Φwµσ╨|V╜▐µáïÅ╚ 到目前为止一切都很好。

我有加密文本后,我将其复制到另一个字符串。该字符串将在解密时使用。由于某种原因,只有一半的字符串将被复制到新的缓冲区中,因此它不能被解密。 无论我如何尝试。我假设在加密字符串中有一些特殊字符,因此它不会按预期复制。例如,如果我使用sprintf(teststring,"%s",Encryptedstring);,它也只会复制字符串的一半。

  1. 默认情况下,有没有办法让CryptEncrypt以十六进制格式加密数据?
  2. 我应该如何正确复制我的字符串?

3 个答案:

答案 0 :(得分:2)

你犯了一个基本错误:

你正在把一个c字符串(我不能说有或没有终结符)交给CryptEncrypt,并以某种方式神奇地期望得到一个相同长度的有效c字符串。

事情就是这样,任何好的加密函数的输出都看起来像伪随机二进制blob,可能有嵌入的0字节,也许不是,并且不太可能有一个终止的0字节

例如,您提供的输出比输入长得多(最后一部分可能由于缺少0终结符而被垃圾拾取)。

解决方案:正确处理任意二进制数据作为任意二进制数据(memcpy进行复制) 如果你愿意,你可以将它编码成一些文本表示来获得一个字符串,但这需要更多空间,而且肯定不是CryptEncrypt的任务。

答案 1 :(得分:2)

我的建议是,当你谈论加密时,不要谈论字符串。您的字符串只是加密函数的原始数据块,因此请对其进行处理。将数据作为字符串处理的问题是,如果找到空字符,字符串往往会终止,并且您可能会在加密块中获得空字节。

这就是字符串函数不能用于加密数据的原因。如果要将数据从缓冲区复制到另一个缓冲区,请使用memcpy而不是sprintf或strcpy。

答案 2 :(得分:0)

我猜sprintf会在遇到'\ 0'字符时停止复制。你应该使用memcpy