整数的短加密

时间:2017-07-10 08:59:06

标签: c# .net encryption public-key-encryption

我给出了一个加密输入整数值的任务,这个整数最大长度为4,但是,我需要加密成一个字母数字字符串。除此之外,我从相同值(例如10)生成的结果值必须不相同。最困难的部分是,加密的字符串最大只能有15个长度,因为我们必须把它放在查询字符串中。这是一项艰巨的任务,我试图询问谷歌,但我没有发现任何解决方案可以帮助我解决这个问题。所有长度太长,不符合我的要求。任何加密专业人士都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

假设:"整数最大6长度"表示6个数字字符000000-999999。

使用具有8字节块大小的算法进行加密,然后使用Base64编码,这将产生12个字符的输出。

将2个随机字节附加到数据的6个字符以生成8个字节,这将导致在加密相同值时最多2 ^ 16或65536个不同的结果。在ECB模式和Base64编码中加密。这将产生12个字符的输出。

要恢复输入解码,将Base64加密为数据,解密并删除2个随机字节。

可能的加密算法包括BlowfishXTEA,DES等。

注意:对于更大范围的不同输出,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

https://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes(v=vs.110).aspx