65.9K
CodeProject 正在变化。 阅读更多。
Home

分形加密算法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.52/5 (6投票s)

2012年6月19日

GPL3

4分钟阅读

viewsIcon

49097

downloadIcon

1092

使用曼德博罗集分形扩展加密密钥的加密算法

引言

分形加密算法使用著名的曼德勃罗集分形将用户提供的加密密钥转换为更长的密钥,然后使用该密钥与用户提供的明文进行异或操作,从而生成加密文本。本文所述及实现的算法是我在灵感迸发时(即午饭后,大约 14:30,半睁着眼睛)发明的新算法,并在第二天上午编写完成:这意味着它可能碰巧是一个非常强大的加密算法,但它也可能相反(即一个“encrAption”算法),因此不提供任何保证。

许多著名的加密算法会将给定的加密密钥(在一定程度上)进行扩展,然后在移动、移位和替换明文中的比特后,将其与扩展后的密码进行异或操作,这个过程通常会重复一定的次数。分形算法试图使用曼德勃罗集分形来创建一个更“随机”的扩展密钥,而不是使用固定的规则。

此外,分形算法将整个文件作为一个大的块进行加密,而不是将其分割成 256 位块进行加密(因此它不会在每个块上使用相同的加密密钥,而是只使用一个大的加密密钥来加密整个明文(这意味着:重复性更少 -> 攻击成功的可能性更小)。

背景

要理解这个算法,可能需要对分形、复数数学以及高斯平面有一定的了解;当然,了解一些密码学知识也会有帮助。

要理解我用来测试此算法的那个小型可下载的“记事本式”项目,可以看看 Scramble Anagram algorithm,因为在这个项目中,我将其与分形算法和简单的 XOR 一起使用。

使用代码

算法的核心包含在可下载的 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 中。

第三步gaussarray 中的每个点(复数)都通过调用函数 IterateMandelbrot 进行迭代(这与分形绘图程序执行的操作相同)。曼德勃罗集函数是:Z(n+1) = Z(n)^2 + cc 是要迭代的复数,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 是显而易见的,但另外两种的解释可以在“背景”部分引用的文章中找到。

第六步:从第一步第五步的点重复执行 7 次。(为什么是七次?因为多次重复可以提供更安全的加密,它们也会减慢处理速度;所以在我 PC 上七次是一个不错的折衷,因为这似乎是一个非常慢的算法)。

好了,各位,这就是全部内容。

© . All rights reserved.