1

我正在用 C# 开发一个加密用户和管理员密码的类项目。要加密我正在使用TripleDESCryptoServiceProvider.

在配置应用程序中,用户输入用于加密和解密密码的密钥。我想要一个按钮来生成一个密钥来帮助用户,但我不知道如何随机生成 128 位。如何生成 128 位的密钥?

4

3 回答 3

9

要为加密使用生成随机值,您应该使用RNGCryptoServiceProvider

byte[] bytes = new byte[16];
var rng = new RNGCryptoServiceProvider();
rng.GetBytes(bytes);

要将这个字节序列转换为字符串,您可以使用 hex ( BitConverter.ToString) 或 Base64 ( Convert.ToBase64String)。


但是这里有一些奇怪的地方:

于 2013-05-15T20:49:22.613 回答
1

我完全理解您想要什么而不是使用 html 传递 url://mydomain.com?Id = 123,你想传递一个加密的值。当有人点击这个带有加密 id 的 url 时,你想解密 url 的值。

有2个程序:

在加密中: 1 - 将“ID”(通常是整数)转换为字符串。示例 var NewId = Convert.ToString ((ID); 2 - 使用一个短语来随机加密。示例:“我爱巧克力”(如果你有这个短语可以从你的参数数据库中找到......)

在解密中: 1 - 使用相同的阻止短语来解读。2 - 使用 Convert.ToInt32 将解密的内容再次转换为整数(上面的随机变量)

您将必须实现 2 个功能:

加密功能:

private string Encrypt(string clearText)
    {
        string EncryptionKey = "I love chocolate";
        byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                clearText = Convert.ToBase64String(ms.ToArray());
            }
        }
        return clearText;
    }

解密功能:

private string Decrypt(string cipherText)
    {
        string EncryptionKey = "I love chocolate";
        byte[] cipherBytes = Convert.FromBase64String(cipherText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                    cs.Close();
                }
                cipherText = System.Text.Encoding.Unicode.GetString(ms.ToArray());
            }
        }
        return cipherText;
    }

将 ID 加密为 ID = "123" 时,您将获得 ID = "B8 + iXv5 / 8BUQEbHt8 // fGA ==" 的 ID 值。

当您解密 ID 值“B8 + iXv5 / 8BUQEbHt8 // fGA ==”时,您将再次获得“123”。

C# 中的示例:

  var OriginalId = 123;
          var EncrypetedId = Encrypt(Convert.ToString(OriginalId));
          //for recovering original value
          var OriginalID = Convert.ToInt32(Decrypt(EncrypetedId));

我希望这可以帮助你。

于 2017-09-20T01:12:49.170 回答
0

看一下RNGCryptoServiceProvider类,特别是GetNonZeroBytes方法。您可能可以通过 base64 编码运行该字节字符串以使其易于阅读。

于 2013-05-15T20:50:59.713 回答