rand - pseudo-random number generator
#include <openssl/rand.h>
int RAND_bytes(unsigned char *buf, int num); int RAND_pseudo_bytes(unsigned char *buf, int num);
void RAND_seed(const void *buf, int num); void RAND_add(const void *buf, int num, int entropy); int RAND_status(void); void RAND_screen(void);
int RAND_load_file(const char *file, long max_bytes); int RAND_write_file(const char *file); const char *RAND_file_name(char *file, size_t num);
int RAND_egd(const char *path);
void RAND_set_rand_method(RAND_METHOD *meth); RAND_METHOD *RAND_get_rand_method(void); RAND_METHOD *RAND_SSLeay(void);
void RAND_cleanup(void);
A cryptographic PRNG must be seeded with unpredictable data such as mouse movements or keys pressed at random by the user. This is described in RAND_add(3). Its state can be saved in a seed file (see RAND_load_file(3)) to avoid having to go through the seeding process whenever the application is started.
RAND_bytes(3) describes how to obtain random data from the PRNG.
The following description of its design is based on the SSLeay documentation:
First up I will state the things I believe I need for a good RNG.
The algorithm is as follows.
There is global state made up of a 1023 byte buffer (the `state'), a working hash value ('md'), and a counter ('count').
Whenever seed data is added, it is inserted into the `state' as follows.
The input is chopped up into units of 20 bytes (or less for the last block). Each of these blocks is run through the hash function as follows: The data passed to the hash function is the current `md', the same number of bytes from the `state' (the location determined by in incremented looping index) as the current `block', the new key data `block', and `count' (which is incremented after each use). The result of this is kept in `md' and also xored into the 'state' at the same locations that were used as input into the hash function. I believe this system addresses points 1 (hash function; currently SHA-1), 3 (the `state'), 4 (via the `md'), 5 (by the use of a hash function and xor).
When bytes are extracted from the RNG, the following process is used. For each group of 10 bytes (or less), we do the following:
Input into the hash function the local `md' (which is initialized from the global `md' before any bytes are generated), the bytes that are to be overwritten by the random bytes, and bytes from the `state' (incrementing looping index). From this digest output (which is kept in `md'), the top (up to) 10 bytes are returned to the caller and the bottom 10 bytes are xored into the `state'.
Finally, after we have finished `num' random bytes for the caller, 'count' (which is incremented) and the local and global `md' are fed into the hash function and the results are kept in the global `md'.
I believe the above addressed points 1 (use of SHA-1), 6 (by hashing into the `state' the `old' data from the caller that is about to be overwritten) and 7 (by not using the 10 bytes given to the caller to update the `state', but they are used to update `md').
So of the points raised, only 2 is not addressed (but see RAND_add(3)).
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |