Naïve RSA decryption in PythonIs my Encryption Module Secure?Encoding and decoding small strings of textC#...

Air travel with refrigerated insulin

Weird lines in Microsoft Word

Turning a hard to access nut?

Writing in a Christian voice

Unfrosted light bulb

PTIJ: Why do we make a Lulav holder?

I got the following comment from a reputed math journal. What does it mean?

Have any astronauts/cosmonauts died in space?

Worshiping one God at a time?

Homology of the fiber

Which partition to make active?

How do you justify more code being written by following clean code practices?

Can other pieces capture a threatening piece and prevent a checkmate?

Exposing a company lying about themselves in a tightly knit industry: Is my career at risk on the long run?

What is it called when someone votes for an option that's not their first choice?

Should a narrator ever describe things based on a characters view instead of fact?

Was World War I a war of liberals against authoritarians?

Do I need an EFI partition for each 18.04 ubuntu I have on my HD?

Unable to get newly inserted Product's Id using After Plugin for Catalog Product save controller method

Why I don't get the wanted width of tcbox?

Print last inputted byte

What is the tangent at a sharp point on a curve?

How are passwords stolen from companies if they only store hashes?

Would mining huge amounts of resources on the Moon change its orbit?



Naïve RSA decryption in Python


Is my Encryption Module Secure?Encoding and decoding small strings of textC# AES + RSA Encryption ImplementationEncryption in C#My images have secrets A.K.A. the making of aesthetic passwords V.2ISO mode encryption/decryption with BouncyCastleEncryption/decryption by matrix multiplication in CC++ RSA ImplementationGenerate two random primes and find their totientPython RSA/DSA File Cryptography, Key Generation, Key Protection













1












$begingroup$


I am making a code with basic RSA encryption/decryption. My professor wants me to speed up this function but it is already so simple and I am lost. Any ideas?



def decrypt(kenc,d,n):            
kdec=(kenc**d)%n
return kdec









share|improve this question











