Thank you for replying with such specific assistance. I am made acutely
aware that I am only a Python enthusiast, and not an academic.

Hashes are deterministic, not random, but byte by byte, they can be very
random. Please accept the attached script as a "hack," that might be novel,
or a curiosity. My first script was defective several ways. In this, I seed
the hash by hashing the uu-8 ENCODED string value of the time - it is not
random, but it is rarely the same twice. I used 0-9 because it is decimal,
and 0-59, because hours and minutes come in 60's.

I found that taking time.time_nc() gave me far more odds than evens.

I do not know how the scheme I devised of adding hex digits together would
scale to larger ranges - it is done by adding hex digits that vary from 0 -
15 repeatedly, but, since the number of hex digits varies with the range,
it could actually work for larger ranges.

The random function in Python is not really adequate for a magic eight ball
program, so as a consumer I am dissatisfied without examining it at a
quantum level, for repeated reference thousands of times each.

Thank you for your kind attention, and I hope the (much improved) hack can
be helpful to other enthusiasts.

James J
(A.A. Faulkner University)

On Mon, Nov 14, 2022 at 11:23 AM Wes Turner <wes.tur...@gmail.com> wrote:

> QRNG "Quantum Random Number Generation" -> Hardware random number
> generator > Physical phenomena with random properties > Quantum random
> properties
>
> https://en.wikipedia.org/wiki/Hardware_random_number_generator#Quantum_random_properties
>
>
> FWIW, SciPy and SymPy have various non-CSPRNG random distributions:
>
> - https://docs.scipy.org/doc/scipy/reference/stats.html
>   -
> https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.uniform.html#scipy.stats.uniform
>
> - https://docs.sympy.org/latest/modules/stats.html
>   - https://docs.sympy.org/latest/modules/stats.html#sympy.stats.Uniform
>   -
> https://docs.sympy.org/latest/modules/stats.html#sympy.stats.DiscreteUniform
>
> "RFC 8937: Randomness Improvements for Security Protocols" (2020)
> https://www.rfc-editor.org/rfc/rfc8937.html
>
> ***
>
> FWIW,
> UUIDs and W3C DIDs require entropy e.g. from a CSPRNG or better:
> https://www.w3.org/TR/did-core/#terminology :
>
> > Universally Unique Identifier (UUID)
> > A type of globally unique identifier defined by [RFC4122]. UUIDs are
> similar to DIDs in that they do not require a centralized registration
> authority. UUIDs differ from DIDs in that they are not resolvable or
> cryptographically-verifiable
>
> On Mon, Nov 14, 2022, 11:54 AM Wes Turner <wes.tur...@gmail.com> wrote:
>
>> https://docs.python.org/3/library/random.html :
>>
>> > Warning: The pseudo-random generators of this module should not be used
>> for security purposes. For security or cryptographic uses, see the secrets
>> module
>>
>> https://docs.python.org/3/library/secrets.html#module-secrets
>>
>> PEP 506 – Adding A Secrets Module To The Standard Library
>> https://peps.python.org/pep-0506/#alternatives
>> https://github.com/python/peps/blob/main/pep-0506.txt
>>
>> PEP 12: new PEP template:
>> https://github.com/python/peps/blob/main/pep-0012/pep-NNNN.rst
>>
>> Pseudorandom number generator > Cryptographic PRNGs
>>
>> https://en.wikipedia.org/wiki/Pseudorandom_number_generator#Cryptographic_PRNGs
>>
>> Random number generator attack > Defenses
>> https://en.wikipedia.org/wiki/Random_number_generator_attack#Defenses
>>
>>
>> /? CSPRNG
>> https://www.google.com/search?q=CSPRNG
>>
>> From "THE LINUX CSPRNG IS NOW GOOD!"
>> https://words.filippo.io/dispatches/linux-csprng/ :
>>
>> > [ get random() is from OpenBSD and LibreSSL ]
>>
>> > Performance and ChaCha20
>> > Some people would say they needed a userspace CSPRNG for PERFORMANCE. I
>> never really believed most of them, but to be fair Linux was using a kinda
>> slow SHA-1 extractor back then. However, since Linux 4.8 (2016) the default
>> getrandom(2) source is a fast ChaCha20-based CSPRNG, with separate pools
>> per NUMA node to avoid contention. (Just ignore the rude comments in the
>> code about applications not running their own CSPRNG, this is still Linux
>> after all.)
>> >
>> > There's even a neat trick XOR'ing some of the CSPRGN output back into
>> the ChaCha20 state to prevent an attacker from recovering any past output
>> from before the time of compromise.
>> >
>> > Some of these improvements came along thanks to the Wireguard work by
>> Jason A. Donenfeld
>>
>> "Problems emerge for a unified /dev/*random" (2022)
>> https://lwn.net/Articles/889452/
>>
>> From
>> https://www.redhat.com/en/blog/understanding-red-hat-enterprise-linux-random-number-generator-interface
>> :
>>
>> """
>> How does the kernel initialize its CSPRNG?
>> The kernel has an “entropy pool,” a place where unpredictable input
>> observed by the kernel is mixed and stored. That pool serves as a seed to
>> the internal CSPRNG, and until some threshold of estimated entropy is
>> reached initially, it is considered uninitialized.
>>
>> Let’s now see how the kernel initializes its entropy pool.
>>
>> 1. After the kernel takes control on power-on, it starts filling its
>> entropy pool by mixing interrupt timing and other unpredictable input.
>>
>> 2. The kernel gives control to systemd.
>>
>> 3. Next, systemd starts and initializes itself.
>>
>> 4. Systemd, optionally, loads kernel modules which will improve the
>> kernel's entropy gathering process on a virtual machine (e.g., virtio-rng).
>>
>> 5. Systemd loads the rngd.service which will gather additional input
>> entropy obtained via a random generator exposed by hardware (e.g., the x86
>> RDRAND instruction or similar) and jitter entropy1; this entropy is fed
>> back into the kernel to initialize its entropy pool, typically in a matter
>> of milliseconds.
>>
>> After the last step, the kernel has its entropy pool initialized, and any
>> systemd services started can take advantage of the kernel’s random
>> generator.
>>
>> Note that the virtio-rng kernel module loading in step (3), is an
>> optional step which improves entropy gathering in a virtual machine by
>> using the host's random generator to initialize the guest systems in KVM.
>> The rngd.service loading at the final step (4) is what ensures that the
>> kernel entropy pools are initialized on every scenario, and furthermore it
>> continues mixing additional data in the kernel pool during system runtime.
>> """
>>
>> https://github.com/nhorman/rng-tools/blob/master/fips.c :
>>
>> ```c
>> /* fips.c -- Performs FIPS 140-1/140-2 RNG tests
>> ```
>>
>> /? FIPS 140-1/140-2 RNG tests
>> https://www.google.com/search?q=FIPS+140-1%2F140-2+RNG+tests
>>
>> /? CMVP "cprng"
>> https://www.google.com/search?q=CMVP+%22cprng%22
>> https://csrc.nist.gov/publications/detail/fips/140/3/final
>>
>> https://www.google.com/search?q=rng+tests
>>
>> - https://www.johndcook.com/blog/rng-testing/ :
>>
>>   > We test RNGs using the standard test suites: PractRand, TestU01
>> (BigCrush), DIEHARD(ER), NIST SP 800-22.
>>
>> Randomness tests:
>>
>> https://en.wikipedia.org/wiki/Randomness_test#Notable_software_implementations
>> :
>> - https://en.wikipedia.org/wiki/Diehard_tests
>> - https://en.wikipedia.org/wiki/TestU01
>> - /? NIST 800-22 https://www.google.com/search?q=nist+800-22
>>
>> /? nist 800-22 site:github.com
>> https://www.google.com/search?q=nist+800-22+site%3Agithub.com
>>
>> -
>> https://github.com/google/paranoid_crypto/blob/main/docs/randomness_tests.md
>>
>>
>> From https://cryptography.io/en/latest/random-numbers/
>> https://github.com/pyca/cryptography/blob/main/docs/random-numbers.rst  :
>>
>>
>> ```rst
>> Random number generation
>> ========================
>>
>> When generating random data for use in cryptographic operations, such as
>> an
>> initialization vector for encryption in
>> :class:`~cryptography.hazmat.primitives.ciphers.modes.CBC` mode, you do
>> not
>> want to use the standard :mod:`random` module APIs. This is because they
>> do not
>> provide a cryptographically secure random number generator, which can
>> result in
>> major security issues depending on the algorithms in use.
>>
>> Therefore, it is our recommendation to `always use your operating system's
>> provided random number generator`_, which is available as
>> :func:`os.urandom`.
>> For example, if you need 16 bytes of random data for an initialization
>> vector,
>> you can obtain them with:
>>
>> .. doctest::
>>
>>     >>> import os
>>     >>> iv = os.urandom(16)
>>
>> This will use ``/dev/urandom`` on UNIX platforms, and ``CryptGenRandom``
>> on
>> Windows.
>>
>> If you need your random number as an integer (for example, for
>> :meth:`~cryptography.x509.CertificateBuilder.serial_number`), you can use
>> ``int.from_bytes`` to convert the result of ``os.urandom``:
>>
>> .. code-block:: pycon
>>
>>     >>> serial = int.from_bytes(os.urandom(20), byteorder="big")
>>
>> In addition, the `Python standard library`_ includes the ``secrets``
>> module,
>> which can be used for generating cryptographically secure random numbers,
>> with
>> specific helpers for text-based formats.
>>
>> .. _`always use your operating system's provided random number
>> generator`:
>> https://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers/
>> .. _`Python standard library`:
>> https://docs.python.org/3/library/secrets.html
>>
>> ```
>>
>>
>> On Mon, Nov 14, 2022, 10:57 AM Barry <ba...@barrys-emacs.org> wrote:
>>
>>>
>>>
>>> > On 14 Nov 2022, at 14:31, James Johnson <jj126...@gmail.com> wrote:
>>> >
>>> > 
>>> > I wrote the attached python (3) code to improve on existing prng
>>> functions. I used the time module for one method, which resulted in
>>> disproportionate odd values, but agreeable means.
>>> >
>>> > I used the hashlib module for the second. It is evident that the code
>>> is amateur, but the program might result in better PRN generation.
>>> >
>>> > The "app" lends itself to checking, using statistical tools (see
>>> comments.)
>>>
>>> Have you used any cryptographic tools to prove the quality of your PRNG?
>>> What results did you get?
>>> How does your PRNG compare to what python already has?
>>>
>>> Without that this analysis this will be unlikely to be considered as a
>>> candidate for python stdlib.
>>>
>>> Barry
>>>
>>> >
>>> > I remain a fan,
>>> >
>>> > James Johnson
>>> > <testrandom.py>
>>> > _______________________________________________
>>> > Python-ideas mailing list -- python-ideas@python.org
>>> > To unsubscribe send an email to python-ideas-le...@python.org
>>> > https://mail.python.org/mailman3/lists/python-ideas.python.org/
>>> > Message archived at
>>> https://mail.python.org/archives/list/python-ideas@python.org/message/VENAT2YTVYVHTBSEVHHMIURCU6MG2CEO/
>>> > Code of Conduct: http://python.org/psf/codeofconduct/
>>>
>>> _______________________________________________
>>> Python-ideas mailing list -- python-ideas@python.org
>>> To unsubscribe send an email to python-ideas-le...@python.org
>>> https://mail.python.org/mailman3/lists/python-ideas.python.org/
>>> Message archived at
>>> https://mail.python.org/archives/list/python-ideas@python.org/message/HWQV4AKQAUM7CY4NWS2IRIVLRAYMKR3V/
>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>>
>>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/LD2TFTNWACW5RATOKTLCZ4GZOV7M54YZ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to