我在这里做的可能是愚蠢无用的,但事实证明这是学习php的好方法,我感谢你的帮助。
我想出了一个密码,它将文本包裹成螺旋状,就像Ulam的螺旋图数字一样。
参考此图片:
我认为整个螺旋是一个立方体,所以如果字符串太短而不能形成一个完整的立方体,剩下的字符将留作空格(在我的图片示例中剩下一个空格,因为字符串是24个字符下一个完整的立方体是25个字符。
我想添加一个混淆的步骤,对角读取数组,所以输出将是这样的:
实现这一目标的简单/有效方法是什么?我将数据存储在2D数组中,所以它看起来像这样:
field[0][0]='l';
奖金正切问题:这样的事情有多容易破译? 谢谢!
答案 0 :(得分:2)
这是5x5平方的架构:
backgroud
如您所见,我们有:
基于这些假设,我们可以编写单个循环,使用 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组替换字母或符号,它们尽可能随机循环。