<div dir="auto">Hi Steffen,<div dir="auto"><br></div><div dir="auto">I think your question is about whether the encryption algorithm should check where the message fits into the message space.</div><div dir="auto"><br></div><div dir="auto">So, asymmetric encryption algorithms today are commonly used to encrypt keys rather than data, and the common key size is far smaller than the message size of common RSA message space.</div><div dir="auto"><br></div><div dir="auto">I think that is the reason why such a check does not exist in the current implementation.</div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Jul 6, 2018, 1:24 AM Steffen Bingel, pi4 <<a href="mailto:sbi@pi4.de">sbi@pi4.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Karl,<br>
<br>
thanks for your reply. What I am trying to do goes more into the <br>
direction of what gpg offers with its encrypt decrypt feature. As far as <br>
I understood there is done what you are suggesting. Create a random key, <br>
encrypt the data symmetrically with this key and use asymmetric <br>
encryption for this key. Ok...<br>
<br>
The big unanswered question is still why the gcry_pk_encrypt only works <br>
properly with data up to the key size and if that behavior is intended. <br>
Why is that function generating unusable output without throwing an error?<br>
<br>
On 27.06.2018 03:43, Karl Magdsick wrote:<br>
> There are a variety of attacks against RSA when used in this manner.  You<br>
> really should use OAEP (<br>
> <a href="https://en.m.wikipedia.org/wiki/Optimal_asymmetric_encryption_padding" rel="noreferrer noreferrer" target="_blank">https://en.m.wikipedia.org/wiki/Optimal_asymmetric_encryption_padding</a> ) and<br>
> you almost certainly should use RSA to exchange keys for a symmetric<br>
> authenticated encryption algorithm (such as ChaCha20-Poly1305 or AES-GCM).<br>
><br>
> It goes without saying that playing around with encryption is fun, but for<br>
> anything serious, use a high-level well-reviewed library implementing<br>
> well-studied protocols.  libgnutls, libgpgme, and libsodium are good<br>
> choices, depending on your use case.  libgcrypt is a low-level library<br>
> meant as a building block for high-level end-user libraries.<br>
><br>
><br>
> Cheers,<br>
> Karl<br>
><br>
> On Tue, Jun 26, 2018, 23:33 Steffen Bingel, pi4 <<a href="mailto:sbi@pi4.de" target="_blank" rel="noreferrer">sbi@pi4.de</a>> wrote:<br>
><br>
>> Hi,<br>
>><br>
>> at first, this is the first time for me using a mailing list and I<br>
>> apologize in advance for any violation of rules I may not know yet.<br>
>><br>
>> I'm playing around with the private/public key functions of libgcrypt<br>
>> and ran into an behavior I couldn't find an explanation for. If my<br>
>> message that I try to encrypt is larger than the key I use for<br>
>> encryption the pk_encrypt seems to generate random data without throwing<br>
>> an error. The following code is a condensed copy from<br>
>> <a href="https://github.com/vedantk/gcrypt-example/blob/master/main.cc" rel="noreferrer noreferrer" target="_blank">https://github.com/vedantk/gcrypt-example/blob/master/main.cc</a>. If my<br>
>> message contains 32 characters (256 bit) this works fine but if I pass<br>
>> 33 or more characters the decrypted messages makes no sense at all. I<br>
>> was also playing around with bigger keys where I could observe the same<br>
>> behavior (msg bigger than key not working).<br>
>><br>
>> So if the function is not intended to take data larger than the key, why<br>
>> is it not returning an error?<br>
>><br>
>> What is the correct way to encrypt large, at least larger than the key,<br>
>> binary data I have in memory?<br>
>><br>
>> Thanks a lot<br>
>><br>
>>       gcry_error_t err;<br>
>><br>
>>       #define _assert(cmd) {\<br>
>>           err = cmd;\<br>
>>           if (err != GPG_ERR_NO_ERROR) {\<br>
>>               L("ERR: command returned: %s",gcry_strerror(err));\<br>
>>           }}<br>
>><br>
>>       /* generate key pair */<br>
>>       gcry_sexp_t rsa_keypair;<br>
>>       gcry_sexp_t parms;<br>
>>       _assert(gcry_sexp_build( &parms, NULL, "(genkey(rsa(nbits<br>
>> %d)))",256));<br>
>><br>
>>       _assert(gcry_pk_genkey( &rsa_keypair,parms ));<br>
>><br>
>>       gcry_sexp_t pubk = gcry_sexp_find_token(rsa_keypair, "public-key", 0);<br>
>>       gcry_sexp_t privk = gcry_sexp_find_token(rsa_keypair,<br>
>> "private-key", 0);<br>
>><br>
>>       /* Create a message. */<br>
>>       gcry_mpi_t msg;<br>
>>       gcry_sexp_t data;<br>
>>       const unsigned char* s = (const unsigned char*)<br>
>>           "uweoirdnd1iejfkslrm2kdleirjfm3xss";<br>
>>       _assert(gcry_mpi_scan(&msg, GCRYMPI_FMT_USG, s, strlen((const<br>
>> char*) s), NULL));<br>
>><br>
>>       gcry_mpi_dump(msg);<br>
>><br>
>>       _assert(gcry_sexp_build(&data, NULL,"(data (flags raw) (value<br>
>> %m))", msg));<br>
>><br>
>>       gcry_sexp_dump(data);<br>
>><br>
>>       /* Encrypt the message. */<br>
>>       gcry_sexp_t ciph;<br>
>>       _assert(gcry_pk_encrypt(&ciph, data, pubk));<br>
>><br>
>>       gcry_sexp_dump(ciph);<br>
>><br>
>>       /* Decrypt the message. */<br>
>>       gcry_sexp_t plain;<br>
>>       _assert(gcry_pk_decrypt(&plain, ciph, privk));<br>
>><br>
>>       /* Pretty-print the results. */<br>
>>       gcry_mpi_t out_msg = gcry_sexp_nth_mpi(plain, 0, GCRYMPI_FMT_USG);<br>
>>       L("Original:");<br>
>>       gcry_mpi_dump(msg);<br>
>>       L("\n" "Decrypted:");<br>
>>       gcry_mpi_dump(out_msg);<br>
>><br>
>>       if (gcry_mpi_cmp(msg, out_msg)) {<br>
>>           L("data corruption!");<br>
>>       } else {<br>
>>           L("Messages match.\n");<br>
>>       }<br>
>><br>
>><br>
>><br>
>><br>
>><br>
>> _______________________________________________<br>
>> Gcrypt-devel mailing list<br>
>> <a href="mailto:Gcrypt-devel@gnupg.org" target="_blank" rel="noreferrer">Gcrypt-devel@gnupg.org</a><br>
>> <a href="http://lists.gnupg.org/mailman/listinfo/gcrypt-devel" rel="noreferrer noreferrer" target="_blank">http://lists.gnupg.org/mailman/listinfo/gcrypt-devel</a><br>
>><br>
<br>
-- <br>
<<a href="http://www.youtube.com/user/pi4robotics" rel="noreferrer noreferrer" target="_blank">http://www.youtube.com/user/pi4robotics</a>> <br>
<<a href="https://www.facebook.com/pages/Pi4robotics/585066464944400" rel="noreferrer noreferrer" target="_blank">https://www.facebook.com/pages/Pi4robotics/585066464944400</a>> <br>
<<a href="http://shop.pi4.de/" rel="noreferrer noreferrer" target="_blank">http://shop.pi4.de/</a>> shop pi4 <<a href="http://www.pi4.de/" rel="noreferrer noreferrer" target="_blank">http://www.pi4.de/</a>> <br>
<<a href="https://plus.google.com/114443897501813508840/posts" rel="noreferrer noreferrer" target="_blank">https://plus.google.com/114443897501813508840/posts</a>> <br>
<<a href="https://twitter.com/pi4_robotics" rel="noreferrer noreferrer" target="_blank">https://twitter.com/pi4_robotics</a>><br>
<br>
Mit freundlichen Grüßen<br>
Yours sincerely<br>
<br>
Steffen Bingel<br>
<br>
pi4_robotics GmbH<br>
Gustav-Meyer-Allee 25<br>
13355 Berlin<br>
Tel: +49 (0)30-7009694-210<br>
Fax: +49 (0)30-7009694-69<br>
Email: <a href="mailto:sbi@pi4.de" target="_blank" rel="noreferrer">sbi@pi4.de</a><br>
URL: <a href="http://www.pi4.de" rel="noreferrer noreferrer" target="_blank">www.pi4.de</a><br>
Registergericht Berlin HRB 80513<br>
Geschäftsführer: Matthias Krinke<br>
USt-ID: DE217617178<br>
Zollnr.: 6559298<br>
<br>
<br>
_______________________________________________<br>
Gcrypt-devel mailing list<br>
<a href="mailto:Gcrypt-devel@gnupg.org" target="_blank" rel="noreferrer">Gcrypt-devel@gnupg.org</a><br>
<a href="http://lists.gnupg.org/mailman/listinfo/gcrypt-devel" rel="noreferrer noreferrer" target="_blank">http://lists.gnupg.org/mailman/listinfo/gcrypt-devel</a><br>
</blockquote></div>