0

我正在做这个序列号的事情,格式是 xxxxx-xxxxx-xxxxx(15 个字符)。我目前可以加密我的字符串,但问题是:

  1. 6 个字符变成 20+ 个字符。
  2. 有一些难以理解的字符,例如:+、/、=

那么将字符串加密为一定数量的字符的最佳方法是什么?就我而言:6 个字符加密为 15 个字符。

我目前正在使用这样的东西:

    public string EncryptString(string clearText, string Password)
    {
        byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(Password, ByteGetter(UsageMode, "Password")); 
        byte[] encryptedData = EncryptByte(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16));
        return Convert.ToBase64String(encryptedData);
    }


    public static byte[] EncryptByte(byte[] clearData, byte[] Key, byte[] IV)
    {
        MemoryStream ms = new MemoryStream();
        Rijndael alg = Rijndael.Create();
        alg.Key = Key;
        alg.IV = IV;
        CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(clearData, 0, clearData.Length);
        cs.Close();
        byte[] encryptedData = ms.ToArray();
        return encryptedData;
    }
4

3 回答 3

0

首先:包含非字母字符是Base64编码的一个属性。所以你需要选择另一种编码,你可能想开始使用 5 位包裹并编码为 AZ,2-9,但忽略 O,I。这应该给你你想要的字符集。

第二:假设您确实选择了 5 位数据包,您需要 5*15=75 位。大多数哈希将创建 128 位或更多,因此您需要下采样。解决此问题的一种可能方法是简单地忽略位。

于 2013-05-14T00:19:00.053 回答
0

从问题中合成评论线程:

如果您希望序列码是(可逆)加密数据,则不能很好地限制其大小。你被加密算法给你的任何东西困住了,它们通常在固定大小的块上运行。

将加密数据编码成一堆 ASCII 字符的明显选择是:

  • base64 - 广泛支持,但不能仅使用字母数字实现,并且区分大小写
  • base32 - 有点晦涩 - 你必须编写/找到一个实现。RFC 指定的标准要求使用 s 填充=。(就像它对base64所做的那样。)比base16更紧凑,并且只需要对数据不区分大小写的字母数字,如果您希望人们手动键入代码,这是一个优势。
  • base16 - 也得到很好的支持,从不需要填充,但远不如其他两个紧凑。

知道编码字符串的长度对于base32必须是 8的倍数,对于 base64必须是4的倍数,因此您可以解决填充问题。(我对此不是 100% 确定,但这是有道理的,因为您希望编码的字符串表示 8 位的倍数。)知道这一点后,您可以添加填充字符以使解码器停止抱怨输入长度无效。(Convert.FromBase64String()确实抱怨。)

如果您想以某种特定方式限制给定输入大小的输出大小,并且不愿意丢弃数据(即散列而不是加密),您将不得不推出自己的加密算法。这似乎大多适得其反。

于 2013-05-14T21:22:49.373 回答
0

根据您的要求,您需要:

  • 使用 DES 加密
  • 使用 Base 32 编码(base 16 将为您提供 16 个字节而不是 15 个字节)
  • 随心所欲地垫
于 2013-05-14T21:29:01.827 回答