在C#中生成128位字符串

时间:2013-05-15 20:44:57

标签: c# encryption password-encryption

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

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

3 个答案:

答案 0 :(得分:8)

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

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

要将此字节序列转换为字符串,您可以使用十六进制(BitConverter.ToString)或Base64(Convert.ToBase64String)。


但这里有一些奇怪的观点:

  • 3DES使用168位密钥
  • 如果要使用对称加密,则应该使用AES。 3DES并没有完全破碎,但它仅仅是传统用途。
  • 请注意您选择的Block cipher mode of operation。您通常需要适当的IV,MAC和安全链接模式
  • 通常你应该使用哈希密码而不是加密密码。有关详细信息,请参阅How to securely hash passwords? on security.SE

答案 1 :(得分:0)

查看RNGCryptoServiceProvider类,特别是GetNonZeroBytes方法。您可以通过base64编码运行该字符串字符串,以使其可读。或者。

答案 2 :(得分:0)

我完全理解你想要的东西而不是通过htttp://mydomain.com传递网址? Id = 123,您希望传递加密值。当有人点击带有加密ID的网址时,您需要解密该网址的值。

有两个程序:

加密: 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的值ID =“B8 + iXv5 / 8BUQEbHt8 // fGA ==”。

当您解密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));

我希望这可以帮到你。