Python AES-CBC implementation using AES-ECB

Why didn’t Eve recognize the little cockroach as a living organism?

When and why was runway 07/25 at Kai Tak removed?

How much do grades matter for a future academia position?

How do I tell my boss that I'm quitting in 15 days (a colleague left this week)

How do I Interface a PS/2 Keyboard without Modern Techniques?

Sound waves in different octaves

Can I say "fingers" when referring to toes?

Why Shazam when there is already Superman?

Limit max CPU usage SQL SERVER with WSRM

How to get directions in deep space?

What is the meaning of the following sentence?

How to test the sharpness of a knife?

What is the meaning of "You've never met a graph you didn't like?"

Quoting Keynes in a lecture

How would a solely written language work mechanically

Should I warn new/prospective PhD Student that supervisor is terrible?

Air travel with refrigerated insulin

Isometric embedding of a genus g surface

Does the Crossbow Expert feat's extra crossbow attack work with the reaction attack from a Hunter ranger's Giant Killer feature?

Do I have to know the General Relativity theory to understand the concept of inertial frame?

Do you waste sorcery points if you try to apply metamagic to a spell from a scroll but fail to cast it?

Check if object is null and return null

Can you identify this lizard-like creature I observed in the UK?

If Captain Marvel (MCU) were to have a child with a human male, would the child be human or Kree?



Python AES-CBC implementation using AES-ECB














0












$begingroup$


I am looking for ways to make this code more "pythonic" and any issues with my implementation. This was designed to solve Crytopal's Challenge 10. This challenge involves recreating the AES-CBC cipher using a library-provided AES-ECB function.



from Cryptodome.Cipher import AES

def decrypt_aes_ecb(data, key):
cipher = AES.new(key, AES.MODE_ECB)
return cipher.decrypt(data)

def encrypt_aes_ecb(data, key):
cipher = AES.new(key, AES.MODE_ECB)
return cipher.encrypt(data)

def pkcs7(val, block_size=16):
remaining = block_size - len(val) % block_size
if remaining == block_size:
remaining = 16
ret = val + chr(remaining).encode() * remaining

return ret

def unpkcs7(val, block_size=16):
pad_amount = val[-1]
if pad_amount == 0:
raise Exception
for i in range(len(val) - 1, len(val) - (pad_amount + 1), -1):
if val[i] != pad_amount:
raise Exception
return val[:-pad_amount]

def decrypt_aes_cbc(data, key, iv = b'x00' * 16, pad=True):
prev_chunk = iv

decrypted = []

for i in range(0, len(data), 16):
chunk = data[i : i + 16]
decrypted += xor(decrypt_aes_ecb(chunk, key), prev_chunk)
prev_chunk = chunk

if pad:
return unpkcs7(bytes(decrypted))
return bytes(decrypted)

def encrypt_aes_cbc(data, key, iv = b'x00' * 16, pad=True):
if pad:
padded = pkcs7(data)
else:
padded = data

prev_chunk = iv

encrypted = []

for i in range(0, len(padded), 16):
chunk = padded[i : i + 16]
encrypted_block = encrypt_aes_ecb(xor(chunk, prev_chunk), key)
encrypted += encrypted_block
prev_chunk = encrypted_block

return bytes(encrypted)








share







New contributor




