]> gitweb.factorcode.org Git - factor.git/blob - extra/crypto/rsa/rsa.factor
Merge branch 'master' of http://factorcode.org/git/factor into tangle
[factor.git] / extra / crypto / rsa / rsa.factor
1 USING: math.miller-rabin kernel math math.functions namespaces
2 sequences ;
3 IN: crypto.rsa
4
5 ! The private key is the only secret.
6
7 ! p,q are two random primes of numbits/2
8 ! phi = (p-1)(q-1)
9 ! modulus = p*q
10 ! public = 65537
11 ! private = public modinv phi
12
13 TUPLE: rsa modulus private-key public-key ;
14
15 C: <rsa> rsa
16
17 <PRIVATE
18
19 : public-key 65537 ; inline
20
21 : rsa-primes ( numbits -- p q )
22     2/ 2 unique-primes first2 ;
23
24 : modulus-phi ( numbits -- n phi ) 
25     #! Loop until phi is not divisible by the public key.
26     dup rsa-primes [ * ] 2keep
27     [ 1- ] bi@ *
28     dup public-key gcd nip 1 = [
29         rot drop
30     ] [
31         2drop modulus-phi
32     ] if ;
33
34 PRIVATE>
35
36 : generate-rsa-keypair ( numbits -- <rsa> )
37     modulus-phi
38     public-key over mod-inv +
39     public-key <rsa> ;
40
41 : rsa-encrypt ( message rsa -- encrypted )
42     [ rsa-public-key ] keep rsa-modulus ^mod ;
43
44 : rsa-decrypt ( encrypted rsa -- message )
45     [ rsa-private-key ] keep rsa-modulus ^mod ;