$endgroup$

















    1












    $begingroup$


    I am making a code with basic RSA encryption/decryption. My professor wants me to speed up this function but it is already so simple and I am lost. Any ideas?



    def decrypt(kenc,d,n):            
    kdec=(kenc**d)%n
    return kdec









    share|improve this question











    $endgroup$















      1












      1








      1





      $begingroup$


      I am making a code with basic RSA encryption/decryption. My professor wants me to speed up this function but it is already so simple and I am lost. Any ideas?



      def decrypt(kenc,d,n):            
      kdec=(kenc**d)%n
      return kdec









      share|improve this question











      $endgroup$




      I am making a code with basic RSA encryption/decryption. My professor wants me to speed up this function but it is already so simple and I am lost. Any ideas?



      def decrypt(kenc,d,n):            
      kdec=(kenc**d)%n
      return kdec






      python performance homework cryptography






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 2 hours ago









      200_success

      130k17154419




      130k17154419










      asked 7 hours ago









      Chad TChad T

      211




      211






















          1 Answer
          1






          active

          oldest

          votes


















          4












          $begingroup$

          Simple does not mean fast, so you cannot judge performance based on how simple the implementation looks. Usually the most efficient way to perform a non-trivial task is not also the simplest way to do it. In this case though, there is a much more efficient solution that is about equally simple, and is probably sufficient.



          There is a serious problem with this implementation: it computes kenc**d.



          kenc**d is in general a very big number that takes a long time to compute, and then it takes a long time again to reduce it modulo n. For example, trying it out with 1024bit RSA (the lowest setting!):



          import Crypto
          from Crypto.PublicKey import RSA
          from Crypto import Random

          random_generator = Random.new().read
          key = RSA.generate(1024, random_generator)

          def decrypt(kenc,d,n):
          kdec=(kenc**d)%n
          return kdec

          (ciphertext,) = key.encrypt(42, 0)
          print(decrypt(ciphertext, key.d, key.n))


          This does not finish in a reasonable time. Estimating the size of kenc**d, it is expected to be up to (and usually close to) 1024*1024 = 1048576 bits (both kenc and d are 1024 bit numbers), that will certainly fit on a computer these days, but that's still a very big number and calculations on such large numbers take a lot of time, especially multiplication and remainder.



          There is a simple remedy: use modular exponentiation, which keeps the size of the numbers that it is working with low throughout the whole calculation by reducing modulo n as it goes along. You could implement it yourself, but Python handily provides a built-in function for this: pow(x, e, n)



          So decrypt can be written as:



          def decrypt(kenc, d, n):
          return pow(kenc, d, n)


          With that change, the code above decodes the message quickly.



          Further improvements are possible, but more complicated, and won't be drop-in replacements.






          share|improve this answer









          $endgroup$













            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            });
            });
            }, "mathjax-editing");

            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "196"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215712%2fna%25c3%25afve-rsa-decryption-in-python%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            4












            $begingroup$

            Simple does not mean fast, so you cannot judge performance based on how simple the implementation looks. Usually the most efficient way to perform a non-trivial task is not also the simplest way to do it. In this case though, there is a much more efficient solution that is about equally simple, and is probably sufficient.



            There is a serious problem with this implementation: it computes kenc**d.



            kenc**d is in general a very big number that takes a long time to compute, and then it takes a long time again to reduce it modulo n. For example, trying it out with 1024bit RSA (the lowest setting!):



            import Crypto
            from Crypto.PublicKey import RSA
            from Crypto import Random

            random_generator = Random.new().read
            key = RSA.generate(1024, random_generator)

            def decrypt(kenc,d,n):
            kdec=(kenc**d)%n
            return kdec

            (ciphertext,) = key.encrypt(42, 0)
            print(decrypt(ciphertext, key.d, key.n))


            This does not finish in a reasonable time. Estimating the size of kenc**d, it is expected to be up to (and usually close to) 1024*1024 = 1048576 bits (both kenc and d are 1024 bit numbers), that will certainly fit on a computer these days, but that's still a very big number and calculations on such large numbers take a lot of time, especially multiplication and remainder.



            There is a simple remedy: use modular exponentiation, which keeps the size of the numbers that it is working with low throughout the whole calculation by reducing modulo n as it goes along. You could implement it yourself, but Python handily provides a built-in function for this: pow(x, e, n)



            So decrypt can be written as:



            def decrypt(kenc, d, n):
            return pow(kenc, d, n)


            With that change, the code above decodes the message quickly.



            Further improvements are possible, but more complicated, and won't be drop-in replacements.






            share|improve this answer









            $endgroup$


















              4












              $begingroup$

              Simple does not mean fast, so you cannot judge performance based on how simple the implementation looks. Usually the most efficient way to perform a non-trivial task is not also the simplest way to do it. In this case though, there is a much more efficient solution that is about equally simple, and is probably sufficient.



              There is a serious problem with this implementation: it computes kenc**d.



              kenc**d is in general a very big number that takes a long time to compute, and then it takes a long time again to reduce it modulo n. For example, trying it out with 1024bit RSA (the lowest setting!):



              import Crypto
              from Crypto.PublicKey import RSA
              from Crypto import Random

              random_generator = Random.new().read
              key = RSA.generate(1024, random_generator)

              def decrypt(kenc,d,n):
              kdec=(kenc**d)%n
              return kdec

              (ciphertext,) = key.encrypt(42, 0)
              print(decrypt(ciphertext, key.d, key.n))


              This does not finish in a reasonable time. Estimating the size of kenc**d, it is expected to be up to (and usually close to) 1024*1024 = 1048576 bits (both kenc and d are 1024 bit numbers), that will certainly fit on a computer these days, but that's still a very big number and calculations on such large numbers take a lot of time, especially multiplication and remainder.



              There is a simple remedy: use modular exponentiation, which keeps the size of the numbers that it is working with low throughout the whole calculation by reducing modulo n as it goes along. You could implement it yourself, but Python handily provides a built-in function for this: pow(x, e, n)



              So decrypt can be written as:



              def decrypt(kenc, d, n):
              return pow(kenc, d, n)


              With that change, the code above decodes the message quickly.



              Further improvements are possible, but more complicated, and won't be drop-in replacements.






              share|improve this answer









              $endgroup$
















                4












                4








                4





                $begingroup$

                Simple does not mean fast, so you cannot judge performance based on how simple the implementation looks. Usually the most efficient way to perform a non-trivial task is not also the simplest way to do it. In this case though, there is a much more efficient solution that is about equally simple, and is probably sufficient.



                There is a serious problem with this implementation: it computes kenc**d.



                kenc**d is in general a very big number that takes a long time to compute, and then it takes a long time again to reduce it modulo n. For example, trying it out with 1024bit RSA (the lowest setting!):



                import Crypto
                from Crypto.PublicKey import RSA
                from Crypto import Random

                random_generator = Random.new().read
                key = RSA.generate(1024, random_generator)

                def decrypt(kenc,d,n):
                kdec=(kenc**d)%n
                return kdec

                (ciphertext,) = key.encrypt(42, 0)
                print(decrypt(ciphertext, key.d, key.n))


                This does not finish in a reasonable time. Estimating the size of kenc**d, it is expected to be up to (and usually close to) 1024*1024 = 1048576 bits (both kenc and d are 1024 bit numbers), that will certainly fit on a computer these days, but that's still a very big number and calculations on such large numbers take a lot of time, especially multiplication and remainder.



                There is a simple remedy: use modular exponentiation, which keeps the size of the numbers that it is working with low throughout the whole calculation by reducing modulo n as it goes along. You could implement it yourself, but Python handily provides a built-in function for this: pow(x, e, n)



                So decrypt can be written as:



                def decrypt(kenc, d, n):
                return pow(kenc, d, n)


                With that change, the code above decodes the message quickly.



                Further improvements are possible, but more complicated, and won't be drop-in replacements.






                share|improve this answer









                $endgroup$



                Simple does not mean fast, so you cannot judge performance based on how simple the implementation looks. Usually the most efficient way to perform a non-trivial task is not also the simplest way to do it. In this case though, there is a much more efficient solution that is about equally simple, and is probably sufficient.



                There is a serious problem with this implementation: it computes kenc**d.



                kenc**d is in general a very big number that takes a long time to compute, and then it takes a long time again to reduce it modulo n. For example, trying it out with 1024bit RSA (the lowest setting!):



                import Crypto
                from Crypto.PublicKey import RSA
                from Crypto import Random

                random_generator = Random.new().read
                key = RSA.generate(1024, random_generator)

                def decrypt(kenc,d,n):
                kdec=(kenc**d)%n
                return kdec

                (ciphertext,) = key.encrypt(42, 0)
                print(decrypt(ciphertext, key.d, key.n))


                This does not finish in a reasonable time. Estimating the size of kenc**d, it is expected to be up to (and usually close to) 1024*1024 = 1048576 bits (both kenc and d are 1024 bit numbers), that will certainly fit on a computer these days, but that's still a very big number and calculations on such large numbers take a lot of time, especially multiplication and remainder.



                There is a simple remedy: use modular exponentiation, which keeps the size of the numbers that it is working with low throughout the whole calculation by reducing modulo n as it goes along. You could implement it yourself, but Python handily provides a built-in function for this: pow(x, e, n)



                So decrypt can be written as:



                def decrypt(kenc, d, n):
                return pow(kenc, d, n)


                With that change, the code above decodes the message quickly.



                Further improvements are possible, but more complicated, and won't be drop-in replacements.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered 4 hours ago









                haroldharold

                1,32867




                1,32867






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Code Review Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    Use MathJax to format equations. MathJax reference.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215712%2fna%25c3%25afve-rsa-decryption-in-python%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Why do type traits not work with types in namespace scope?What are POD types in C++?Why can templates only be...

                    Will tsunami waves travel forever if there was no land?Why do tsunami waves begin with the water flowing away...

                    Simple Scan not detecting my scanner (Brother DCP-7055W)Brother MFC-L2700DW printer can print, can't...