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 8. 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.
I recommend you start early.
83f23930588a62d320b04347ef0199bc0676baa62ddd5d20a61c2d9aff5ecf0a72f1ab2416c811e7894582aa6625d7a028b54e78fc8e9079cb92252fba973540bf84eccd488e2ba7735428b6537433f2a1fbaf21e6e9f881a8f17c01007a269d9729ea7b3ca44bf30dce01c6ff725078078698a12f12dbc80bb7aedd565e806a4104c85036bcc814df7df0d30ac0cceb4154065c48e34cff13704202c18a817346b4d00c57 83fa773515d366d42cff1657e64894f26a67b5b16cd7587eed1e3881ba1bca006caaff1a1cd454ae9b098cf33223dda02fb55873e3ddc3798dd60b26b09d395bb791eccd4ccf3bbc6f1a22ff597967bdadbee234a3feb799b2a57c030f3d2095d27de46020e90ee90ccc4cc1ba206a2c4683d9a32e028fc445b7abca500a9d6d4e50877f36bbc81e8a72fc921ac48fea4a47171e27 f5d37c22508a60c861af5747f34482a10a22b3b02dd8522bed53228cff56d00868abab0116db10ae8450ceed6728c1f36ef05f72e29090778dd10b30be912803f691a4cd4bcf2ba03a4e20b64d706ab1efafaa3dbfbaf482b3f370174e3b6996d23cec7b21e315bd06dc1887a73a7c364acbdea235168fda43a5af8f5a0dd4694e1f9f7736a0c65be178f0974485a5be4c5a115c49e356ff47355005dfda9a6846f9964730bbd7f5824645e6f28b5b009de6acfd16287f618b7f3b2da40021eeb0759edfebd21bde491d75a1103b3c209898bfd9d268885cd57eb9b2e887242c58ac58e7b1 e89b743051cf23d570fd5b5da74c99bc422ef2a27999533cae5960c9ab53d81b20abe31a009a03a69b0981ec322c92f32bbd4971f5ddc366c8d10b25a5d9775dae86a4801f872da47f4c2ae4123172eeefacad2daafeb78cadf5700f1c76698fd87df67a2aa44def11cd0987ba3c6d3d0a87ddb32e5bc0cb0bb0b3ca130d956b4c1f9a3536aec208c57de1870dc995be465b175f41b65afc56355419dbc29a6e57f98a4638bbdff18b090580 83fa773515d36cd520af5345eb4d89f2556dbeb568dd1c3bb9036ee3 83e97c3051c36fd93bfd7f04ef4086b70671bdaf7bdc5872a248248cad48990066ffea1d53db16b49c5b9bf97723d7f331f04d78feddc47ec2c71121b8907a5ab288a9df1f8830b67b4e2ae4101b e2d26b3240c770d461b35541f40dd0b34866f2a22dda5920b95d2587ff59d00e73ffe41553d71da98c05cee2733bd7a02eb55d3dfd989062c2921621bd917a47b591a9de5a9c36f373546fe54b727bbdbdb2a63caaffe4c1fde47b0a4e333ddbda3cfb3238e142f144cb0987b73d6c3a128edcf02d13cad943a1a98f5b0b99634e50817771aace0ec365edd30bc482be4c5a0a4359b14df34735421e8fcf9b7244b49f0e32fd94e09a4207e1fec55046caedaaf00d7c6561856a3c63aa4e27e5a72098cdb2861eda105074bc01377d2092ccbddece7dcd4d8766b9b6eb89352c5cad44a7970cc5e9627f66afa4ddb2 e8d5393754c9778c20b55752ee4f97f2496cb1a62ddc4f26ac5e2080ac53dc0b20bce41d1ddf17b38d4dceeb7c2992ec27b7507ffc989075c5d31021b5803f5ca8c9ece51f9c21b268592afa473174fcb9bee239e6eeff82a8e27d1a4e2e26dbc335e73222e15cf844cd05c1b53b7a2d0a9fc1f0351d8fc94eb2bec35c0e9d6c47509c7173a6d25bc37ce49c1ad1c294 83f2777141c2668070af5357e24f84f24563a1a62094553ca959298dff52d74f61b3e75310db07a29b0981ec323ed7e330b54d3de78fd962c4dc056dfb80324bfb83a5de4c9b62a26f5f3ce2577e7dbdbdbea539b4fee4cda9ed704e023b279cc23ce5776feb48bd10c10987b03b6930039983f03c14dd8d5facbe8f430c9d6c4319987573bc8014cc31e79c04d098f7405b48105eac18f652670f50cad9857e40b09f4231e298b4935407feffce140bd2f7a6b316356064846e7220aa5028e5bb26d1d8b9c353d8061e79b607753826c7cca9c9d168c65b8768a7eaa781382908a559ac9b5ad6fe78756ef9a38a94c425b69c1ef7a3569a1f45c83390060532f23c0be49c3f61666a500ad36ad87ad733c28edf e8d5393650c466d261b11a04f34995a04322bbb02dd75372ac50388cad55d81b69a9ee5311cf00e78d519eef6024dfe52ca41935f494c273cec60724f696230eab97a3ce5e8d2bbf734e26f34d3833f2a9fba72ea3e8eecda9ea7b091b3f6990d932f57c6ff041bd0cc00187a43a7678079fccb5370bdbde0bb0b3ca130d9b6e5504817678e3800ec465fd9f48d184fb0f41164548e357fe563541158fcb816f42b0904b39b5be e3ce6d7d15dd6ad468fd424ce20193bb566ab7b12dd75325ed5e298fb049dc4f75aca75312d618e78c4088ec7b2ec7ec36a91974e3ddc273c0dd1425b2d43857fb91a4c91f9c2bb4745b3be34c743dbd9bb3a778b6eff9cdb2eb351a063f698cd82fe63268cf47f9008e4ccea07278281699ddb3331acdc14ee4b2c113109b224f04807c64efcc1ac476e1920fc0ccea47540a1059ab5db0767b441cc6d99d3529 e3ce6d7153c5718074b55f57a7429fbc556bb6a67fd8483ba2526ca0ff48d10075b3ef531bdb02a2c84b8bed672392ed3bf05869e498dd66d9c14237bf80320eaf8da98c6c9f23bd734927b65f7f77bd89a9a736a5f2bbcdbcf6351a063f698fd833e5672af70ef40a891bcfba31717807cbcbb53909cad90babbd8f47169d71001b817772efd714df7df0d305ca9fea0f5b054458b159fc5f6c0318cedc903b41bc9b407decc6fd865342e4b7c94d46dca5b3fa173d7971c8643463b74825a09a2590d7a2d51b9b041173bd5b3b1c31cb85b98cd66cdb13874ee9a7f49323204da00bbdd34997ef63697aadae94ca8521b6d94affe65a964a73863b9a4f0232b9fefb18e4 ab 819b39125ac464d261a94348e65599bd4871fee374d64972a55d3a8cff5cd61b74bae55307d21db4c84f8ff83c6d92c237a41964ff889764c8920c2fa2d43e41b580ecd55a9b63d9 819b39085adf23c361b31642ee4f94f2526ab7e37fdc4f26ed532ac9ab53dc4f68b0e61604d506acc8599ce57021d7ed31f05178e2988a1c 819b393941de73d33af21947f44487b7442ca7a07edd1237a949638ab35aca1c65aca400038844e88b5a8bb82b7c9fe96db84e2cbe8dd470a7For 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()