2016-03-28 79 views
2

我在這裏做的事情可能是愚蠢的和無用的,但它原來是學習php的好方法,我感謝你的幫助。對角線讀取陣列密碼?

我想出了一個密碼,這個密碼可以像Ulam的螺旋地圖數字一樣在螺旋中包裝文本。

請參閱本圖片:

enter image description here

我考慮整個螺旋立方體,所以如果字符串太短,形成一個完整的立方體,剩餘的字符被保留爲空的空間(以我的圖片示例中剩下一個空格,因爲字符串是24個字符,下一個完整的立方體是25個字符

我想添加進一步的混淆步驟,以對角線方式讀取數組,因此輸出會類似於這個:

enter image description here

什麼是簡單/有效的方法來實現這一目標?我存儲的數據的二維數組,所以它看起來是這樣的:

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

獎金切線問題:如何輕鬆將像這樣被破譯? 謝謝!

+0

有太多可能的答案,或者對於這種格式太好的答案太長。請添加詳細信息以縮小答案集或隔離可以在幾個段落中回答的問題。我建議您找到一個開發論壇(可能是[Quora](http://www.quora.com/Computer-Programming) ?)來計算一般性。然後,當/如果您有特定的編碼問題,請回到StackOverflow,我們很樂意提供幫助。 –

+0

你需要兩個循環(嵌套)。 –

回答

2

這是一個5×5正方形的模式:

           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 

正如你可以看到,我們有:

  • 9組(= COLS +行-1或鍵+鍵+ 1) ;
  • 在每一行中,y + x總和相同,從0增加到8;
  • 在每一行中,y減小,而x增加。
  • 每個行,當x達到基於這些假設的初始y

結束時,我們可以寫一個單一的環,使用$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++; 
    } 
} 

上面廣場上的結果是:

abbcccddddeeeeeffffggghhi 

望着這eval.in demo你可以看到三個不同的例子。

+0

美麗的代碼!非常感謝! – Coma

1

只用於循環。不管你學習什麼語言,你需要學習如何使用循環(或while循環或foreach循環或任何良好的控制結構)。

你要走00,然後是10,01,然後是20,11,02,然後是30,21,12,03等......你可以看到第一個數字減少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組替換字母或符號,它們儘可能隨機地循環。

+0

哈哈我知道如何使用循環,讓螺旋正確包裝是一個嵌套循環的混亂。無論如何,我認爲可能有其他一些更簡單的方法,但你真的很清楚我該做什麼。它只是不會來到我:))謝謝! 此外,我猜即使字符替換對計算能力沒有太大的幫助。如果我想讓它至少非平凡的安全,我是否需要整合某種種子或公鑰/私鑰機制?你會建議什麼? – Coma