我需要加密一个数字,我和这个加密的值将被提供给客户询问一个密钥,所以我想最小化数字位数并使它们都可打印。
所以我希望结果是全部数字或所有十六进制字符。
我正在使用的当前加密方法(对于非数字)将字符转换为十六进制(每个2个十六进制数字)。这使得人物数量增加了一倍。我还考虑将输入视为十六进制(因此每对数字都被视为十六进制对,但是在输入0123和123之间你有歧义(当解密导致'0'丢失时。
有什么建议吗?
答案 0 :(得分:1)
不要混淆两个不同的问题。使用任何安全加密算法(我建议使用AES-256),如果输出必须是可打印的,则使用base64编码。
如果您想将其限制为另一套(例如小写字母),请使用适当的基数(例如hexavigesimal)
答案 1 :(得分:0)
如果要求打印出带有“许可证密钥”的卡,则必须手动输入,我认为加密所需的值不是最佳解决方案。只有太多的数据。
我认为更好的解决方案是在他们注册的用户名/电子邮件地址上使用简单的哈希算法,将结果散列为128位值(16字节),然后使用Base-32将其转换为字母AZ和数字2-7(大约26个字符)。
Base32的优点是它不区分大小写(如base 64),你不会在“i”和“1”(等)之间混淆。
答案 2 :(得分:0)
我找到了一个简单的kludge: 如果数字的数字是奇数,那么我将占位符Hex(F)字符作为前缀。然后,当我翻转时,如果我看到占位符(F),那么我知道它是一个占位符(b / c只允许数字作为此函数的输入)
答案 3 :(得分:0)
您似乎对加密和编码感到困惑。它们是完全不同的问题。因为您没有提供足够的关于所需安全性的信息来说明适当的加密,所以我假设您正在谈论编码。对于编码,输入是否加密实际上并不重要。唯一的区别是加密输入几乎肯定无法压缩,因此任何压缩都应该在加密之前完成。
对于编码,最简单的方法是将输入视为一个大数(你),选择一组符号并将数字编码为base-N,其中N是所选集合的大小。由于生成的代码用于人类输入,因此您需要避免使用具有相似形状的多个字符(1,l,I / O,O,0,D / 5,S),选择取决于使用的字体
内置错误检测也非常有用。创建良好错误检测的一种简单方法是在数字中添加一些好的哈希函数。例如(伪代码):
number_to_encode = input_number << 5 | MD5(input_number) & 0x1F
encoded_string = Base32Encode(number_to_encode)
number_to_decode = Base32Decode(encoded_string)
output_number = number_to_decode >> 5
checksum = number_to_decode & 0x1F
if MD5(output_number) & 0x1F != checksum then
Error
如果您有错误模型,那么您可以做得更好,但假设随机错误模型得到的效果一样好,检测到超过96%的错误,只添加一个base32字符。