当前位置: 首页 > 知识库问答 >
问题:

用C#生成128位字符串

严烨
2023-03-14

我正在用C#开发一个加密用户和管理员密码的类项目。为了加密,我使用了< code > triplescryptoserviceprovider 。

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

共有3个答案

阙辰龙
2023-03-14

查看RNGCryptoService提供者类,特别是GetNZeroBytes方法。您可以通过Bas64编码运行该字节字符串,以使其具有人类可读性。

富凯风
2023-03-14

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

为此有两个步骤:

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

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

您必须实现两个功能:

加密功能:

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));

我希望这可以帮助你。

蔚和风
2023-03-14

若要生成用于加密的随机值,您应该使用< code > RNGCryptoServiceProvider :

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

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

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

  • 3DES使用168位密钥
  • 如果您想使用对称加密,可能应该使用AES。3DES并没有完全崩溃,但它几乎只用于传统用途
  • 请注意您选择的分组密码操作模式。您通常需要适当的IV、MAC和安全链接模式
  • 通常,您实际上应该散列密码,而不是加密密码。请参阅如何安全散列密码?在安全方面。SE了解详细信息
 类似资料:
  • 问题内容: 我正在寻找实现以下目标的方法: 我可以自己编写它,但是在我看来,我曾经看过一个执行此操作的库,可能是slf4j记录器,但是我不想编写日志消息。我只想生成字符串。 您知道这是哪个图书馆吗? 问题答案: 参见方法。

  • signature1值总是39字节[]数组,当我转换为十六进制时,长度大于64。我想在C#中从P-128 ECC算法生成精确的64长度十六进制签名值。 让我解释下面的代码: > 对必须签名的纯文本消息进行哈希

  • 我想知道如何在StringBuilder中插入umlaut(“).. HTML文本:::: C# 由于'navigation.html'html不能正常工作...我需要追加“navigation.html”, 我想听听你的很多想法... 比如使用字符..等等。:)

  • 是否需要其他数据来生成ConnectionString?

  • 本文向大家介绍用Java生成随机字符串,包括了用Java生成随机字符串的使用技巧和注意事项,需要的朋友参考一下 让我们首先声明一个字符串数组并初始化- 现在,创建一个Random对象- 生成随机字符串- 示例 输出结果 让我们再次运行它以获得不同的随机字符串-

  • 本文向大家介绍生成随机字符串,直到使用Python生成给定字符串为止,包括了生成随机字符串,直到使用Python生成给定字符串为止的使用技巧和注意事项,需要的朋友参考一下 给定一个字符串,我们的任务是使用字符,特殊字符,数字等的随机组合生成一些字符串。 示例 算法 范例程式码 输出结果