有没有人有想法将少量数据安全地编码为大约8个字符?我有一个项目(Flash和Flex(AS3)并不是真正重要的)必须部署在CD / DVD-ROM上(没有本地存储或网络访问),但需要允许人们回到他们中断的地方。因此,需要有一个人性化的代码,可以打印(在死树或PDF上)或写下来并输入到输入字段中,并且可以安全地停止在不同学生之间作弊。
有14个评估项目可以按任何顺序完成。目前我CRC32他们的“登录名”并从该结果取16位,并将它们与14个评估位组合成30位,然后使用Base32的形式编码,给出6个字符,然后添加一个校验字符,然后使用字符替换加密。返回程序并输入7字符进度代码后,在解密和提取后,如果名称哈希部分匹配,则假定完成位正确。
发现的一个问题是,在完成每个项目时只会改变两个字符。是否有一些算法会在任何一位发生变化时完全改变整个字符串?或者有更好的方法吗?我还想存储更多数据(日期,散列的更多位以减少冲突,课程内的位置等)但不想超过8或10个字符。
答案 0 :(得分:0)
与大多数加密一样,它只需要比它所保护的数据的值更强。
听起来,你不会反对政府或专业密码学家......
如果我可以使用更多字符,则可以使用块大小相对较小的实际加密算法(CAST-128,64位块大小)。 Base64编码将增加到12个字符的代码。
即。 Code = Base64(CAST128(用户名+完成位))。为了避免长用户名的情况,您可以先将其哈希:
Code = Base64(CAST128(哈希(用户名)+完成位))
对于评估计划应该足够安全。 (一个明显的问题是你需要将密钥嵌入软件中......但是,如果你不反对政府代理人......)
答案 1 :(得分:0)
所有加密强度散列函数(例如MD5)都具有以下特性:更改单个输入位将以几乎50%的概率改变每个输出位。在生成进度代码时,我建议一个简单的两阶段过程:
11010000000000
表示)。取这个字符串的MD5哈希的前4个字节(8个十六进制数字)。XOR
这些在一起,并将结果报告为8位十六进制数字字符串。当用户稍后返回工作时:
XOR
这些一起产生14位二进制字符串的MD5哈希的前4个字节。所有这些14位二进制字符串的MD5哈希值的前4个字节很小的可能性不大。根据近似值here,但是n = 2 ^ 14并使用2 ^ 32而不是365,这有大约3%的可能性发生。如果是的话,我的建议是在每个附加一些固定字符并再试一次,直到达到清晰度。考虑到低碰撞概率,这不应该进行多次尝试。请注意,仅使用7个十六进制数字会将碰撞概率提高到40%左右,所以不要这样做!没有必要使用单独的校验位方案,因为2 ^ 32中只有2 ^ 14,或者262144随机猜测的进度代码中的1实际上是有效的。
如果您担心精明的用户可以通过撤消其他人的进度代码的XOR
并重新XOR
使用他们自己的用户名的MD5哈希来伪造自己的进度代码,你总是可以通过向每个用户名附加一个固定的字符串(只有你自己知道)来“加盐”用户名。