c - 如何处理加密字符串?

标签 c windows cryptography

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

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

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

最佳答案

你犯了一个基本错误:

你正在将一个 c 字符串(我不能说是否有终止符)给 CryptEncrypt并以某种方式神奇地期望获得相同长度的有效 C 字符串。

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

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

解决方案:将任意二进制数据妥善处理为任意二进制数据(memcpy用于复制)。
如果需要,您可以将其编码为某种文本表示以获取字符串,但这是一个额外的步骤,需要更多空间,当然不是 CryptEncrypt 的任务。

关于c - 如何处理加密字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808637/

相关文章:

java - Tomcat 6.0.35 Windows 32b 服务 useSystemProxies

linux - 通过在 Linux 上运行的 Jenkins 在 Windows 上部署包

javascript - 使用 JavaScript 对密码进行非对称加密是否可行?

c++ - 如何编写尊重常量的 C 结构指针包装器

c - 如何正确比较 C 中的字符串?

c - char 数组中的终止符

windows - 将 kinit 与 key 表文件一起使用时会发生什么

php - PHP 和 VB.NET 之间的意外 MD5 哈希结果

java - 查找是否使用双倍长度或三倍长度 3DES

c - C 循环查找数组中的最后一个偶数