我给出了一个加密输入整数值的任务,这个整数最大长度为4,但是,我需要加密成一个字母数字字符串。除此之外,我从相同值(例如10)生成的结果值必须不相同。最困难的部分是,加密的字符串最大只能有15个长度,因为我们必须把它放在查询字符串中。这是一项艰巨的任务,我试图询问谷歌,但我没有发现任何解决方案可以帮助我解决这个问题。所有长度太长,不符合我的要求。任何加密专业人士都可以帮我解决这个问题吗?
答案 0 :(得分:1)
假设:"整数最大6长度"表示6个数字字符000000-999999。
使用具有8字节块大小的算法进行加密,然后使用Base64编码,这将产生12个字符的输出。
将2个随机字节附加到数据的6个字符以生成8个字节,这将导致在加密相同值时最多2 ^ 16或65536个不同的结果。在ECB模式和Base64编码中加密。这将产生12个字符的输出。
要恢复输入解码,将Base64加密为数据,解密并删除2个随机字节。
注意:对于更大范围的不同输出,6位数字首先可以转换为3字节的二进制表示,允许5个随机字节为同一个6位输入产生2 ^ 40个不同的输出。
答案 1 :(得分:0)
我假设您希望函数输入一个四位数字:[0000 .. 9999]并生成一个15个字符的字母数字输出。
您不清楚此功能是否可逆。如果不需要可逆性,则单向散列函数将执行您想要的操作。 15个十六进制字符为60位或15个Base32字符为75位。使用更大的哈希函数,截断并转换为十六进制或Base32。 Base32提供比十六进制更宽范围的输出字符。
对于可逆性,您需要Format Preserving Encryption,其中输出大小限制为60或75个有效位。对于60位,使用DES作为基本密码,因为它具有64位块大小。 75位更尴尬。 128位的AES具有太大的块大小,因此您可能需要编写一个简单的76位Feistel密码。这将给你很好的默默无闻,但只有中等安全。你没有说这个功能需要多么安全。
答案 2 :(得分:-2)
public static string GetUniquePasswordSalt(string password)
{
string uniqueSaltValue = "";
Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, 16);
uniqueSaltValue = Convert.ToBase64String(rfc2898.Salt);
return uniqueSaltValue;
}
Out将是" HB6yY + f5fyOaFFyrKEcPYw ==" for" 01"
尝试Rfc2898DeriveBytes