Infuzion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$
















    0












    $begingroup$


    I am looking for ways to make this code more "pythonic" and any issues with my implementation. This was designed to solve Crytopal's Challenge 10. This challenge involves recreating the AES-CBC cipher using a library-provided AES-ECB function.



    from Cryptodome.Cipher import AES

    def decrypt_aes_ecb(data, key):
    cipher = AES.new(key, AES.MODE_ECB)
    return cipher.decrypt(data)

    def encrypt_aes_ecb(data, key):
    cipher = AES.new(key, AES.MODE_ECB)
    return cipher.encrypt(data)

    def pkcs7(val, block_size=16):
    remaining = block_size - len(val) % block_size
    if remaining == block_size:
    remaining = 16
    ret = val + chr(remaining).encode() * remaining

    return ret

    def unpkcs7(val, block_size=16):
    pad_amount = val[-1]
    if pad_amount == 0:
    raise Exception
    for i in range(len(val) - 1, len(val) - (pad_amount + 1), -1):
    if val[i] != pad_amount:
    raise Exception
    return val[:-pad_amount]

    def decrypt_aes_cbc(data, key, iv = b'x00' * 16, pad=True):
    prev_chunk = iv

    decrypted = []

    for i in range(0, len(data), 16):
    chunk = data[i : i + 16]
    decrypted += xor(decrypt_aes_ecb(chunk, key), prev_chunk)
    prev_chunk = chunk

    if pad:
    return unpkcs7(bytes(decrypted))
    return bytes(decrypted)

    def encrypt_aes_cbc(data, key, iv = b'x00' * 16, pad=True):
    if pad:
    padded = pkcs7(data)
    else:
    padded = data

    prev_chunk = iv

    encrypted = []

    for i in range(0, len(padded), 16):
    chunk = padded[i : i + 16]
    encrypted_block = encrypt_aes_ecb(xor(chunk, prev_chunk), key)
    encrypted += encrypted_block
    prev_chunk = encrypted_block

    return bytes(encrypted)








    share







    New contributor




    Infuzion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.







    $endgroup$














      0












      0








      0





      $begingroup$


      I am looking for ways to make this code more "pythonic" and any issues with my implementation. This was designed to solve Crytopal's Challenge 10. This challenge involves recreating the AES-CBC cipher using a library-provided AES-ECB function.



      from Cryptodome.Cipher import AES

      def decrypt_aes_ecb(data, key):
      cipher = AES.new(key, AES.MODE_ECB)
      return cipher.decrypt(data)

      def encrypt_aes_ecb(data, key):
      cipher = AES.new(key, AES.MODE_ECB)
      return cipher.encrypt(data)

      def pkcs7(val, block_size=16):
      remaining = block_size - len(val) % block_size
      if remaining == block_size:
      remaining = 16
      ret = val + chr(remaining).encode() * remaining

      return ret

      def unpkcs7(val, block_size=16):
      pad_amount = val[-1]
      if pad_amount == 0:
      raise Exception
      for i in range(len(val) - 1, len(val) - (pad_amount + 1), -1):
      if val[i] != pad_amount:
      raise Exception
      return val[:-pad_amount]

      def decrypt_aes_cbc(data, key, iv = b'x00' * 16, pad=True):
      prev_chunk = iv

      decrypted = []

      for i in range(0, len(data), 16):
      chunk = data[i : i + 16]
      decrypted += xor(decrypt_aes_ecb(chunk, key), prev_chunk)
      prev_chunk = chunk

      if pad:
      return unpkcs7(bytes(decrypted))
      return bytes(decrypted)

      def encrypt_aes_cbc(data, key, iv = b'x00' * 16, pad=True):
      if pad:
      padded = pkcs7(data)
      else:
      padded = data

      prev_chunk = iv

      encrypted = []

      for i in range(0, len(padded), 16):
      chunk = padded[i : i + 16]
      encrypted_block = encrypt_aes_ecb(xor(chunk, prev_chunk), key)
      encrypted += encrypted_block
      prev_chunk = encrypted_block

      return bytes(encrypted)








      share







      New contributor




      Infuzion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.







      $endgroup$




      I am looking for ways to make this code more "pythonic" and any issues with my implementation. This was designed to solve Crytopal's Challenge 10. This challenge involves recreating the AES-CBC cipher using a library-provided AES-ECB function.



      from Cryptodome.Cipher import AES

      def decrypt_aes_ecb(data, key):
      cipher = AES.new(key, AES.MODE_ECB)
      return cipher.decrypt(data)

      def encrypt_aes_ecb(data, key):
      cipher = AES.new(key, AES.MODE_ECB)
      return cipher.encrypt(data)

      def pkcs7(val, block_size=16):
      remaining = block_size - len(val) % block_size
      if remaining == block_size:
      remaining = 16
      ret = val + chr(remaining).encode() * remaining

      return ret

      def unpkcs7(val, block_size=16):
      pad_amount = val[-1]
      if pad_amount == 0:
      raise Exception
      for i in range(len(val) - 1, len(val) - (pad_amount + 1), -1):
      if val[i] != pad_amount:
      raise Exception
      return val[:-pad_amount]

      def decrypt_aes_cbc(data, key, iv = b'x00' * 16, pad=True):
      prev_chunk = iv

      decrypted = []

      for i in range(0, len(data), 16):
      chunk = data[i : i + 16]
      decrypted += xor(decrypt_aes_ecb(chunk, key), prev_chunk)
      prev_chunk = chunk

      if pad:
      return unpkcs7(bytes(decrypted))
      return bytes(decrypted)

      def encrypt_aes_cbc(data, key, iv = b'x00' * 16, pad=True):
      if pad:
      padded = pkcs7(data)
      else:
      padded = data

      prev_chunk = iv

      encrypted = []

      for i in range(0, len(padded), 16):
      chunk = padded[i : i + 16]
      encrypted_block = encrypt_aes_ecb(xor(chunk, prev_chunk), key)
      encrypted += encrypted_block
      prev_chunk = encrypted_block

      return bytes(encrypted)






      python python-3.x programming-challenge cryptography





      share







      New contributor




      Infuzion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.










      share







      New contributor




      Infuzion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.








      share



      share






      New contributor




      Infuzion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 2 mins ago









      InfuzionInfuzion

      101




      101




      New contributor




      Infuzion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Infuzion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Infuzion is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.




















          0






          active

          oldest

          votes











          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
          );



          );






          Infuzion is a new contributor. Be nice, and check out our Code of Conduct.









          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215904%2fpython-aes-cbc-implementation-using-aes-ecb%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          Infuzion is a new contributor. Be nice, and check out our Code of Conduct.









          draft saved

          draft discarded


















          Infuzion is a new contributor. Be nice, and check out our Code of Conduct.












          Infuzion is a new contributor. Be nice, and check out our Code of Conduct.











          Infuzion is a new contributor. Be nice, and check out our Code of Conduct.














          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%2f215904%2fpython-aes-cbc-implementation-using-aes-ecb%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

          名間水力發電廠 目录 沿革 設施 鄰近設施 註釋 外部連結 导航菜单23°50′10″N 120°42′41″E / 23.83611°N 120.71139°E / 23.83611; 120.7113923°50′10″N 120°42′41″E / 23.83611°N 120.71139°E / 23.83611; 120.71139計畫概要原始内容臺灣第一座BOT 模式開發的水力發電廠-名間水力電廠名間水力發電廠 水利署首件BOT案原始内容《小檔案》名間電廠 首座BOT水力發電廠原始内容名間電廠BOT - 經濟部水利署中區水資源局

          Prove that NP is closed under karp reduction?Space(n) not closed under Karp reductions - what about NTime(n)?Class P is closed under rotation?Prove or disprove that $NL$ is closed under polynomial many-one reductions$mathbfNC_2$ is closed under log-space reductionOn Karp reductionwhen can I know if a class (complexity) is closed under reduction (cook/karp)Check if class $PSPACE$ is closed under polyonomially space reductionIs NPSPACE also closed under polynomial-time reduction and under log-space reduction?Prove PSPACE is closed under complement?Prove PSPACE is closed under union?

          Is my guitar’s action too high? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)Strings too stiff on a recently purchased acoustic guitar | Cort AD880CEIs the action of my guitar really high?Μy little finger is too weak to play guitarWith guitar, how long should I give my fingers to strengthen / callous?When playing a fret the guitar sounds mutedPlaying (Barre) chords up the guitar neckI think my guitar strings are wound too tight and I can't play barre chordsF barre chord on an SG guitarHow to find to the right strings of a barre chord by feel?High action on higher fret on my steel acoustic guitar