将字符串加密为15个字符

时间:2013-05-14 00:11:01

标签: c# encryption

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

  1. 6个字符变为20多个字符。
  2. 有一些可以理解的字符,例如:+,/,=
  3. 那么将字符串加密到特定数量的字符的最佳方法是什么? 在我的情况下: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;
        }
    

3 个答案:

答案 0 :(得分:0)

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

第二:假设您确实选择了5位数据包,则需要5 * 15 = 75位。大多数哈希将产生128位以上的矿石,因此您需要进行下采样。解决这个问题的一种可能方法是简单地忽略位。

答案 1 :(得分:0)

从问题中综合评论主题:

如果您希望串行代码是(可逆)加密数据,则无法真正限制其大小。无论加密算法给你什么,你都会遇到困难,而且它们通常在固定大小的块上运行。

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

  • base64 - 受到广泛支持,但不能仅使用字母数字实现,并且区分大小写
  • base32 - 有点模糊 - 您必须编写/查找实现。 RFC-specified标准要求使用= s填充。 (就像它对 base64 一样。)比 base16 更紧凑,并且只需要对数据不区分大小写的字母数字,如果您希望人们输入数据,这是一个优势手工编写。
  • base16 - 也非常支持,从不需要填充,但远不如其他两个紧凑。

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

如果要以某种特定方式限制输入大小,并且不愿意丢弃数据(即散列而不是加密),则必须使用自己的加密算法。这似乎适得其反。

答案 2 :(得分:0)

根据您的要求,您需要:

  • 使用DES加密
  • 使用Base 32进行编码(base 16将为您提供16个字节而不是15个字符)
  • 你喜欢的垫