📄 rand.pod
字号:
=pod=head1 NAMErand - pseudo-random number generator=head1 SYNOPSIS #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,int 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);=head1 DESCRIPTIONThese functions implement a cryptographically secure pseudo-randomnumber generator (PRNG). It is used by other library functions forexample to generate random keys, and applications can use it when theyneed randomness.A cryptographic PRNG must be seeded with unpredictable data such asmouse movements or keys pressed at random by the user. This isdescribed in L<RAND_add(3)|RAND_add(3)>. Its state can be saved in a seed file(see L<RAND_load_file(3)|RAND_load_file(3)>) to avoid having to go through theseeding process whenever the application is started.L<RAND_bytes(3)|RAND_bytes(3)> describes how to obtain random data from thePRNG. =head1 INTERNALSThe RAND_SSLeay() method implements a PRNG based on a cryptographichash function.The following description of its design is based on the SSLeaydocumentation:First up I will state the things I believe I need for a good RNG.=over 4=item 1A good hashing algorithm to mix things up and to convert the RNG 'state'to random numbers.=item 2An initial source of random 'state'.=item 3The state should be very large. If the RNG is being used to generate4096 bit RSA keys, 2 2048 bit random strings are required (at a minimum).If your RNG state only has 128 bits, you are obviously limiting thesearch space to 128 bits, not 2048. I'm probably getting a littlecarried away on this last point but it does indicate that it may not bea bad idea to keep quite a lot of RNG state. It should be easier tobreak a cipher than guess the RNG seed data.=item 4Any RNG seed data should influence all subsequent random numbersgenerated. This implies that any random seed data entered will havean influence on all subsequent random numbers generated.=item 5When using data to seed the RNG state, the data used should not beextractable from the RNG state. I believe this should be arequirement because one possible source of 'secret' semi randomdata would be a private key or a password. This data mustnot be disclosed by either subsequent random numbers or a'core' dump left by a program crash.=item 6Given the same initial 'state', 2 systems should deviate in their RNG state(and hence the random numbers generated) over time if at all possible.=item 7Given the random number output stream, it should not be possible to determinethe RNG state or the next random number.=backThe algorithm is as follows.There is global state made up of a 1023 byte buffer (the 'state'), aworking hash value ('md'), and a counter ('count').Whenever seed data is added, it is inserted into the 'state' asfollows.The input is chopped up into units of 20 bytes (or less forthe last block). Each of these blocks is run through the hashfunction as follows: The data passed to the hash functionis the current 'md', the same number of bytes from the 'state'(the location determined by in incremented looping index) asthe 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 thehash function. Ibelieve this system addresses points 1 (hash function; currentlySHA-1), 3 (the 'state'), 4 (via the 'md'), 5 (by the use of a hashfunction 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 top 10 bytes from the local 'md'(which is initialized from the global 'md' before any bytes aregenerated), the bytes that are to be overwritten by the random bytes,and bytes from the 'state' (incrementing looping index). From thisdigest output (which is kept in 'md'), the top (up to) 10 bytes arereturned to the caller and the bottom (up to) 10 bytes are xored intothe 'state'.Finally, after we have finished 'num' random bytes for the caller,'count' (which is incremented) and the local and global 'md' are fedinto 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 hashinginto the 'state' the 'old' data from the caller that is about to beoverwritten) and 7 (by not using the 10 bytes given to the caller toupdate the 'state', but they are used to update 'md').So of the points raised, only 2 is not addressed (but seeL<RAND_add(3)|RAND_add(3)>).=head1 SEE ALSOL<BN_rand(3)|BN_rand(3)>, L<RAND_add(3)|RAND_add(3)>,L<RAND_load_file(3)|RAND_load_file(3)>, L<RAND_egd(3)|RAND_egd(3)>,L<RAND_bytes(3)|RAND_bytes(3)>,L<RAND_set_rand_method(3)|RAND_set_rand_method(3)>,L<RAND_cleanup(3)|RAND_cleanup(3)> =cut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -