加密字符串到15个字符

本文关键字:字符 15个 字符串 加密 | 更新日期: 2023-09-27 18:13:38

我正在做这个串行密钥的事情,其中格式是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;
    }

加密字符串到15个字符

根据问题合成评论线程:

如果你希望串行码是(可逆)加密的数据,你不能很好地限制它的大小。无论加密算法给你什么,你都会被困住,它们通常在固定大小的块上操作。

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

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

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

如果你想以某种特定的方式约束给定输入大小的输出大小,并且不愿意丢弃数据(即哈希而不是加密),你将不得不使用自己的加密算法。

首先:包含非alpha字符是base64编码的一个属性。因此,您需要选择另一种编码,您可能希望开始使用5位包并编码为A-Z, 2-9,但省略O,I。这应该会给你你想要的字符集。

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

根据您的需求,您需要:

  • 用DES加密
  • 用Base 32编码(Base 16将给你16字节而不是15)