Added README
This commit is contained in:
parent
0bcfeb3efe
commit
e46c5e580b
1 changed files with 77 additions and 0 deletions
77
README.md
Normal file
77
README.md
Normal file
|
@ -0,0 +1,77 @@
|
|||
# Pumpkin
|
||||
|
||||
A cryptographically-secure pseudo-random number generator for generating large
|
||||
prime.
|
||||
|
||||
## What's up with the name?
|
||||
|
||||
Since I began writing this library around Halloween of 2015, I wanted to choose
|
||||
a name that was vaguely related to the holiday. Because "pumpkin" and "prime"
|
||||
both begin with the letter 'p', I decided to use that. And that's all there
|
||||
really is to it!
|
||||
|
||||
## Purpose
|
||||
|
||||
`pumpkin` is a cryptographically-secure pseudo-random number generator, which is
|
||||
useful for generating large prime numbers for cryptography. In fact, `pumpkin`
|
||||
can ONLY be used to generate prime numbers. On the back-end, `pumpkin` uses the
|
||||
wonderful [ramp](https://crates.io/crates/ramp) library for storing the large
|
||||
numbers. `pumpkin` generates numbers very quickly, so you can be sure that your
|
||||
program will be performative. In our testing, primes were generated anywhere
|
||||
between 1s and 5s on average, though of course your mileage may vary.
|
||||
|
||||
## Example
|
||||
|
||||
```
|
||||
extern crate pumpkin;
|
||||
|
||||
use pumpkin::Prime;
|
||||
|
||||
fn main() {
|
||||
let p = Prime::new(2048); // Generate a new 2048-bit prime number
|
||||
let q = Prime::new(2048);
|
||||
let e = p * q;
|
||||
|
||||
println("{}", e);
|
||||
|
||||
/*
|
||||
* 75222035638256552797269351238215022250546763213674706... Some massive
|
||||
* 4096-bit number.
|
||||
*/
|
||||
}
|
||||
```
|
||||
|
||||
## Explanation
|
||||
`Prime`s are generated much the same way that large primes are generated by
|
||||
`GnuPG`:
|
||||
1) Create a large candidate number of size based on the input given to the
|
||||
`Prime::new()` method. All `Prime`s must be at least 2-bits long (thoug it
|
||||
wouldn't make much sense to be that small.
|
||||
|
||||
2) Divide the candidate number by the first 1,000 prime numbers.
|
||||
|
||||
3) Test the candidate number with [Fermat's Little
|
||||
Theorem](https://www.wikiwand.com/en/Fermat's_little_theorem).
|
||||
|
||||
4) Finally, run five iterations of the [Miller-Rabin Primality
|
||||
Test](https://www.wikiwand.com/en/Miller%E2%80%93Rabin_primality_test).
|
||||
|
||||
`Prime`s are seeded by `rand::OsRng`, which receives its entropy via the
|
||||
operating system's own entropy source (such as `/dev/urandom'). Thus, because we
|
||||
can be confident that the generated candidate number is truly random (or as
|
||||
close to truly random as the user can hope), we don't need to do more than five
|
||||
iterations of the Miller-Rabin test to ensure primality.
|
||||
|
||||
`Prime`s are simple "newtype" structs; that is, it is a tuple-like struct
|
||||
surrounding an `Int` type. `Prime`s have all of the basic algebraic and logical
|
||||
operators implemented, thus allowing you to do any operation that you would
|
||||
require.
|
||||
|
||||
## Contributing
|
||||
|
||||
`pumpkin` is dual-licenced under the MIT and Unlicense. Should you wish to
|
||||
contribute updates to the project, please consider signing the included `WAVER`
|
||||
file with your cryptographic digital signature (as allowed by your country's
|
||||
laws). Doing so will release your changes back into the public domain to be used
|
||||
freely by all. I did so with this project, and it would mean a lot if you did
|
||||
too!
|
Loading…
Add table
Reference in a new issue