'''
In this project you will implement two encryption/decryption systems, one using AES in CBC mode and another using AES in counter mode (CTR). In both cases the 16-byte encryption IV is chosen at random and is prepended to the ciphertext. For CBC encryption we use the PKCS5 padding scheme discussed in class (13:50).
While we ask that you implement both encryption and decryption, we will only test the decryption function. In the following questions you are given an AES key and a ciphertext (both are hex encoded) and your goal is to recover the plaintext and enter it in the input boxes provided below.
For an implementation of AES you may use an existing crypto library such as PyCrypto (Python), Crypto++ (C++), or any other. While it is fine to use the built-in AES functions, we ask that as a learning experience you implement CBC and CTR modes yourself.
'''
from cryptography.hazmat .primitives import serialization
from cryptography.hazmat .primitives .asymmetric import padding
from cryptography.hazmat .backends import default_backend
import base64
plaintext = '20260225022803Aa123456'
public_key_pem = '''-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt68LZ9gaZGKsJJ0ipbtk
KHKarXSwElY2hZikQTa+9YZ6LlOQFA+HLkk/s9CpZsMBenibvENl7Qg8/turgKr7
vwfPDf6cIp05cApxwSFsEQhlEGulAuG6fo3IdtWS65w9eHWKIjYaSLxkn0OPxcKu
86OWo8rGutq3gtB6f1tjNF31D8TpYvYB+H1fJgCz2fckTg4oocFr8iWtti+ZpnZD
zafJ8qblT3Dy9gHptabRj2d9FZR9BfPeziYo/aLqSmo0psVvA1PkG0H6MEuWZfN2
dHQRmka3i/CeCrGr/j/gaULBZg7TOsJdMzG6e7AP/MnfSFrgkIUSoDkKUvGNA616
QwIDAQAB
-----END PUBLIC KEY-----'''
public_key = serialization.load_pem_public_key ( public_key_pem.encode ( ) , backend= default_backend( ) )
encrypted = public_key.encrypt ( plaintext.encode ( 'utf-8' ) , padding.PKCS1v15 ( ) )
print ( base64 .b64encode ( encrypted) .decode ( 'ascii' ) )
JycnCkluIHRoaXMgcHJvamVjdCB5b3Ugd2lsbCBpbXBsZW1lbnQgdHdvIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBzeXN0ZW1zLCBvbmUgdXNpbmcgQUVTIGluIENCQyBtb2RlIGFuZCBhbm90aGVyIHVzaW5nIEFFUyBpbiBjb3VudGVyIG1vZGUgKENUUikuIEluIGJvdGggY2FzZXMgdGhlIDE2LWJ5dGUgZW5jcnlwdGlvbiBJViBpcyBjaG9zZW4gYXQgcmFuZG9tIGFuZCBpcyBwcmVwZW5kZWQgdG8gdGhlIGNpcGhlcnRleHQuIEZvciBDQkMgZW5jcnlwdGlvbiB3ZSB1c2UgdGhlIFBLQ1M1IHBhZGRpbmcgc2NoZW1lIGRpc2N1c3NlZCBpbiBjbGFzcyAoMTM6NTApLiAKCldoaWxlIHdlIGFzayB0aGF0IHlvdSBpbXBsZW1lbnQgYm90aCBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uLCB3ZSB3aWxsIG9ubHkgdGVzdCB0aGUgZGVjcnlwdGlvbiBmdW5jdGlvbi4gSW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgeW91IGFyZSBnaXZlbiBhbiBBRVMga2V5IGFuZCBhIGNpcGhlcnRleHQgKGJvdGggYXJlIGhleCBlbmNvZGVkKSBhbmQgeW91ciBnb2FsIGlzIHRvIHJlY292ZXIgdGhlIHBsYWludGV4dCBhbmQgZW50ZXIgaXQgaW4gdGhlIGlucHV0IGJveGVzIHByb3ZpZGVkIGJlbG93LiAKCkZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBBRVMgeW91IG1heSB1c2UgYW4gZXhpc3RpbmcgY3J5cHRvIGxpYnJhcnkgc3VjaCBhcyBQeUNyeXB0byAoUHl0aG9uKSwgQ3J5cHRvKysgKEMrKyksIG9yIGFueSBvdGhlci4gV2hpbGUgaXQgaXMgZmluZSB0byB1c2UgdGhlIGJ1aWx0LWluIEFFUyBmdW5jdGlvbnMsIHdlIGFzayB0aGF0IGFzIGEgbGVhcm5pbmcgZXhwZXJpZW5jZSB5b3UgaW1wbGVtZW50IENCQyBhbmQgQ1RSIG1vZGVzIHlvdXJzZWxmLiAKJycnCgpmcm9tIGNyeXB0b2dyYXBoeS5oYXptYXQucHJpbWl0aXZlcyBpbXBvcnQgc2VyaWFsaXphdGlvbgpmcm9tIGNyeXB0b2dyYXBoeS5oYXptYXQucHJpbWl0aXZlcy5hc3ltbWV0cmljIGltcG9ydCBwYWRkaW5nCmZyb20gY3J5cHRvZ3JhcGh5Lmhhem1hdC5iYWNrZW5kcyBpbXBvcnQgZGVmYXVsdF9iYWNrZW5kCmltcG9ydCBiYXNlNjQKCnBsYWludGV4dCA9ICcyMDI2MDIyNTAyMjgwM0FhMTIzNDU2JwpwdWJsaWNfa2V5X3BlbSA9ICcnJy0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDY4TFo5Z2FaR0tzSkowaXBidGsKS0hLYXJYU3dFbFkyaFppa1FUYSs5WVo2TGxPUUZBK0hMa2svczlDcFpzTUJlbmlidkVObDdRZzgvdHVyZ0tyNwp2d2ZQRGY2Y0lwMDVjQXB4d1NGc0VRaGxFR3VsQXVHNmZvM0lkdFdTNjV3OWVIV0tJallhU0x4a24wT1B4Y0t1Cjg2T1dvOHJHdXRxM2d0QjZmMXRqTkYzMUQ4VHBZdllCK0gxZkpnQ3oyZmNrVGc0b29jRnI4aVd0dGkrWnBuWkQKemFmSjhxYmxUM0R5OWdIcHRhYlJqMmQ5RlpSOUJmUGV6aVlvL2FMcVNtbzBwc1Z2QTFQa0cwSDZNRXVXWmZOMgpkSFFSbWthM2kvQ2VDckdyL2ovZ2FVTEJaZzdUT3NKZE16RzZlN0FQL01uZlNGcmdrSVVTb0RrS1V2R05BNjE2ClF3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLScnJwoKcHVibGljX2tleSA9IHNlcmlhbGl6YXRpb24ubG9hZF9wZW1fcHVibGljX2tleShwdWJsaWNfa2V5X3BlbS5lbmNvZGUoKSwgYmFja2VuZD1kZWZhdWx0X2JhY2tlbmQoKSkKZW5jcnlwdGVkID0gcHVibGljX2tleS5lbmNyeXB0KHBsYWludGV4dC5lbmNvZGUoJ3V0Zi04JyksIHBhZGRpbmcuUEtDUzF2MTUoKSkKcHJpbnQoYmFzZTY0LmI2NGVuY29kZShlbmNyeXB0ZWQpLmRlY29kZSgnYXNjaWknKSk=