CSE 207B, Fall 2023
Homework 1: Many-time pad

Each line of the ascii plaintext has been encrypted by xoring with the same randomly generated key pad, then encoded in hex. Your task is to decrypt as much of it as possible. You should at least be able to get the entire last line.

Please submit your code and writeup to Gradescope before class on October 10. Your code should be named hw1-sol.py, and your writeup should be named hw1-solutions.pdf. You may discuss this assignment in small groups with classmates, but please code and write up your solutions yourself. Please credit any collaborators you discussed with and any references you used.

Start early! This assignment will take longer than you think.

8c04b30d37b54216c664bc881c47a8ad212d8bb4f122191d21b4f5bdd83ef1888ce4881a2bcb011b1f967c7beb58d5af391b5707acdd3b4a1529729dafa89145d50353b3c8b1419b11a3dd6d165643e993bec87c6339a1409e5c244840288e6b50c1eecbbdff83eb45402f7047bb15cf9955cd143e9baf2e173844cbff8cdbc002
8400e30424b40c00cf78fe881549a8e52b318ea3b66617156ea2fcb4d815ceaccff5821c36d64e1b148d7c3eee409cbf3d061401e3d72957106c6196afa88e59df5759b69cac4799119b9c4d4c5649eb94a1ce706b24ad45d2152d41593f916449cdefd1bdf69efe0441306f54ef14c19b40cd1c70d8be28066d41dda3ea
821aaf1565e30c12cf6ff3cd1c5cfce22863a6a0b434191a60aeeef88f15d0ac8ce48616369f4c4c1c916d7beb58d5bd20010410a6d76629
ef3a902d69f20c0ac36eb0ca074cb8f46e2988a6b4225c5923b3e9b99614d1e9caee82537ff1421b2e966b33a26d92bd360b0e4ae4936a29
9a1db70465b10c0fc365e4dd004dfce2286386bda134151164aeeeb1971e82a8c2e5d0102dcd44540e8a7c22ae0cb7bd3b031216e3d22b40143c749dafa88a43d50351ac9bb14c8c58a1c76d42174de29bb1c43e7e6da747941931093c
8511e30837bf5a078a69f8cd525cb4e43c379ee0a223061c6fe0f0b19415d1e9d8eed00730da44495d86613cea588cf52b010f49a2d03a4651246599aff98b4ac25759a79be5419755aad770421243f496a0d87c7921b1019b1263535e28dc7252cbe4daf9b099e54842352a49a95ce69854995d1ddeba22173413e9ec92c68269289c81eb
8c12b70937f05c03d96ef9c61508a8e53c2c92aab966151765acf8ab8b50d1accff4821a2cc60d5815866b30f10c94b63c481501aadd2f03183f738daeecde4a905055adc5ad468b43e292760d1a45e087b3cd71642ee84687193053163d9d764e888a
a511e31b24a30c07d97effda064db8ad3a2cc7acf1361c0c72a8bdaa9d03c7a8dee298533ede4e52118a7c22a25b9dbd2a0d570ca6933f42026c7497a7ecde43d5034bba9da94dde42bed77006565eef90f2dc7f7928ba4f9d132d07463f937354c0e9d1fab0d3ee4847286e06bc09d087499f09729baf29526c5bc1ada3cd97783297c893b62853d6f8f8289e54fcccedb7ce1f
ac1ae30929b958078a7ae2c70758fce228638aaca52e151460b4f4bb991c82abdee0991d31de4e485d886634f542d5b92b48030ca6932b4c15292d9ab9ed9f40d5514ffbe2
8b1bb14c31b84942cc74e2db0608b4e23b31cbeda52e155962b2e4a88c1fc5bbcdf198162acc0d481886653ee60c80b6391f1616a6930a461227658aebff9f5890464ab086e55d9654bcd73068
991ca61565b84314cf6ff5cc5249aee23b2d83edb028501c6fafefb59705d1e9d8e0921f3d9f4c5519c37b2bed4790f839481b05add43d42162920baaeeb954ec20354b48ce5479b47abc03e0a134bf591fcb7
991ca61565a35c0dc178b0c71408aff93c2686a0f125190969a5efabd450d1acc0e7dd173ddc44561c976d3fa24b90b63d1a1610acc13b0f51276e99bbfb9f48db034ab49aac489045bd9e3e181358e8d5b9d3767a21ad45951963574422886a5ecbecccb1b084e24d4d2f7e5fef0ccf9e48990e7eb1
8f11a00720a20c0dc86ef5da044db8a16e2f88bea5687a
991ca61565a34f10cb6afccd1608aff4232188a1a2661f1721a7efb9881882b9cdf19501749f5d540f866c7bed5a90aa780b1809b3c63c46036c708aa2e68a44c5574ff9c8a4479a11addd70161f44f29aa7ce75746dba44941931555329dc715284f4d7f8b09bf9494c2a6f06a01a808343950970d4b56606705684e296da9c602399cbc1a72a54c5bddf35874fa1af
c7
ed54e32f2abe4b10cb69e5c4135cb5e22030cbeda829055969a1ebbdd817cdbdd8e49e532cd744485d856929ac0cd59a2d1c571dacc66f51146c6e97bfa89a44de461cac8db108f4
ed54e3352aa50c01cb73b0ce1b46b8ad3a2b82eda323030d21affbf88c18c7e9c4ee9d162fd05f505d937a34e04090b52b481f01b1d67229
ed54e30431a45c119032bfcb014dabe82c6d92aea2225e1c65b5b2bb9411d1bac9f2df15398d1e141e906d69b21bb7f539471f13f29c20544062709cad82
For reference, the ciphertext was generated using the following Python 3 program, adapted from Dan Boneh.
import os

MSGS = open("hw1-message.txt").readlines()

def bytexor(a, b):     # xor two byte arrays (trims the longer input)
    return bytes([x ^ y for (x,y) in zip (a,b)])

def random(size=16):
    return os.urandom(size)

def encrypt(key, msg):
    c = bytexor(key, msg)
    print(c.hex())
    return c

def main():
    key = random(1024)
    ciphertexts = [encrypt(key, msg.encode('utf-8')) for msg in MSGS]
    return ciphertexts

if __name__=='__main__':
    main()