在密码学领域,加密算法的创新是不断追求的目标。本文将介绍一种新颖的加密算法,它利用曼德勃罗特分形的特性,将用户提供的加密密钥扩展为更长的密钥,随后与用户提供的明文进行异或操作,生成加密文本。这种算法由作者在一次创造性的思考后发明,并在次日早晨编程实现。虽然这种算法可能非常强大,但也有可能存在缺陷,因此不提供任何保证。
许多著名的加密算法都会在一定程度上扩展给定的加密密钥,然后通过移动、位移和替换明文中的比特,再与扩展后的密码进行异或操作,这个过程通常会重复一定次数。而这种基于分形的算法尝试使用曼德勃罗特分形创建一个更加“随机”的扩展密钥,而不是使用固定规则。
此外,这种分形算法将整个文件作为一个大的块进行加密,而不是将其分割成256比特的块进行加密(因此它不会在每个块上使用相同的加密密钥,而是只使用一个大型的加密密钥来加密整个明文,这应该意味着:重复性更少→攻击成功的可能性更低)。
要理解这种算法,最好有一定的分形、复数数学背景知识,并且了解高斯平面是什么;当然,对密码学有所了解也是有帮助的。
要理解作者制作的小型“记事本式”项目,用于测试这种算法,可以看看“Scramble Anagram算法”,因为在该项目中,作者将分形算法与简单异或一起使用。
算法的核心包含在可下载的zip文件中,文件名为"MyCryExtensions.cs",在函数'Cry_FractalCoding'中,代码块由"#region calculate expanded key"限定。
加密包括在循环中重复一些二进制操作,其中包括计算分形加密密钥。在执行分形算法之前,用户提供的加密密钥被扩展:由于算法被多次应用(由变量'countloops'定义),并且每个循环需要一个10字节长的密钥,因此扩展后的密钥将是10 * countloops字节长。密钥的扩展由函数Cry_ExpandKey执行,过程相当简单。
首先,定义高斯平面上的一个区域。这个区域由一个矩形限定,矩形的宽度和高度可变,位于下图所示的黑色圆周的上半部分周围。
double gX1 = -1 - ((double)BitConverter.ToUInt32(expandedkey, 0 + ky) / (double)uint.MaxValue) / 4;
double gY1 = 0 + ((double)BitConverter.ToUInt32(expandedkey, 4 + ky) / (double)uint.MaxValue) / 10;
double gX2 = gX1 + 0.25;
double gY2 = 0.25 + gY1;
Complex bottomleft = new Complex(gX1, gY1);
Complex topright = new Complex(gX2, gY2);
其中expandedkey是前面提到的扩展密钥,ky是每个加密循环的起始字节位置。
其次,使用定义的区域创建一个复数数组,称为gaussarray。
int squaresize = Convert.ToInt32(Math.Sqrt(len)) + 1;
Complex[] gaussarray = GetGaussArray(squaresize + expandedkey[8 + ky], squaresize + expandedkey[9 + ky], bottomleft, topright);
其中len是包含用户明文数据的字节数组的长度。GetGaussArray函数只是将高斯矩形(在第一部分找到)划分为一个大的正方形矩形,每个正方形的坐标随后放入gaussarray中。
第三,通过调用函数IterateMandelbrot(与分形绘图程序执行的相同操作)迭代gaussarray中的每个点(复数)。曼德勃罗特函数是:
Z(n+1) = Z(n)^2 + c;
其中c是要迭代的复数,Z(0)是初始函数值,设置为零;所以Z(1) = c;然后Z(2)将根据Z(1)计算,依此类推。如果在计算的任何一点,Z(n)的实部或虚部发散(即double.IsInfinity(Z.Real)或double.IsInfinity(Z.Imaginary)),则返回n的值;如果另一方面,在256次计算后Z没有发散,则返回零...
所有返回的值都通过模256(以适应一个字节)减少,并放入一个名为countiterations的字节数组中。
第四,现在需要净化countiterations数组(因为据说太多的重复可能会削弱加密):这个数组中不允许有零,并且不允许有超过三个相同的连续值。净化后,countiterations数组将成为所需的分形加密密钥。
第五,使用分形加密密钥与一个或多个加密算法。在提供的示例中(在可下载的zip文件中),使用这个密钥对明文数据进行了三次操作:ScrambleBitLeft,Xor,ScrambleByteRight。虽然xor相当明显,但其他两个的解释可以在“背景”部分引用的文章中找到。