CryptGenRandom is a deprecated [1]cryptographically secure pseudorandom number generator function that is included in Microsoft CryptoAPI. In Win32 programs, Microsoft recommends its use anywhere random number generation is needed. A 2007 paper from Hebrew University suggested security problems in the Windows 2000 implementation of CryptGenRandom (assuming the attacker has control of the machine). Microsoft later acknowledged that the same problems exist in Windows XP, but not in Vista. Microsoft released a fix for the bug with Windows XP Service Pack 3 in mid-2008.[2]

Wrapping it up: it would not be secure to use random numbers from services like random.org in a cryptographic solution. This is underlined by the individual services' statements. There are ample well-vetted and cryptographically secure alternatives to the need of falling back on using such services.

Background[edit]

The Win32API includes comprehensive support for cryptographic security, including native TLS support (via the SCHANNEL API) and code signing. These capabilities are built on native Windows libraries for cryptographic operations, such as RSA and AES key generation. These libraries in turn rely on a cryptographically secure pseudorandom number generator (CSPRNG). CryptGenRandom is the standard CSPRNG for the Win32 programming environment.

Class that uses the os.urandom function for generating random numbers from sources provided by the operating system. Not available on all systems. Does not rely on software state and sequences are not reproducible. Accordingly, the seed and jumpahead methods have no effect and are ignored. Pseudorandom Number Generators. When we observe the physical world we find random fluctuations everywhere. We can generate truly random numbers by measuring random fluctuations, known as noise. This number could come from the measurement of noise, or the current time in milliseconds. Next, this seed is provided as input to a. Random Password Generator. This form allows you to generate random passwords. The randomness comes from atmospheric noise, which for many purposes is better than the pseudo-random number algorithms typically used in computer programs. Sep 13, 2013 Similarly, random numbers turn up when logging into web sites (and other systems), creating secure connections to servers using SSH, holding Skype video chats, sending encrypted email and more. And the Achilles' Heel of the only completely secure cryptosystem, the one-time pad is that the pad itself must be completely randomly generated. Using computer random number generators to produce keys, it is secure? It depends on your threat environment, exposure, and overall system security. Given the difficulty in implementing robust secure systems, and assuming that the thing you are protecting is not of high value (to others), using your own computer to generate random numbers is. Mar 09, 2018  The generation of random numbers is essential to cryptography. One of the most difficult aspect of cryptographic algorithms is in depending on or generating, true random information. This is problematic, since there is no known way to produce true random data, and most especially no way to do so on a finite state machine such as a computer.

Method of operation[edit]

Microsoft-provided cryptography providers share the same implementation of CryptGenRandom, currently based on an internal function called RtlGenRandom.[3] Only a general outline of the algorithm had been published as of 2007:

[RtlGenRandom] generates as specified in FIPS 186-2 appendix 3.1 with SHA-1 as the G function. And with entropy from:

  • The current process ID (GetCurrentProcessID).
  • The current thread ID (GetCurrentThreadID).
  • The tick count since boot time (GetTickCount).
  • The current time (GetLocalTime).
  • Various high-precision performance counters (QueryPerformanceCounter).
  • An MD4 hash of the user's environment block, which includes username, computer name, and search path. [..]
  • High-precision internal CPU counters, such as RDTSC, RDMSR, RDPMC

[omitted: long lists of low-level system information fields and performance counters][4]

Security[edit]

The security of a cryptosystem's CSPRNG is significant because it is the origin for dynamic key material. Keys needed 'on the fly', such as the AES TLS session keys that protect HTTPS sessions with bank websites, originate from CSPRNGs. If these pseudorandom numbers are predictable, session keys are predictable as well. Because CryptGenRandom is the de facto standard CSPRNG in Win32 environments, its security is critical for Windows users.

The specifics of CryptGenRandom's algorithm have not been officially published. As with any unpublished random number generation algorithm, it may be susceptible to theoretical weaknesses including the use of outdated algorithms, and a reliance for entropy gathering on several monotonically-increasing counters that might be estimated or controlled to an extent by an attacker with local access to the system.

Cryptanalysis[edit]

A cryptanalysis of CryptGenRandom, published in November 2007 by Leo Dorrendorf and others from the Hebrew University of Jerusalem and University of Haifa, found significant weaknesses in the Windows 2000 implementation of the algorithm.[5]

To take advantage of the vulnerability, an attacker would first need to compromise the program running the random number generator. The weaknesses in the paper all depend on an attacker siphoning the state bits out of the generator. An attacker in a position to carry out this attack would typically already be in a position to defeat any random number generator (for instance, they can simply sniff the outputs of the generator, or fix them in memory to known values). However, the Hebrew University team notes that an attacker only need steal the state bits once in order to persistently violate the security of a CryptGenRandom instance. They can also use the information they glean to determine past random numbers that were generated, potentially compromising information, such as credit card numbers, already sent.

