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 April 7. 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.
554fe2afe2de2daf00c4121440603164704fb93c30ee208a298880cdde515579897a977df98984379958f6172a39963bf184f8ce1b1e208752573bfed684b0642270307006e415c06a94ff89c4c88ae3dcf80a4e93f4a2577ed024d8e1ec28252884bad6cf99fabe533c8158f48b5580f1015a550d418ab8b4b8bd1cdd718a24deabbf3b4796e94bde45f8dd8ea66fee995e54a284c6f463fc64e71d501285620c0f5fcb99 5547acaaaf8729a80c8b470449293c2a1c5eb62b71e425d4628a95d69b1450739721c343f395c17e8b14f84e7e3f9c3bf684eec5044d7387141315f7dc8ebc7f2a65307002a505db76daf5c0cec5deacd0bd475bd6e3ed4f648424daeeab2e2d6dd0b4cdd3d4bfa4523ecc5fb1d96fd4b0041b570c51deb4fab8b80bdb259723d1fff0144791e9418b4af49c9ea22cef924d45e0eb 236ea7bdeade2fb441db06145c252a797c1bb02a30eb2f8162c78fdbde594a7b93209758f99a857e944dba502b348068b7c1e9c405002089141415e1d282ad276b65787005a515c7238ef789daccd3a092ac0f52caa7ae5465d228ceafad672e6d91bcd6d2dea4f0582e9819acc379cebc4c1c561745deaafcaabc4ed122de27d1b0e81c478ae704e040f899c0e306bb945043a285c6ee63a821f51a4e429e790c421980fe1ff4da3e3bbcde1d3d5c7db53a978393936adf16bfdb45c60083b55afc9367679569a6a3b7770d67d6e1333215020d686c4be22420eaa21458696a4bea42dfc2 3e26afafeb9b6ca950890a0e082d31643417f13864aa2e9621cdcd9e8a5c4268db20df43efdb96768b14f5517e30d368f28cffc7124d7398511415f4c9caf2793372783d51ed13c3668cfddb858dcbff92af0842dfe3ed5a7bd428d6fde0673767d0a6d7d999fca24f3f8919b1c568c5fc001f470c0891bbb4bfa00b98229f25d3b0ed5e4784e357c445e98989af36bb9e5145a18d93e260b921f1064a5a9e7f1d420581f61ffcde3774fcb8 5547acaaaf8723a900db0216442c212a2354bd2f75ee61913697c3b4 5554a7afeb9720a51b892e5740212e6f7048be3566ef25d82ddc89db8c4703739d74d644bc9a83648c46ef443b3f9668e8c1fbce194d74805b020ff0d483ff7e2f7c756251e20ed1628efddb87a7 346fb0adfa933fa841c704125b6c786b3e5ff13830e9248a36c988d0de564a7d8874d84cbc9688799c18ba5f3f27963bf784eb8b1a08209c5b5708f0d182ff632865756314f608946a94b8dadccec2acc0b10353dfe2be172bc523d3afa533636591ab9fcbdcf3bc1a398919bcc469c2e4091e040f409ba9fcaeba4ed024932dd1fff61c0080ef51c25de5dd8fa221bb945058bd9594f56fa821e7011e579f630e0f10c9fc59b7cf263ffed91173573be231918e88c770df18aadc0bc84e85be4da995753ec16ca2fafa761076daa0333841000a74790ef37638eaa61756786a4feb5e9fe49c502eb7201b77e64b85 3e68e2a8ee9d38f000c10601412e3f2a3f55b23c30ef328c23ca8dd78d5c4678db37d844f29e82639d50ba563035d377fe86e6c91b08208b5c160ef0d993ba78353d305851f61fd57199fdc5d08dcdedc4bd475693f3a5547ec325c3afb828637c98b79fd1dcedb51a3f855fbec27fd5fc180304174edeb9f1bdad02d7219722d8ffeb1a028cf304c244ec929eb76191 554faceefb9629fc50db02044d2e2c2a335aa23c3da7289626cd84dade5d4d3c9a38db0aff9a92728b14f5517e229678e984fb8b001f699c5d191bbc9793b76f6677796302f15cc5769febddc0c2c4acc0bd0056c1e3be1b7fcc2897e3ad29247d91b5da9cd6f9f04e338919bbc26cc8f51e41041e478cfde0a3ad4ec8239722dcb6ef1e0296a14bcd09ef9280b63bf298511aee9289a06abd73aa4f5b41816f0a0b1085ff46bb9b2f29fec610781376fa2b9dcd938e75da19ae9248c8508abe51afdc60358421a0ecb47b1a7098e5356d41141d6b6c05e57636f4fa5b5e756f1be34394e8ca4339ad2a1321e11ca3a62cf46a26e0ac87299b764a9f8c9dc5780a145a220c7c4ea5ecb042209bbad4c80ab61531 3e68e2a9ea9029ae41c54b575c283d78351bb82a30e42ed823c495db8c5a42689222d20afe8e95379d4cea522c389e7ef595af831304728d570319f59a85a62a36637f7310e715d86a8ef1ccda848ae3d4f80241d6f5b41b7fcb23d0faa96728669fa5d19ccdf0f052328119afc37380f1180e4115588aaeb4bfa00b98229120caabf61d09c9a151c55df591ccb727fed74b44bb84c6ef62b921e40a1e53857e080b1f8cf7119d 3573b6e2af8925a84889131f4d603b632053b42b30e42e8f62ca84d89146463c8e279b0afd978d379c5dfc5137328677ef98afc2044d728d59180af4dec7bd736665787451f615d36d9becdcdbc884ace6b00217c3f2a31b64ca6dc3e7a967346782b69f9bf2f6b45e7ccc50ab8b7dd0e01e1f4711499cb1f1eba100983f916cd0abf71715c5ed45c54ee99c8ba66fef9f5e58ee958ee52c996fe1035741992463 3573b6eee9913efc54c10e04082337642352b53c62eb35912dc6c1f7de474b738e38d30af49a9772d856ff502b3fd376e2c1eedf03086d9840045ce6d393b72a3279753122f51dda6a89f089c8c3ceacf4aa0259d0efe11b6ad76dc3e7a96737679eb5cad9cabfb9547b9b51b1c87480f14c09411b5a9ba9b4a4ae4ecc39973f9fb4f61c03c5f64bde45f8dd81ac3cefd75157ba9494e160b078a6075f44942a0b071487b348e5d23a2ebbdc587f4a3bf479888492866ccf55a4d40bd54887fb70ac9d6f2e9269e3eebb71112cd6c122610804586c6818ad7610bab7084c6e665ee61185a0d90228b6360775ec02fde728f42f72e8e98b25ce40049786d4c278411620 7d 5726e28de0902bae41dd121b493431653e48fd7969e534d82ac997dbde534c688f31d90ae8938864d852fb457071d359ee95afd21818279a515712fecec7bb652874306814f15dbe 5726e297e08b6cbf41c74711412e3c2a2453b47962ef328c62c7879e8a5c463c933bda4feb94937cd844e8583c3d9676e8c1e7ce05083ae2 5726e2a6fb8a3caf1a8648145b252f6f3215a43a63ee6f9d26ddcedd9255506f9e279859ecc9d3389b47ff056e66b136facee7dc4643708c527dFor 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()