龙 龙之吻 Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-29 #1 三个字符串A,B,C A长度12,B长度18,C长度2 求一密文包含这三条信息,而且可以反算 密文长度不能超过20,密文只能由数字和字母组成 我做注册码用
C creation-zy Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-29 #2 明文信息量为22个Byte(256^22),而密文为20个数字或字母(36^20),显然密文不可 能完全容纳明文的全部信息,注定是不能被反算的——除非用规定明文字符串只能由数字构 成等方法来缩小明文的信息量。 请参考 http://www.delphibbs.com/delphibbs/dispq.asp?lid=2315731
明文信息量为22个Byte(256^22),而密文为20个数字或字母(36^20),显然密文不可 能完全容纳明文的全部信息,注定是不能被反算的——除非用规定明文字符串只能由数字构 成等方法来缩小明文的信息量。 请参考 http://www.delphibbs.com/delphibbs/dispq.asp?lid=2315731
Q qqjm Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-29 #3 上楼的看清楚了,明文是32个字节,而密文只有20个字节。 还要求可以还原的话根本不可能做到,就算全是字母、数字并且不分大小写,32位可以有36的32次方种情况,20位有36的20次方种情况。 36的32次方和36的20次方完全不是同一个级数的。 楼主不要再想这个问题了。 要么你放弃还原,要么增大密文长度。
上楼的看清楚了,明文是32个字节,而密文只有20个字节。 还要求可以还原的话根本不可能做到,就算全是字母、数字并且不分大小写,32位可以有36的32次方种情况,20位有36的20次方种情况。 36的32次方和36的20次方完全不是同一个级数的。 楼主不要再想这个问题了。 要么你放弃还原,要么增大密文长度。
U ufo! Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-29 #4 如果明文里面冗余度高,可以考虑压缩。但这就存在了不确定因素。
C creation-zy Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-30 #8 放弃是一种智慧,呵呵 注册过程: MyHash(A+B+C) => H 获得散列值——长度已经被压缩(存在信息丢失) MyEnc(H) => UserSN 对H加密(无损),将结果UserSN显示给用户 用户将UserSN发给你 MyDec(UserSN) => H 反算出H值 MyEnc2(H) => UserKey 对H进行另一种加密(无损),生成UserKey 将UserKey发送给用户 MyDec2(UserKey) => H2 根据注册码UserKey反算出H2 if MyHash(A+B+C)=H2 then 注册成功 else 失败 至于散列以及加密算法,可以采用强度极高的双向流式加密算法: http://www.delphibbs.com/keylife/iblog_show.asp?xid=7088 散列的过程就是将32字节的字符串加密成等长的密文字符串后,截取前面的几个字符(具 体个数自行确定,建议8位即可——冲突概率为1/(2^64),够用了)。 序列号的生成,可以简单的将密文字符串变成十六进制编码(长度将扩展一倍),就可以 显示给用户了。
放弃是一种智慧,呵呵 注册过程: MyHash(A+B+C) => H 获得散列值——长度已经被压缩(存在信息丢失) MyEnc(H) => UserSN 对H加密(无损),将结果UserSN显示给用户 用户将UserSN发给你 MyDec(UserSN) => H 反算出H值 MyEnc2(H) => UserKey 对H进行另一种加密(无损),生成UserKey 将UserKey发送给用户 MyDec2(UserKey) => H2 根据注册码UserKey反算出H2 if MyHash(A+B+C)=H2 then 注册成功 else 失败 至于散列以及加密算法,可以采用强度极高的双向流式加密算法: http://www.delphibbs.com/keylife/iblog_show.asp?xid=7088 散列的过程就是将32字节的字符串加密成等长的密文字符串后,截取前面的几个字符(具 体个数自行确定,建议8位即可——冲突概率为1/(2^64),够用了)。 序列号的生成,可以简单的将密文字符串变成十六进制编码(长度将扩展一倍),就可以 显示给用户了。