|
生解码表。基本上说,如果 a映射到b,那么b一定可以映射到a,所以b[a[n]] = n.(n是一个在0到255之间的数)。在一个循环中赋值,使用一个256字节的解码表它对应于我们刚才在上一步产生的256字节的加密表。 使用这个方法,已经可以产生这样的一个表,表的顺序是随机,所以产生这256个字节的随机数使用的是二次伪随机,使用了两个额外的16位的密码.现在,已经有了两张转换表,基本的加密解密是如下这样工作的。前一个字节密文是这个256字节的表的索引。或者,为了提高加密效果,可以使用多余8位的值,甚至使用校验和或者crc算法来产生索引字节。假定这个表是256*256的数组,将会是下面的样子: crypto1 = a[crypto0][value] 变量crypto1是加密后的数据,crypto0是前一个加密数据(或着是前面几个加密数据的一个函数值)。很自然的,第一个数据需要一个“种子”,这个“种子” 是我们必须记住的。如果使用256*256的表,这样做将会增加密文的长度。或者,可以使用你产生出随机数序列所用的密码,也可能是它的crc校验和。顺便提及的是曾作过这样一个测试: 使用16个字节来产生表的索引,以128位的密钥作为这16个字节的初始的种子。然后,在产生出这些随机数的表之后,就可以用来加密数据,速度达到每秒钟100k个字节。一定要保证在加密与解密时都使用加密的值作为表的索引,而且这两次一定要匹配。
加密时所产生的伪随机序列是很随意的,可以设计成想要的任何序列。没有关于这个随机序列的详细的信息,解密密文是不现实的。例如:一些ascii码的序列,如“eeeeeeee可能被转化成一些随机的没有任何意义的乱码,每一个字节都依赖于其前一个字节的密文,而不是实际的值。对于任一个单个的字符的这种变换来说,隐藏了加密数据的有效的真正的长度。
如果确实不理解如何来产生一个随机数序列,就考虑fibbonacci数列,使用2个双字(64位)的数作为产生随机数的种子,再加上第三个双字来做xor操作。 这个算法产生了一系列的随机数。算法如下: unsigned long dw1, dw2, dw3, dwmask; int i1; unsigned long arandom[256]; dw1 = {seed #1}; dw2 = {seed #2}; dwmask = {seed #3}; // this gives you 3 32-bit seeds, or 96 bits total for(i1=0; i1 < 256; i1++) { dw3 = (dw1 + dw2) ^ dwmask; arandom[i1] = dw3; dw1 = dw2; dw2 = dw3; } 如果想产生一系列的随机数字,比如说,在0和列表中所有的随机数之间的一些数,就可以使用下面的方法: int __cdecl mysortproc(void *p1, void *p2) { unsigned long **pp1 = (unsigned long **)p1; unsigned long **pp2 = (unsigned long **)p2; if(**pp1 < **pp2) return(-1); else if(**pp1 > *pp2) return(1); return(0); } ... int i1; unsigned long *aprandom[256]; unsigned long arandom[256]; // same array as before, in this case int a 上一页 [1] [2] [3] [4] [5] 下一页
|