隨機函式生成的隨機數是有週期、有規律的(源於同樣的算式)。用隨機函式輔助生成沒有週期、沒有規律的(或者很難找到規律)序列值是很有意義的,密碼學需要這樣的序列(陣列)。
方法很簡單,選擇乙個效能優良的隨機函式,所謂效能優良是指函式生成的陣列元素分布均勻,能通過各項隨機數指標的檢測。例如我們需要n個元素的隨機序列,先用函式產生乙個n個元素的偽隨機序列,然後選擇乙個種子用隨機函式的生成值對偽隨機序列進行隨機排序,當然還可以選擇另乙個種子用隨機函式的生成值對隨機序列繼續進行隨機排序...,最後得到我們所要的隨機數組。這個陣列雖然隨機性很好但卻是可控的,使用者很容易再造它們,而竊密者卻很難得到。
其實此種方法依據的是熵增加原理(熱力學第二定律),隨機排序只能增加序列的混亂程度而不能使其越來越秩序化。舉例說明,假設乙個鍋裡放著各種顏色的沙子,紅的、藍的、黃的...,當你用鏟子攪拌它們時,只能越來越混亂,而不能相反,單顏色沙子的濃度只能從大向小變化而不能相反,最後達到平衡。對序列排序就相當於攪拌它們,所以只能越來越混亂,最後達到均勻分布。
假如有人想復現這個陣列需要怎麼做呢?假設隨機函式的週期是t,模仿上面的過程,隨機函式可以看成是乙個長度為t的首尾相接的序列陣列,要從中選擇n個連續排列的元素,免不了要進行t次嘗試,對應於每次嘗試得到的陣列,進行隨機排序,我們知道隨機函式的種子的取值可能有t個數值,這樣一遍隨機排序總的試驗次數就有t×t次了,如果兩遍就是t×t×t次,如果三遍就是t×t×t×t次...,這只是粗略的計算,可以看出如果t很大試驗次數是驚人的。再者最終的隨機數組也不會擺在那裡等著你去復現它,往往和明文糾纏在一起,以密文的方式出現。在建造陣列時有許多選擇,主要是隨機函式的種子和引數,如何選擇它們而又能豐富多彩,只要將它們和使用者密碼聯絡起來就可以了,最好從使用者密碼單向的、不可逆算出各種需要的引數投入使用。上面舉例是用乙個隨機函式,如果使用多個隨機函式情況要複雜得多。
即使完全掌握了陣列的形成方式和所有細節也不能再造陣列,這是因為在陣列形成過程中有未知量的加入,未知量來自使用者密碼和自動加鹽技術等,再說一遍使用者密碼並不直接參與運算,而是用它進行不可逆運算後的衍生值。
如果建造陣列的過程也是隨機的將大大提高破解難度,我們知道對陣列進行一次隨機排序後,陣列將得到脫胎換骨的改造,如果建造過程這樣設計,當使用者密碼符合某條件時,增加進行某種隨機排序,這樣過程也是不確定的,想跟蹤復現陣列將非常困難。
建造無週期隨機數組
我們知道隨機函式形成的隨機數組都是有週期的。這是因為生成的陣列來自同樣的計算公式,種子的值域是有限的,所以函式值也是有限的。要建造沒有週期的隨機數組是很容易的,例如你要建造乙個長度為 n的陣列,可以找乙個週期大於 n各方面效能都不錯的隨機函式,讓隨機函式產生 n個數,組成陣列即可。有時我們不願意讓別...
利用隨機函式生成隨機數
給定乙個rand 可以產生從0到rand max的隨機數,其中 rand max 很大 常見值 16位int能表示的最大整數32767 寫出利用rand 生成 a,b 中任意整數的函式,其中a 0,b rand max,且b a 分析 這是在程式設計工作最常見的隨機函式的應用,在這裡做乙個起點再合適...
Oracle生成隨機函式
1.基礎認識 關於這些函式及dbms random包的檔案都包含在sqlplus中 select text from all source where name dbms random and type package order by line type num array procedure t...