The paper's attacks are based on the fact that CryptGenRandom uses the stream cipher RC4, which can be run backwards once its state is known. They also take advantage of the fact that CryptGenRandom runs in user mode, allowing anyone who gains access to the operating system at user level, for example by exploiting a buffer overflow, to get CryptGenRandom's state information for that process. Finally, CryptGenRandom refreshes its seed from entropy infrequently. This problem is aggravated by the fact that each Win32 process has its own instance of CryptGenRandom state; while this means that a compromise of one process does not transitively compromise every other process, it may also increase the longevity of any successful break.

Because the details of the CryptGenRandom algorithm are not public, Dorrendorf's team used reverse engineering tools to discern how the algorithm works. Their paper is the first published record of how the Windows cryptographic random number generator operates[citation needed].

Common Criteria[edit]

Windows 2000, XP and 2003 have all successfully undergone EAL4+ evaluations, including the CryptGenRandom() and FIPSGenRandom() implementations. The Security Target documentation is available at the Common Criteria Portal, and indicates compliance with the EAL4 requirements. Few conclusions can be drawn about the security of the algorithm as a result; EAL4 measures products against best practices and stated security objectives, but rarely involves in-depth cryptanalysis.

FIPS validation[edit]

Microsoft has obtained validation of its RNG implementations in the following environments:

  • Windows Vista RNG implementations (certificate 321)[6]
  • Windows 2003 Enhanced Cryptographic Provider (rsaenh.dll) (certificate 316)[6]
  • Windows 2003 Enhanced DSS and Diffie-Hellman Cryptographic Provider (dssenh.dll) (certificate 314)[6]
  • Windows 2003 Kernel Mode Cryptographic Module (fips.sys) (certificate 313)[6]
  • Windows CE and Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (certificate 292)[6]
  • Windows CE and Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (certificate 286)[6]
  • Windows CE Enhanced Cryptographic Provider (rsaenh.dll) (certificate 66)[6]

These tests are 'designed to test conformance to the various approved RNG specifications ratherthan provide a measure of a product’s security. [..] Thus, validation should not be interpreted as an evaluation orendorsement of overall product security.' Few conclusions can be drawn about the security of the algorithm as a result; FIPS evaluations do not necessarily inspect source code or evaluate the way RNG seeds are generated.[7]

Alternatives[edit]

API level[edit]

Windows developers have several alternative means of accessing the CryptGenRandom functionality; these alternatives invoke the same algorithm and share the same security characteristics, but may have other advantages.

Using RtlGenRandom[edit]

'Historically, we always told developers not to use functions such as rand to generate keys, nonces and passwords, rather they should use functions like CryptGenRandom, which creates cryptographically secure random numbers. The problem with CryptGenRandom is you need to pull in CryptoAPI (CryptAcquireContext and such) which is fine if you're using other crypto functions.

On a default Windows XP and later install, CryptGenRandom calls into a function named ADVAPI32!RtlGenRandom, which does not require you load all the CryptAPI stuff. In fact, the new Whidbey CRT function, rand_s calls RtlGenRandom'.[8]

Nov 17, 2017  For a given private key, pr, the Ethereum address A(pr) (a 160-bit value) to which it corresponds is defined as the right most 160-bits of the Keccak hash of the corresponding ECDSA public key. To generate Ethereum address, take Keccak-256 hash of public key. Right most 20 bytes is your Ethereum address. A public key/private key keypair, is generated by using special programs according to the use of the keypair. If it’s ssh, it is described in other answers. If it’s a cryptocurrency keypair, every cryptocurrency has it’s own software to do this. As per my understanding user seed somehow gets generated into a private key, then using that private key to derive the public key and from that you derive the address. Does anyone have any further information on how this achieved with javascript or what is the architecture for this kind of setup. Any help on understanding it would be great. How does private key generate public key address new york.

Using RNGCryptoServiceProvider[edit]

Programmers using .NET should use the RNGCryptoServiceProvider Class.[9]

Using Cryptography API: Next Generation (CNG)[edit]

The CNG [10] is a long term replacement for the deprecated Crypto API. It provides an equivalent function BCryptGenRandom[11] as well as dedicated functions for key generation.

