<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mariano Guerra's Log (Publicaciones sobre crypto)</title><link>http://marianoguerra.org/</link><description></description><atom:link href="http://marianoguerra.org/es/categories/crypto.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><lastBuildDate>Mon, 18 Nov 2024 17:56:44 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Public/Private Key Encryption, Sign and Verification in Erlang</title><link>http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;You want to encrypt/decrypt some content?&lt;/p&gt;
&lt;p&gt;You want to generate a signature and let others verify it?&lt;/p&gt;
&lt;p&gt;At least that's what I wanted to do, so here it is.&lt;/p&gt;
&lt;p&gt;First generate keys if you don't have some available:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_d1af6be249994e0b884ea9931c705b14-1" name="rest_code_d1af6be249994e0b884ea9931c705b14-1" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_d1af6be249994e0b884ea9931c705b14-1"&gt;&lt;/a&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;genrsa&lt;span class="w"&gt; &lt;/span&gt;-out&lt;span class="w"&gt; &lt;/span&gt;private.pem&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2048&lt;/span&gt;
&lt;a id="rest_code_d1af6be249994e0b884ea9931c705b14-2" name="rest_code_d1af6be249994e0b884ea9931c705b14-2" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_d1af6be249994e0b884ea9931c705b14-2"&gt;&lt;/a&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;rsa&lt;span class="w"&gt; &lt;/span&gt;-in&lt;span class="w"&gt; &lt;/span&gt;private.pem&lt;span class="w"&gt; &lt;/span&gt;-out&lt;span class="w"&gt; &lt;/span&gt;public.pem&lt;span class="w"&gt; &lt;/span&gt;-outform&lt;span class="w"&gt; &lt;/span&gt;PEM&lt;span class="w"&gt; &lt;/span&gt;-pubout
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Load the raw keys:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_8da8651b71f6470ba6274a100b78ace0-1" name="rest_code_8da8651b71f6470ba6274a100b78ace0-1" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_8da8651b71f6470ba6274a100b78ace0-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;RawSKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"private.pem"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_8da8651b71f6470ba6274a100b78ace0-2" name="rest_code_8da8651b71f6470ba6274a100b78ace0-2" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_8da8651b71f6470ba6274a100b78ace0-2"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;RawPKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"public.pem"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_8da8651b71f6470ba6274a100b78ace0-3" name="rest_code_8da8651b71f6470ba6274a100b78ace0-3" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_8da8651b71f6470ba6274a100b78ace0-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_8da8651b71f6470ba6274a100b78ace0-4" name="rest_code_8da8651b71f6470ba6274a100b78ace0-4" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_8da8651b71f6470ba6274a100b78ace0-4"&gt;&lt;/a&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;EncSKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;pem_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;RawSKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_8da8651b71f6470ba6274a100b78ace0-5" name="rest_code_8da8651b71f6470ba6274a100b78ace0-5" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_8da8651b71f6470ba6274a100b78ace0-5"&gt;&lt;/a&gt;&lt;span class="nv"&gt;SKey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;pem_entry_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;EncSKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_8da8651b71f6470ba6274a100b78ace0-6" name="rest_code_8da8651b71f6470ba6274a100b78ace0-6" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_8da8651b71f6470ba6274a100b78ace0-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_8da8651b71f6470ba6274a100b78ace0-7" name="rest_code_8da8651b71f6470ba6274a100b78ace0-7" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_8da8651b71f6470ba6274a100b78ace0-7"&gt;&lt;/a&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;EncPKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;pem_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;RawPKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_8da8651b71f6470ba6274a100b78ace0-8" name="rest_code_8da8651b71f6470ba6274a100b78ace0-8" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_8da8651b71f6470ba6274a100b78ace0-8"&gt;&lt;/a&gt;&lt;span class="nv"&gt;PKey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;pem_entry_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;EncPKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's encrypt a message with the private key and decrypt with the public key:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_0dc72c572f6d4997a456a307b13ca587-1" name="rest_code_0dc72c572f6d4997a456a307b13ca587-1" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_0dc72c572f6d4997a456a307b13ca587-1"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"hello crypto world"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;a id="rest_code_0dc72c572f6d4997a456a307b13ca587-2" name="rest_code_0dc72c572f6d4997a456a307b13ca587-2" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_0dc72c572f6d4997a456a307b13ca587-2"&gt;&lt;/a&gt;&lt;span class="nv"&gt;CMsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;encrypt_private&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_0dc72c572f6d4997a456a307b13ca587-3" name="rest_code_0dc72c572f6d4997a456a307b13ca587-3" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_0dc72c572f6d4997a456a307b13ca587-3"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;decrypt_public&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;CMsg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can do it the other way, encrypt with the public key and decrypt with the
private key:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_2319689c417e4f3394c79c98e3fc86b1-1" name="rest_code_2319689c417e4f3394c79c98e3fc86b1-1" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_2319689c417e4f3394c79c98e3fc86b1-1"&gt;&lt;/a&gt;&lt;span class="nv"&gt;CPMsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;encrypt_public&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_2319689c417e4f3394c79c98e3fc86b1-2" name="rest_code_2319689c417e4f3394c79c98e3fc86b1-2" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_2319689c417e4f3394c79c98e3fc86b1-2"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;decrypt_private&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;CPMsg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's generate a signature for the message that others can verify with our
public key:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_1c2fa59e1c684adf8400270135e37c33-1" name="rest_code_1c2fa59e1c684adf8400270135e37c33-1" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_1c2fa59e1c684adf8400270135e37c33-1"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_1c2fa59e1c684adf8400270135e37c33-2" name="rest_code_1c2fa59e1c684adf8400270135e37c33-2" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_1c2fa59e1c684adf8400270135e37c33-2"&gt;&lt;/a&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_1c2fa59e1c684adf8400270135e37c33-3" name="rest_code_1c2fa59e1c684adf8400270135e37c33-3" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_1c2fa59e1c684adf8400270135e37c33-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_1c2fa59e1c684adf8400270135e37c33-4" name="rest_code_1c2fa59e1c684adf8400270135e37c33-4" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_1c2fa59e1c684adf8400270135e37c33-4"&gt;&lt;/a&gt;&lt;span class="c"&gt;% let's see if it works with another message&lt;/span&gt;
&lt;a id="rest_code_1c2fa59e1c684adf8400270135e37c33-5" name="rest_code_1c2fa59e1c684adf8400270135e37c33-5" href="http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/#rest_code_1c2fa59e1c684adf8400270135e37c33-5"&gt;&lt;/a&gt;&lt;span class="nn"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"not the original message"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PKey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><guid>http://marianoguerra.org/es/posts/publicprivate-key-encryption-sign-and-verification-in-erlang/</guid><pubDate>Fri, 01 Sep 2017 10:28:51 GMT</pubDate></item></channel></rss>