Nuvious
Nuvious

Reputation: 1469

Generating an RSA Key Pair with Erlang?

Erlang has a crypto function which generates public private keys (documentation copied below). However the documentation seems vague and I can't find any example code that describes how to generate the shared prime number or the generator. Can someone post an example that generates a public/private key pair? Thanks in advance for any help!

dh_generate_key(DHParams) -> {PublicKey,PrivateKey} 
dh_generate_key(PrivateKey, DHParams) -> {PublicKey,PrivateKey} 

Types: DHParameters = [P, G] P, G = Mpint Where P is the shared prime number and G is the shared generator. PublicKey, PrivateKey = Mpint() Generates a Diffie-Hellman PublicKey and PrivateKey (if not given).

Upvotes: 9

Views: 4873

Answers (4)

Charles Cunningham
Charles Cunningham

Reputation: 51

You can use the crypto:generate_key/2 function to create RSA public and private keys:

For a 2048 length

{Pub, Priv} = crypto:generate_key(rsa, {2048,65537}).

Or for a 1024 length

{Pub, Priv} = crypto:generate_key(rsa, {1024,65537}).

See: https://erlang.org/doc/apps/crypto/crypto.pdf (page 37)

generate_key(Type, Params) -> {PublicKey, PrivKeyOut}

Where

Type = rsa


Params = rsa_params() =
    {ModulusSizeInBits :: integer(),
     PublicExponent :: key_integer()} 

Upvotes: 4

Alexander Shavelev
Alexander Shavelev

Reputation: 324

os:command("openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048").

Upvotes: 2

goertzenator
goertzenator

Reputation: 2039

See cutkey (https://github.com/yrashk/cutkey)

"cutkey is an Erlang app for generating RSA keys. It is implemented as a port driver that calls OpenSSL's RSA_generate_key on a thread from the async pool."

Upvotes: 2

Tadmas
Tadmas

Reputation: 6368

You don't generate the shared prime number or the generator for Diffie-Hellman. See:

http://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange

The parameters P and G are agreed to ahead of time by both sides. Using the notation of the Wikipedia article, crypto:dh_generate_key is used for steps 2 & 3 to generate a/A & b/B, and then crypto:dh_compute_key is used for steps 4 & 5 to compute the shared secret s.

For RSA, I don't know of a standard library function that generates a public/private key pair. Generating primes is a fairly involved algorithm from what I remember; I would strongly recommend you not try to code it yourself. Diffie-Hellman key pairs are not suitable for use with RSA; they are different algorithms intended for different purposes.

Generally you don't need to generate these at runtime since you can reuse the key pair. You can use any number of other sources to actually generate it. (Maybe ssh-keygen would work? And there's always OpenSSL.) To use the key pair you've created, you'd use the crypto:rsa_ public/private _ encrypt/decrypt functions.

Upvotes: 9

Related Questions