Programming languages[edit]

  • the Microsoft C++ library function rand_s uses RtlGenRandom and is recommended by Microsoft for secure applications.[12]
  • the Python function urandom in the os module, which uses /dev/urandom on Unix-like systems, calls CryptGenRandom on Windows systems.[13]
  • the Java JCA Provider 'SunMSCAPI' available with OpenJDK and Oracle distributions of the JRE on Windows provides a SecureRandom implementation with the algorithm name Windows-PRNG. This class forwards all queries for random or seed bytes as well as setting additional seed bytes to native CryptGenRandom.[14]

See also[edit]

  • Entropy-supplying system calls – the approximate equivalent of CryptGenRandom in OpenBSD and the Linux kernel
  • /dev/random – a randomness source in most Unix-like kernels

References[edit]

  1. ^CryptGenRandom Function (Windows)
  2. ^'Microsoft confirms that XP contains random number generator bug'. Archived from the original on 2008-06-22.
  3. ^RtlGenRandom Function (Windows)
  4. ^Writing Secure Code, Second Edition. ISBN0-7356-1722-8.
  5. ^Dorrendorf, Leo; Zvi Gutterman; Benny Pinkas. 'Cryptanalysis of the Random Number Generator of the Windows Operating System'(PDF). Archived from the original(pdf) on 2012-09-06. Retrieved 2007-11-12.
  6. ^ abcdefg'RNG Validation List'. NIST Computer Security Division. Retrieved 18 June 2013.
  7. ^'The Random Number Generator Validation System (RNGVS)'(PDF). National Institute of Standards and Technology Computer Security Division. 31 January 2005. Archived from the original(PDF) on 24 February 2013. Retrieved 18 June 2013.
  8. ^Michael Howard's Web Log : Cryptographically Secure Random number on Windows without using CryptoAPI
  9. ^'Archived copy'. Archived from the original on 2006-09-08. Retrieved 2007-08-27.CS1 maint: archived copy as title (link)
  10. ^Crypto API Next Generation (Windows)
  11. ^BCryptGenRandom (Windows)
  12. ^http://msdn.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx Visual C++ Developer Center, rand_s
  13. ^https://docs.python.org/2/library/os.html#os.urandom Python Library Reference, OS module
  14. ^http://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunMSCAPI Oracle Java SE 8 technical documentation, Sun Providers

External links[edit]

Retrieved from 'https://en.wikipedia.org/w/index.php?title=CryptGenRandom&oldid=926659226'

The Crypto.getRandomValues() method lets you get cryptographically strong random values. The array given as the parameter is filled with random numbers (random in its cryptographic meaning).

To guarantee enough performance, implementations are not using a truly random number generator, but they are using a pseudo-random number generator seeded with a value with enough entropy. The PRNG used differs from one implementation to the other but is suitable for cryptographic usages. Implementations are also required to use a seed with enough entropy, like a system-level entropy source.

getRandomValues() is the only member of the Crypto interface which can be used from an insecure context.

Syntax

Parameters

Web Crypto Generate Key With Provided Random Numbers List

typedArray
An integer-based TypedArray, that is an Int8Array, a Uint8Array, an Int16Array, a Uint16Array, an Int32Array, or a Uint32Array. All elements in the array are overwritten with random numbers.

Return value

The same array passed as typedArray but with its contents replaced with the newly generated random numbers. Note that typedArray is modified in-place, and no copy is made.

Exceptions

This method can throw an exception under error conditions.

QuotaExceededError
The requested length exceeds 65,536 bytes.

Web Crypto Generate Key With Provided Random Numbers List

Usage notes

Don't use getRandomValues() to generate encryption keys. Instead, use the generateKey() method. There are a few reasons for this; for example, getRandomValues() is not guaranteed to be running in a secure context.

There is no minimum degree of entropy mandated by the Web Cryptography specification. User agents are instead urged to provide the best entropy they can when generating random numbers, using a well-defined, efficient pseudorandom number generator built into the user agent itself, but seeded with values taken from an external source of pseudorandom numbers, such as a platform-specific random number function, the Unix /dev/urandom device, or other source of random or pseudorandom data.

Examples

Specification

SpecificationStatusComment
Web Cryptography APIRecommendationInitial definition

Browser compatibility

The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Web Crypto Generate Key With Provided Random Numbers Worksheet

Update compatibility data on GitHub

Web Crypto Generate Key With Provided Random Numbers Free

DesktopMobile
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung Internet
getRandomValuesChromeFull support 11EdgeFull support 12FirefoxFull support 26IEFull support 11OperaFull support 15SafariFull support 6.1WebView AndroidFull support ≤37Chrome AndroidFull support 18Firefox AndroidFull support 26Opera AndroidFull support 14Safari iOSFull support 6.1Samsung Internet AndroidFull support 1.0

Legend

Full support Â
Full support

See also

  • Window.crypto to get a Crypto object.
  • Math.random, a non-cryptographic source of random numbers.