CSE 291E, Fall 2020
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 13. 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.

90a36058d8889e94d193c3792280636dbdacb72743125cff9ca88c5c8ee4b30e35b977a3d90d1768eb3e0e72be811c788d5bdafc76f61f5b4a07d9d6e9247a108db15f4c0a616cf14711cc53d385b60d4da2da6c2f214d8bafee04d00f065edd58c3d563a2e2b03461470bf32340f12890d09dfa391cc1f39f37b943ecf3265b6dd30e445d8d69d667bee569789241ebd26c97655d2aea55b17e8250ee14e5309feaf81d4b
90ab2e5d95d19a93dddc96692bc96e23d1bdb830021859a1d7aa9947cba1b6042be2239dd3115221f972002bea8716788a5bccf769a54c5b0c43f7dfe32e760b85a45f4c0e207cea5b5fc61ad988e24241e797796a360293b5ba04d2004158d51d97db78beaff52e604546f46612cb7cd1d5dcf8380c95ffd137bc54eaa73b5c6287416b5d8a69dc32b1e928689602ead97f862732
e682254ad0889c8f908cd7793ec57870b1f8be31431753f4d7e7834a8eecac0c2fe37786d91e1621e62b4235bf8c0a2bcb1ecbf668e81f550c44f7c9ed226753c4a4174c09206cf60e0bc453cd81ef4e03f6df7076724188b4ec08c6414711d61dd6d363bfa5ee7a6a5512b27b08dd66dd9ddbf9231895e1d725b811e0a0725862c859635d91679959bbe52d36d728bedf6280655c2af055e53b9057f044fe2b9fa7be562cdbab17a251ee04c8dd6451137a473a7bbcd4060b9b4c6cc35314af5fb6b5902912311bdf97cb01f128d6fa8c3db4251f8085bcca88afd1591f6ab66a91ff46e0
fbca2d58d1cddf9281dedb636acd636df9f4ff23175652e394edc10fdae9a41f67e33f9dcf5f0529f9720d34ea88592b8e53ddf57fa54c444944f7dcf66a380d9cb317015d686af24b09ce0192c0f71103f5d86063360286aaea08de130a11cf1797c962b4e2b6287d4403b2660ecc6d9dd1d8e83855daf09f30a454a9a0335a60c85c215d9f63ca7dbef43d7f9b18bed5638666547ffc56f43b944bf45cfe2d8ea7a25724dba313ab1eae62
90ab2e5d95d19092d18cd37b26cc7323eeb7b33406121de483b7cf25
90b82558d1c1939ecadeff3a22c17c66bdabb02e151359ad98fc854adcf2e50421b7369a9c1e103bfe201721af871c2b941ed9fc74a54b5c4352edd8eb23350a80bd1a5e5d6777e04f0bce0190ea
f183325ac0c58c939090d57f398c2a62f3bcff23431558ff83e984418ee3ac0a34b738929c121b26ee7e423aab9f1c788b5bc9b977e01f404307ead8ee22351787a41a5f187371a547118b00cb83fe4251ebd371633751cbfafb03db414f459b15d6c42aa6a7b936284203b26b0fcd6a85d8d9ab3b1dd0e2d721be11e1a63f52628747631a9b6fcc7ba6f86979960fbedf629b7a4c78eb59e53b824ca051ff319deab71f2e9de802ba55ac03c4936f174471413760e8ce06058e4b22cd1d12a448e3b3827046341f86daca1ce02497fa8669b6220395c0ad9890afd55a117bb66e90e306c65c168c586732e6976f35
fb84605fd4cb8bcbd196d76c23ce6d23f2b6bc2743134ef996ea8146dde9a00f67f4389ad21a113cef364233a48d59348259c4fb76e01f574446ecd8e633700c9afc5f645d7366e45c1cce1fc7c0f10355e797742f264a88affd05cb41525e9b0cdfd82abca7a73f28440ff46909db7d9dc9c4ab231395f2da32a95de6a33b5d6b875a65189773997bbff12668834f94
90a32e19c1c09ac7818cd3692fce7e23feb9ac274e5b54e393ed884b8ee8ab4b26fb3bd4df1e012df9720d34ea9a1c3b955bd9b96df756404549f994a8337d1bc9b6165f0e7425f45b1ad807d78ff84251e7d0747d3651c7aef2089f0d475fdc0dd6da6ff1adb37a7c4803b26c09c86094cf86ab2a1ac7b6cb2ca911f9a13b5d6fce5e61188d21d674f2f226768215f7d363d9294b65be5cf069cf02e547e13d99eeb7532d82e456b343ac1cc5982b5a5c6b4d747ba1cb03048a0561cd031da454e5fa977b03791d9094c716e666d2fcd369a2351c80cbbb989eb189161976b33a98fe0dca0a059b426d3ab0903813e4624726a89c20141c2ce53c23f2cc22b7bd54bdb214743c1f682930bb1b7e7090735cf0a1
fb84605ed0c69a9590929a3a3ec86f71f8f8b631431852ad96e4994adcefa41f2ee132d4de0a0668ef2a1237b880143d894a8db17eec4d514f53fbdda5256c5e99a2104f1c626ce9470bc216cdc9b60d45a2d2636a205bc7aef503d8144311d016d8ca64f1b6ba7a60490bb27808d72890c9c9ee2105c1e59f30a454a9a03d5f79d3476213d221cc7ca6e8253a8309fb9c79877c5d2af154f43b8147a055e52c9beeb85a25d5c2
f09f341595df969399dec2722f80696aedb0ba30431852fad7ea8849c1f3a04b32e47bd4dd131e68ee3b0434a38a0c3493478df069a54d514148e8dce1677707c9a417485d736ce2401edf06cc85b84277ead2357f274cc7b5f44dcb094311cc17c5d92af689bc3e6c0746fb7c40d97881cfd8e82514d7fada64a55fa9bd3d1363d346680fde6dd87cb5f4287d9241ead46c9b294c62fb1ad475844ee947f976f0
f09f3419d3c78dc78596df696ac3656deeb1bb27111749e498e6cd668ef2ad0432fb33d4d41e042daa300735bf8759359e1ecced6ee052445854beceec337d5e9db81a0d2e7064eb470cc353df8ef24265f0d27b6c3a0ec7bbe94dcb094311cf17d9da7fb4b1f533660011fa6603d028909dceee2f07d0e29f2baa11fdbb3b402ccc476319de76d667bee569779812ea9c63947d4d78ff56fd62c34ae142f47898e2b351618cba1fa644e9068d9f72175239583d7aa9d21648804322d01b10e175e6bb986015315e929bcd1dba28f6ebdf20b2701b84d6f398b8ffc4450b6dba7f9dac1c8219448a59712ee49d264da5664763fc9465181079d3722bf88525b7f656c7
b8
92ca607adac69895908ac3762bd4636cf3abf3621a1948ad9fe99b4a8ee6aa1f33f239d4c8171b3baa340320e4c9591a924a8de075f018464907f0d6f167711187b55f541874248f
92ca6060dadddf849090967c23ce6e23e9b0ba6211134ef9d7e78b0fdae9a04b2ff83a91cb100023aa22103da8851c35941ec5fc68e0053e
92ca6051c1dc8f94cbd1997939c57d66fff6aa21101213e893fdc24cc2e0b61822e47892dd4d4267e9210760f3d8543dc856daa834f55b5226
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()