使用用户提供的密码在本机Win32和.NET中加密和解密字符串的简单方法是什么?

时间:2012-02-13 22:25:17

标签: .net windows cryptography

我有一个原生的Win32客户端应用程序和一个.NET Web应用程序。我希望能够加密客户端上的字符串(给定用户提供的密码),并且能够在给定相同密码的服务器上解密此字符串。我的客户端应用程序是32位,我的.NET Web应用程序是64位。在客户端上,我无法部署.NET框架。

我需要一个简单而强大的解决方案。简单来说,我的意思是我更喜欢单个函数调用。通过健壮,我的意思是我想要像AES那样的行业标准加密算法,我不希望内存泄漏。

关于如何以简单而强大的方式实现这一目标的任何建议?

(也许是一个32位和64位版本的DLL?我的.NET Web应用程序可以P / Invoke到它,我的本机应用程序可以使用它。)

3 个答案:

答案 0 :(得分:0)

您应该使用Microsoft的Cryptography API。 MSDN文档启动here

这使用crypt32.dll,与.NET中的System.Security.Cryptography API封面下使用的DLL相同。 (您可以向IL反汇编程序检查它已经在该DLL上进行了P / Invoke。)

答案 1 :(得分:0)

我担心没有“魔法”功能可以为您的服务器和客户端执行此操作。编写一个简单的加密/解密方案并不难,因为这些算法都是标准的。构建自己的内容还可以帮助您了解加密和解密在软件中的工作原理。

对于.NET,您可以使用System.Security.Cryptography命名空间,对于Win32,您应该使用CryptoAPI

对于加密方案,根据您的用例,您可以使用简单的对称加密方案。

加密:

  1. 将用户密码与常量salt一起散列以创建32位缓冲区。你可以使用SHA256。 CryptoAPI SHA256仅支持XP SP3及更高版本。否则,您可以在线找到许多开源实现。
  2. 将前16个字节作为密钥,最后16个作为IV。
  3. 使用CryptoAPI中的AES CryptoProvider使用密钥和IV进行加密。
  4. 解密:

    1. 和2.将与加密相同。 .NET内置了SHA256的类,您可以使用它们。执行这些步骤应该为您提供与加密过程中相同的密钥。
    2. 使用密钥和IV,使用AesCryptoServiceProvider类解密数据。请参见此处的示例:https://gist.github.com/1833986(此处不使用任何盐)。

答案 2 :(得分:0)

可以是用户的登录密码而不是他们直接提供的密码吗? Windows支持在用户登录凭据下强大地加密数据(这通常是密码,但可以是智能卡)。与Active Directory一起使用时,甚至可以配置密码恢复选项。

这称为Data Protection API。它可以通过本地代码通过记录here的调用和本地代码通过调用here

访问