对角线读取数组用于换位密码?

时间:2016-03-28 12:48:06

标签: php cryptography

我在这里做的可能是愚蠢无用的,但事实证明这是学习php的好方法,我感谢你的帮助。

我想出了一个密码,它将文本包裹成螺旋状,就像Ulam的螺旋图数字一样。

参考此图片:

enter image description here

我认为整个螺旋是一个立方体,所以如果字符串太短而不能形成一个完整的立方体,剩下的字符将留作空格(在我的图片示例中剩下一个空格,因为字符串是24个字符下一个完整的立方体是25个字符。

我想添加一个混淆的步骤,对角读取数组,所以输出将是这样的:

enter image description here

实现这一目标的简单/有效方法是什么?我将数据存储在2D数组中,所以它看起来像这样:

field[0][0]='l';

奖金正切问题:这样的事情有多容易破译? 谢谢!

2 个答案:

答案 0 :(得分:2)

这是5x5平方的架构:

backgroud

如您所见,我们有:

  • 9组(= cols + rows-1或keys + keys + 1);
  • 在每一行中,y + x总和相同,从0增加到8;
  • 在每一行中,y减小,而x增加。
  • 每条线在x到达初始y
  • 时结束

基于这些假设,我们可以编写单个循环,使用 yx yx yx yx yx 0 1 2 3 4 a > 00 0 a b c d e b > 10 01 1 b c d e f c > 20 11 02 2 c d e f g d > 30 21 12 03 3 d e f g h e > 40 31 22 13 04 4 e f g h i f > 41 32 23 14 g > 42 33 24 h > 43 34 i > 44 $sum作为更改行的条件:当递减$startY具有相同的$x值时,我们增加$startY,然后将$sum设置为$startY和更高$sum键之间的最低值,然后我们将下一个$array设置为$x$sum

$y

上方的结果是:

$sum = $startY = $y = $x = 0;
while( $sum < 2*count($array)-1 )
{
    echo $array[$y][$x];

    if( $x == $startY )
    {
        $sum++;
        $startY = $y = min( $sum, count($array)-1 );
        $x = $sum - $y;
    }
    else
    {
        $y--;
        $x++;
    }
}

查看 eval.in demo ,您可以看到三个不同的示例。

答案 1 :(得分:1)

只需使用for循环。无论你学习什么语言,你都需要学习如何使用for循环(或循环或foreach循环或任何良好的控制结构)。

你要00,然后是10,01,然后是20,11,02,然后是30,21,12,33等......你可以看到第一个数字减少1而第二个数字增加1直到你达到n0 ... 0n为止。这涵盖了广场的前半部分......

// Assume $n is the width/height of the square
for($m=0; $m<=$n; $m++)
{
    for($a=$n; $a>=0; $a--)
    {
        for($b=0; $b<=$n; $b++)
        {
            //Do whatever you want with $array[$a][$n]...
        }
    }
}

现在,广场的后半部分在第一个条纹上命中41,32,23,14。它在第二个条纹上击中了42,33,24。它击中了43,34,最后是44.你可以看到他们都上升到他们达到$ n

for($m=1; $m<=$n; $m++)
{
    for($b=$m; $b<=$n; $b++) // Put B on the outside because it is the limitation
    {
        for($a=4; $b<=$n; $a--)
        {
            //Do what you want with $a and $b
        }
    }
}

现在......这可以轻易破译吗?是。你只是在乱拨信件。无论你如何争夺它,它都很容易破译。您需要使用更改的替换集替换字母。最理想的是,您希望每个字母替换一个全新的替换集 - 这很难使用。因此,大多数密码使用一组替换集,比如32组替换字母或符号,它们尽可能随机循环。