09.openssl編程——隨機數


9.1 隨機數
隨機數是一種無規律的數,但是真正做到完全無規律也比較困難,所有一般將它稱為偽隨機數。
9.2 openssl隨機數數據結構與源碼
a.openssl生成隨機數的源碼位於crypto/rand目錄下。openssl維護一個內部隨機狀態數據(md_rand.c中定義的全局變量state和md),通過對這些內部數據計算摘要來生成隨機數
struct rand_meth_st {
int (*seed) (const void *buf, int num);種子函數
int (*bytes) (unsigned char *buf, int num);生成隨機數,openssl根據內部維護的隨機數狀態來生成結果。
void (*cleanup) (void);清楚函數,本函數將內部維護的隨機數據清除。
int (*add) (const void *buf, int num, double randomness);
int (*pseudorand) (unsigned char *buf, int num);
int (*status) (void); 查看熵值是否達到預定值,openssl中32字節,如果達到則返回1,否則返回0.
}
b.crypt/rand目錄下主要源碼有
b1.md_rand.c
它實現了基於摘要的隨機數生成
b2.rand_lib.c
該文件中的源碼簡單調用了rand_meth中的回調函數
b3.rand_win.c rand_unix.c rand_os2.c
這些源碼主要提供平台相關的RAND_poll函數實現和其他系統特有函數的實現。
b4.randfile.c
用於從隨機文件中加載種子、生成隨機數文件以及獲取隨機文件名。
9.3主要函數
a.int RADN_load_file(const *file, long bytes)
本函數將file指定的隨機數文件中的數據讀取bytes字節(如果bytes大於1024,則讀取1024字節),調用RAND_add進行計算,生成內部隨機數
b.RAND_write_file
生成一個隨機數文件
c.const char *RADN_file_name(char *file, size_t num)
獲取隨機數文件名,如果隨機數文件長度小於num則返回空,否則返回文件名
d.RAND_poll
用於計算內部隨機數,哥哥平台有各自的實現
e.RAND_screen/RAND_event
用於計算內部隨機數,他們調用了RAND_seed
f.RADN_seed
用來計算隨機數
g.RAND_cleanup
清楚內部隨機數
h.RAND_set_rand_method
用來設置rand_meth,當用戶實現了自己的隨機數生成函數,調用該方法來替換openssl所提供的隨機數功能
i.RAND_status
用來查看內部隨機數熵值是否已達到預定值,如果未達到,則不應該生成隨機數。
j.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM