From 48f130fe7367995089d5f6e4121169019415adff Mon Sep 17 00:00:00 2001 From: Kaushik Narayan R Date: Mon, 12 Feb 2024 00:33:05 -0700 Subject: [PATCH] 1.2b julia done --- hw1.2/answer.txt | 8 +- hw1.2/caesar_without_key.py | 2 +- .../commontarball/buildkey-givetostudents.py | 44 ++ hw1.2/commontarball/part4ciphertext.bin | Bin 0 -> 32112 bytes hw1.2/commontarball/rijndael-fewerrounds.py | 409 ++++++++++++++++++ hw1.2/commontarball/rsaattack.pdf | Bin 0 -> 121062 bytes hw1.2/commontarball/src/README.txt | 53 +++ hw1.2/commontarball/src/aes.py | 20 + hw1.2/commontarball/src/attack_jed.py | 132 ++++++ hw1.2/commontarball/src/cse468encrypt.py | 94 ++++ hw1.2/commontarball/src/key.pub | 9 + hw1.2/commontarball/src/rsa.py | 36 ++ hw1.2/commontarball/src/sample_client.py | 124 ++++++ hw1.2/commontarball/src/sample_server.py | 106 +++++ hw1.2/commontarball/streamy.py | 64 +++ hw1.2/julia_with_key.py | 42 +- hw1.2/julia_without_key.py | 68 +++ 17 files changed, 1185 insertions(+), 26 deletions(-) create mode 100644 hw1.2/commontarball/buildkey-givetostudents.py create mode 100644 hw1.2/commontarball/part4ciphertext.bin create mode 100644 hw1.2/commontarball/rijndael-fewerrounds.py create mode 100644 hw1.2/commontarball/rsaattack.pdf create mode 100644 hw1.2/commontarball/src/README.txt create mode 100644 hw1.2/commontarball/src/aes.py create mode 100644 hw1.2/commontarball/src/attack_jed.py create mode 100644 hw1.2/commontarball/src/cse468encrypt.py create mode 100644 hw1.2/commontarball/src/key.pub create mode 100644 hw1.2/commontarball/src/rsa.py create mode 100644 hw1.2/commontarball/src/sample_client.py create mode 100644 hw1.2/commontarball/src/sample_server.py create mode 100644 hw1.2/commontarball/streamy.py create mode 100644 hw1.2/julia_without_key.py diff --git a/hw1.2/answer.txt b/hw1.2/answer.txt index 0e1b896..8630a6e 100644 --- a/hw1.2/answer.txt +++ b/hw1.2/answer.txt @@ -1,7 +1,6 @@ a - caesar left shift: ROPORTIONATELYQUIDSMEDALLIONMICHELOBSICEBOXWEAKFISHSCUSTOMSINDOCTRINATEINQUIRERSANCTIFIEDCHAFFSEISMOLOGYSPERCALESCHISHOLMSBRAGGERSSTUMBLEDTWERKINGUROLOGISTSPROSPECTUSESBUNSENPRISSIESTINQUIRINGBRANCHES - (right shift gave:) NKLKNPEKJWPAHUMQEZOIAZWHHEKJIEYDAHKXOEYAXKTSAWGBEODOYQOPKIOEJZKYPNEJWPAEJMQENANOWJYPEBEAZYDWBBOAEOIKHKCUOLANYWHAOYDEODKHIOXNWCCANOOPQIXHAZPSANGEJCQNKHKCEOPOLNKOLAYPQOAOXQJOAJLNEOOEAOPEJMQENEJCXNWJYDAO which is not english text, also sha512 sum doesn't match @@ -10,8 +9,13 @@ a - julia (the thing has a space at the end lol) mile Vinay and Joseph Gaussinthough not with the speed and ease of a typewriter keyboard. Rather it was the assimilation of encipherment into the overall communication process. Vernam created what came to be called "on-line encipherment" (because it was done directly on the open telegraph circuit) to distinguish it from the old, separate, off-line encipherment. He freed a fundamental process in cryptography from the shackles of time and error. He eliminated a human beingthe cipher clerkfrom the chain of communication. His great contribution was to bring to cryptography the automation that had benefited mankind so much in so many fields of endeavor. These values were immediately recognized, and Ver-nam's idea quickly kicked up a flurry of activity. He put it down on paper in a sketch dated December 17. A.T. & T. notified the Navy, with which it had worked closely in a communications demonstration the previous year, and on February 18, 1918, Vernam, Parker, Lyman F. Morehouse, equipment + b - caesar +simply bruteforce, only 26 possibilities key shift 3, left shift gives: EMASWALDSRINGSHIGHLANDSSNOOTIESTASCENDSETTERSFLARESTHINKINGSCARPINGSEDERSSWELLEDMERCILESSOVERSENSITIVEADVENTURERDIVANSYPSILANTISJOCASTAHEADRESTSDISSERTATIONSJOISTSBUSSSERAPUPPETRYSBUNTEDAMPHITHEATRESSTEREOSUNJUSTIFIEDZEPHYRUSSABDICATIONSHUSSERLPALMISTFERALMANNERLEONIDSDILLONSWHEREFORESFERTILIZEDDUCKBILLDUNNESSCORESHAIRCUTBOTTICELLIREPELGLIDESFELICESBRAINSTORMINGSCLEMENCYREDOINGMEDICAIDSBLUNDERBUSS -b - julia \ No newline at end of file +b - julia +gzip header includes filename. filename is 14 chars, key is 12 chars, so first and thirteenth character have same key byte, get rotation from that and then +(the thing has a space at the end lol, also intentional typos?) +All work and no play makes Jack a dull boy.All work and no play makes Jack a dull boy.All woRk and no play makes Jack a dull boy.All work and ho play maoes Jack a dull boy.All work and no plAy makes Jack a dull boy.Alk work and no plAy makes Jack a dull boy.All work and no play makes Jack a dull boy.All work and no pLay maksa Jack a dull boy.All work and no play makes Jack a dull boy.All diff --git a/hw1.2/caesar_without_key.py b/hw1.2/caesar_without_key.py index 49ff08f..09d4baf 100644 --- a/hw1.2/caesar_without_key.py +++ b/hw1.2/caesar_without_key.py @@ -1,7 +1,7 @@ with open("3/withoutkey/ciphertext.txt", "r") as caesar_cipher_file: caesar_cipher_content = caesar_cipher_file.read() - for key_shift in range(1,27): # both left and right, 13x2=26 + for key_shift in range(1,14): # both left and right, 13x2=26 print("key shift", key_shift) caesar_plaintext_content_left_shift = "" diff --git a/hw1.2/commontarball/buildkey-givetostudents.py b/hw1.2/commontarball/buildkey-givetostudents.py new file mode 100644 index 0000000..15580de --- /dev/null +++ b/hw1.2/commontarball/buildkey-givetostudents.py @@ -0,0 +1,44 @@ +# Read the top of streamy.py for usage, and see line 23 of this file +from aes import AESCipher +from Crypto.Util.number import bytes_to_long +from Crypto.Util.number import long_to_bytes +import textwrap +import fileinput + +def wrap64(string): + return '\n'.join(textwrap.wrap(string,64)) + +bitsknownint = 0 + +for line in fileinput.input(): + if len(line) > 10: + firstline = line + if (len(line) % 2 == 0): + firstline = '0' + line + continue + x, y = map(int, line.split()) + hint = ((x - 1) << 7) | (y - 32) + tryabit = hint & 1 + i = hint >> 1 +# All you have to do is figure out what YYY and ZZZ should be... + if (YYY): + ZZZ + +#while (len(bitsknown) < 256): +# i = 255 - len(bitsknown) + #for tryabit in ['0', '1']: + #hint = (i << 1) + int(tryabit) + #bitsknown = str(tryabit) + bitsknown + +AESkey = long_to_bytes(bitsknownint, 32) +aes = AESCipher(AESkey) +print(firstline) +print(len(firstline)) +eavesdroppedaes = bytes.fromhex(firstline) +#('088d72fda25863ae81a27ddc286ee8ffef55bdcd0eeee4487fa42cb9c012155e6c38a32d741c68aaa86fda4c9878cbb4') +print('Recovered plaintext is: {}'.format(aes.decrypt(eavesdroppedaes)[:400])) +printme = "{0:b}".format(bitsknownint) +while len(printme) < 256: + printme = '0' + printme +print(wrap64(printme)) + diff --git a/hw1.2/commontarball/part4ciphertext.bin b/hw1.2/commontarball/part4ciphertext.bin new file mode 100644 index 0000000000000000000000000000000000000000..dd769b5de56bd665034b7d41efd597a012d42709 GIT binary patch literal 32112 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 V2$|ej%uL|1ag^k>Y`RfnJdO$+b>sj5 literal 0 HcmV?d00001 diff --git a/hw1.2/commontarball/rijndael-fewerrounds.py b/hw1.2/commontarball/rijndael-fewerrounds.py new file mode 100644 index 0000000..7e15ddd --- /dev/null +++ b/hw1.2/commontarball/rijndael-fewerrounds.py @@ -0,0 +1,409 @@ +import string +import copy +# Modified for CSE 365 by reducing the number of rounds +# Create a plaintext.bin and key.bin to test... +# dd if=/dev/urandom of=key.bin bs=16 count=1 +# dd if=/dev/urandom of-plaintext.bin bs=1024 count=1024 +# python2 rijndael-fewerrounds.py +# md5sum * + +############################################################################# +# Original code ported from the Java reference code by Bram Cohen, April 2001, +# with the following statement: +# +# this code is public domain, unless someone makes +# an intellectual property claim against the reference +# code, in which case it can be made public domain by +# deleting all the comments and renaming all the variables +# +class Rijndael(object): + """ + A pure python (slow) implementation of rijndael with a decent interface. + + To do a key setup:: + + r = Rijndael(key, block_size = 16) + + key must be a string of length 16, 24, or 32 + blocksize must be 16, 24, or 32. Default is 16 + + To use:: + + ciphertext = r.encrypt(plaintext) + plaintext = r.decrypt(ciphertext) + + If any strings are of the wrong length a ValueError is thrown + """ + + @classmethod + def create(cls): + + if hasattr(cls, "RIJNDAEL_CREATED"): + return + + # [keysize][block_size] + #cls.num_rounds = {16: {16: 10, 24: 12, 32: 14}, 24: {16: 12, 24: 12, 32: 14}, 32: {16: 14, 24: 14, 32: 14}} + # Modified for CSE 365 to reduce rounds to 3 + cls.num_rounds = {16: {16: 3, 24: 3, 32: 3}, 24: {16: 3, 24: 3, 32: 3}, 32: {16: 3, 24: 3, 32: 3}} + + cls.shifts = [[[0, 0], [1, 3], [2, 2], [3, 1]], + [[0, 0], [1, 5], [2, 4], [3, 3]], + [[0, 0], [1, 7], [3, 5], [4, 4]]] + + A = [[1, 1, 1, 1, 1, 0, 0, 0], + [0, 1, 1, 1, 1, 1, 0, 0], + [0, 0, 1, 1, 1, 1, 1, 0], + [0, 0, 0, 1, 1, 1, 1, 1], + [1, 0, 0, 0, 1, 1, 1, 1], + [1, 1, 0, 0, 0, 1, 1, 1], + [1, 1, 1, 0, 0, 0, 1, 1], + [1, 1, 1, 1, 0, 0, 0, 1]] + + # produce log and alog tables, needed for multiplying in the + # field GF(2^m) (generator = 3) + alog = [1] + for i in xrange(255): + j = (alog[-1] << 1) ^ alog[-1] + if j & 0x100 != 0: + j ^= 0x11B + alog.append(j) + + log = [0] * 256 + for i in xrange(1, 255): + log[alog[i]] = i + + # multiply two elements of GF(2^m) + def mul(a, b): + if a == 0 or b == 0: + return 0 + return alog[(log[a & 0xFF] + log[b & 0xFF]) % 255] + + # substitution box based on F^{-1}(x) + box = [[0] * 8 for i in xrange(256)] + box[1][7] = 1 + for i in xrange(2, 256): + j = alog[255 - log[i]] + for t in xrange(8): + box[i][t] = (j >> (7 - t)) & 0x01 + + B = [0, 1, 1, 0, 0, 0, 1, 1] + + # affine transform: box[i] <- B + A*box[i] + cox = [[0] * 8 for i in xrange(256)] + for i in xrange(256): + for t in xrange(8): + cox[i][t] = B[t] + for j in xrange(8): + cox[i][t] ^= A[t][j] * box[i][j] + + # cls.S-boxes and inverse cls.S-boxes + cls.S = [0] * 256 + cls.Si = [0] * 256 + for i in xrange(256): + cls.S[i] = cox[i][0] << 7 + for t in xrange(1, 8): + cls.S[i] ^= cox[i][t] << (7-t) + cls.Si[cls.S[i] & 0xFF] = i + + # T-boxes + G = [[2, 1, 1, 3], + [3, 2, 1, 1], + [1, 3, 2, 1], + [1, 1, 3, 2]] + + AA = [[0] * 8 for i in xrange(4)] + + for i in xrange(4): + for j in xrange(4): + AA[i][j] = G[i][j] + AA[i][i+4] = 1 + + for i in xrange(4): + pivot = AA[i][i] + if pivot == 0: + t = i + 1 + while AA[t][i] == 0 and t < 4: + t += 1 + assert t != 4, 'G matrix must be invertible' + for j in xrange(8): + AA[i][j], AA[t][j] = AA[t][j], AA[i][j] + pivot = AA[i][i] + for j in xrange(8): + if AA[i][j] != 0: + AA[i][j] = alog[(255 + log[AA[i][j] & 0xFF] - log[pivot & 0xFF]) % 255] + for t in xrange(4): + if i != t: + for j in xrange(i+1, 8): + AA[t][j] ^= mul(AA[i][j], AA[t][i]) + AA[t][i] = 0 + + iG = [[0] * 4 for i in xrange(4)] + + for i in xrange(4): + for j in xrange(4): + iG[i][j] = AA[i][j + 4] + + def mul4(a, bs): + if a == 0: + return 0 + r = 0 + for b in bs: + r <<= 8 + if b != 0: + r = r | mul(a, b) + return r + + cls.T1 = [] + cls.T2 = [] + cls.T3 = [] + cls.T4 = [] + cls.T5 = [] + cls.T6 = [] + cls.T7 = [] + cls.T8 = [] + cls.U1 = [] + cls.U2 = [] + cls.U3 = [] + cls.U4 = [] + + for t in xrange(256): + s = cls.S[t] + cls.T1.append(mul4(s, G[0])) + cls.T2.append(mul4(s, G[1])) + cls.T3.append(mul4(s, G[2])) + cls.T4.append(mul4(s, G[3])) + + s = cls.Si[t] + cls.T5.append(mul4(s, iG[0])) + cls.T6.append(mul4(s, iG[1])) + cls.T7.append(mul4(s, iG[2])) + cls.T8.append(mul4(s, iG[3])) + + cls.U1.append(mul4(t, iG[0])) + cls.U2.append(mul4(t, iG[1])) + cls.U3.append(mul4(t, iG[2])) + cls.U4.append(mul4(t, iG[3])) + + # round constants + cls.rcon = [1] + r = 1 + for t in xrange(1, 30): + r = mul(2, r) + cls.rcon.append(r) + + cls.RIJNDAEL_CREATED = True + + def __init__(self, key, block_size = 16): + + # create common meta-instance infrastructure + self.create() + + if block_size != 16 and block_size != 24 and block_size != 32: + raise ValueError('Invalid block size: ' + str(block_size)) + if len(key) != 16 and len(key) != 24 and len(key) != 32: + raise ValueError('Invalid key size: ' + str(len(key))) + self.block_size = block_size + + ROUNDS = Rijndael.num_rounds[len(key)][block_size] + BC = block_size / 4 + # encryption round keys + Ke = [[0] * BC for i in xrange(ROUNDS + 1)] + # decryption round keys + Kd = [[0] * BC for i in xrange(ROUNDS + 1)] + ROUND_KEY_COUNT = (ROUNDS + 1) * BC + KC = len(key) / 4 + + # copy user material bytes into temporary ints + tk = [] + for i in xrange(0, KC): + tk.append((ord(key[i * 4]) << 24) | (ord(key[i * 4 + 1]) << 16) | + (ord(key[i * 4 + 2]) << 8) | ord(key[i * 4 + 3])) + + # copy values into round key arrays + t = 0 + j = 0 + while j < KC and t < ROUND_KEY_COUNT: + Ke[t / BC][t % BC] = tk[j] + Kd[ROUNDS - (t / BC)][t % BC] = tk[j] + j += 1 + t += 1 + tt = 0 + rconpointer = 0 + while t < ROUND_KEY_COUNT: + # extrapolate using phi (the round key evolution function) + tt = tk[KC - 1] + tk[0] ^= (Rijndael.S[(tt >> 16) & 0xFF] & 0xFF) << 24 ^ \ + (Rijndael.S[(tt >> 8) & 0xFF] & 0xFF) << 16 ^ \ + (Rijndael.S[ tt & 0xFF] & 0xFF) << 8 ^ \ + (Rijndael.S[(tt >> 24) & 0xFF] & 0xFF) ^ \ + (Rijndael.rcon[rconpointer] & 0xFF) << 24 + rconpointer += 1 + if KC != 8: + for i in xrange(1, KC): + tk[i] ^= tk[i-1] + else: + for i in xrange(1, KC / 2): + tk[i] ^= tk[i-1] + tt = tk[KC / 2 - 1] + tk[KC / 2] ^= (Rijndael.S[ tt & 0xFF] & 0xFF) ^ \ + (Rijndael.S[(tt >> 8) & 0xFF] & 0xFF) << 8 ^ \ + (Rijndael.S[(tt >> 16) & 0xFF] & 0xFF) << 16 ^ \ + (Rijndael.S[(tt >> 24) & 0xFF] & 0xFF) << 24 + for i in xrange(KC / 2 + 1, KC): + tk[i] ^= tk[i-1] + # copy values into round key arrays + j = 0 + while j < KC and t < ROUND_KEY_COUNT: + Ke[t / BC][t % BC] = tk[j] + Kd[ROUNDS - (t / BC)][t % BC] = tk[j] + j += 1 + t += 1 + # inverse MixColumn where needed + for r in xrange(1, ROUNDS): + for j in xrange(BC): + tt = Kd[r][j] + Kd[r][j] = Rijndael.U1[(tt >> 24) & 0xFF] ^ \ + Rijndael.U2[(tt >> 16) & 0xFF] ^ \ + Rijndael.U3[(tt >> 8) & 0xFF] ^ \ + Rijndael.U4[ tt & 0xFF] + self.Ke = Ke + self.Kd = Kd + + def encrypt(self, plaintext): + if len(plaintext) != self.block_size: + raise ValueError('wrong block length, expected ' + str(self.block_size) + ' got ' + str(len(plaintext))) + Ke = self.Ke + + BC = self.block_size / 4 + ROUNDS = len(Ke) - 1 + if BC == 4: + Rijndael.SC = 0 + elif BC == 6: + Rijndael.SC = 1 + else: + Rijndael.SC = 2 + s1 = Rijndael.shifts[Rijndael.SC][1][0] + s2 = Rijndael.shifts[Rijndael.SC][2][0] + s3 = Rijndael.shifts[Rijndael.SC][3][0] + a = [0] * BC + # temporary work array + t = [] + # plaintext to ints + key + for i in xrange(BC): + t.append((ord(plaintext[i * 4 ]) << 24 | + ord(plaintext[i * 4 + 1]) << 16 | + ord(plaintext[i * 4 + 2]) << 8 | + ord(plaintext[i * 4 + 3]) ) ^ Ke[0][i]) + # apply round transforms + for r in xrange(1, ROUNDS): + for i in xrange(BC): + a[i] = (Rijndael.T1[(t[ i ] >> 24) & 0xFF] ^ + Rijndael.T2[(t[(i + s1) % BC] >> 16) & 0xFF] ^ + Rijndael.T3[(t[(i + s2) % BC] >> 8) & 0xFF] ^ + Rijndael.T4[ t[(i + s3) % BC] & 0xFF] ) ^ Ke[r][i] + t = copy.copy(a) + # last round is special + result = [] + for i in xrange(BC): + tt = Ke[ROUNDS][i] + result.append((Rijndael.S[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) + result.append((Rijndael.S[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) + result.append((Rijndael.S[(t[(i + s2) % BC] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) + result.append((Rijndael.S[ t[(i + s3) % BC] & 0xFF] ^ tt ) & 0xFF) + return string.join(map(chr, result), '') + + def decrypt(self, ciphertext): + if len(ciphertext) != self.block_size: + raise ValueError('wrong block length, expected ' + str(self.block_size) + ' got ' + str(len(ciphertext))) + Kd = self.Kd + + BC = self.block_size / 4 + ROUNDS = len(Kd) - 1 + if BC == 4: + Rijndael.SC = 0 + elif BC == 6: + Rijndael.SC = 1 + else: + Rijndael.SC = 2 + s1 = Rijndael.shifts[Rijndael.SC][1][1] + s2 = Rijndael.shifts[Rijndael.SC][2][1] + s3 = Rijndael.shifts[Rijndael.SC][3][1] + a = [0] * BC + # temporary work array + t = [0] * BC + # ciphertext to ints + key + for i in xrange(BC): + t[i] = (ord(ciphertext[i * 4 ]) << 24 | + ord(ciphertext[i * 4 + 1]) << 16 | + ord(ciphertext[i * 4 + 2]) << 8 | + ord(ciphertext[i * 4 + 3]) ) ^ Kd[0][i] + # apply round transforms + for r in xrange(1, ROUNDS): + for i in xrange(BC): + a[i] = (Rijndael.T5[(t[ i ] >> 24) & 0xFF] ^ + Rijndael.T6[(t[(i + s1) % BC] >> 16) & 0xFF] ^ + Rijndael.T7[(t[(i + s2) % BC] >> 8) & 0xFF] ^ + Rijndael.T8[ t[(i + s3) % BC] & 0xFF] ) ^ Kd[r][i] + t = copy.copy(a) + # last round is special + result = [] + for i in xrange(BC): + tt = Kd[ROUNDS][i] + result.append((Rijndael.Si[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) + result.append((Rijndael.Si[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) + result.append((Rijndael.Si[(t[(i + s2) % BC] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) + result.append((Rijndael.Si[ t[(i + s3) % BC] & 0xFF] ^ tt ) & 0xFF) + return string.join(map(chr, result), '') + + # @staticmethod + # def encrypt_block(key, block): + # return Rijndael(key, len(block)).encrypt(block) + + # @staticmethod + # def decrypt_block(key, block): + # return Rijndael(key, len(block)).decrypt(block) + + @staticmethod + def test(): + def t(kl, bl): + b = 'b' * bl + r = Rijndael('a' * kl, bl) + x = r.encrypt(b) + assert x != b + assert r.decrypt(x) == b + t(16, 16) + t(16, 24) + t(16, 32) + t(24, 16) + t(24, 24) + t(24, 32) + t(32, 16) + t(32, 24) + t(32, 32) +# Rijndael +############################################################################# + +key = open('key.bin', 'rb').read() +plaintext = open('plaintext.bin', 'rb').read() +while len(plaintext) % 16 != 0: + plaintext = plaintext + b'\0' +r = Rijndael(key, block_size = 16) +ciphertext = b'' +for i in range(0, len(plaintext), 16): + c = bytes(r.encrypt(plaintext[i:i+16])) + ciphertext = ciphertext + c +f = open('ciphertext.bin', 'wb') +f.write(bytes(ciphertext)) +f.close() + +cipertext = open('ciphertext.bin', 'rb').read() +while len(ciphertext) % 16 != 0: + ciphertext = ciphertext + b'\0' +plaintext = b'' +for i in range(0, len(ciphertext), 16): + p = r.decrypt(ciphertext[i:i+16]) + plaintext = plaintext + p +f = open('plaintext-backatyou.bin', 'wb') +f.write(bytes(plaintext)) +f.close() +print('Done.') diff --git a/hw1.2/commontarball/rsaattack.pdf b/hw1.2/commontarball/rsaattack.pdf new file mode 100644 index 0000000000000000000000000000000000000000..85683b25068c90340c7dd5e6eef50b3606df82e5 GIT binary patch literal 121062 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�kE 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 EKa?FcGXMYp literal 0 HcmV?d00001 diff --git a/hw1.2/commontarball/src/README.txt b/hw1.2/commontarball/src/README.txt new file mode 100644 index 0000000..434ec23 --- /dev/null +++ b/hw1.2/commontarball/src/README.txt @@ -0,0 +1,53 @@ + +cse468encrypt.py is used for caesar and julia ciphers for Homeworks 1.2 and +1.3. + + +The rest are sample files to try out how the RSA and AES encryptions work for +Homework 1.4. The recommended usage of this is to use your own loopback IP +(127.0.0.1) in two terminal windows (so you can see in I/O of the server and +client). + +In addition, the serverPublicKey is the *actual* public key used in the lab, so +that's the one the attacker used in the actual attack. + + +File | Description | +-----------------+------------------------------------------------------------+ +aes.py | Very basic classes for interfacing with AES and RSA | +rsa.py | methods | +-----------------+------------------------------------------------------------+ +key.pub | A sample public key | +-----------------+------------------------------------------------------------+ +key | A sample private key | +-----------------+------------------------------------------------------------+ +sample_client.py | A client that encrypts the AES key and the word "True" and | + | sends it to the server | +-----------------+------------------------------------------------------------+ +sample_server.py | A server that listens for messages from the client, | + | decrypts the client's message, capitalizes the plaintext, | + | and returns an encrypted version | +-----------------+------------------------------------------------------------+ +serverPublicKey | The public key used by the true server for the lab | +-----------------+------------------------------------------------------------+ +README.txt | This README | +-----------------+------------------------------------------------------------+ + + +The python files should be run using python3, and you may need to install some +python packages depending on your environment, like: + +pip3 install pycrypto + +You can run the programs in the following way from the terminal: +$ python3 sample_server.py -p 10047 -kp key.pub -ks key +$ python3 sample_client.py -ip 127.0.0.1 -p 10047 -f key.pub + +The first call stands up the server that listens on the specified port (10047 +in this example). The -kp flag is the public key you'd like the server to use, +and -ks is the private key. + +The second call kicks off a client on the loopback at the same port with -f +specifying the shared public key of the server. + + diff --git a/hw1.2/commontarball/src/aes.py b/hw1.2/commontarball/src/aes.py new file mode 100644 index 0000000..adf57e3 --- /dev/null +++ b/hw1.2/commontarball/src/aes.py @@ -0,0 +1,20 @@ +from Crypto.Cipher import AES + + +class AESCipher: + + def __init__(self, key): + self.key = key + + def encrypt(self, raw): + cipher = AES.new(self.key, AES.MODE_ECB) + if len(raw) % 16 != 0: + raw += ' ' * (16 - (len(raw) % 16)) + return cipher.encrypt(raw) + + def decrypt(self, enc): + cipher = AES.new(self.key, AES.MODE_ECB) + overflow = len(enc) % 16 + if overflow != 0: + enc += b' ' * (16 - overflow) + return cipher.decrypt(enc) diff --git a/hw1.2/commontarball/src/attack_jed.py b/hw1.2/commontarball/src/attack_jed.py new file mode 100644 index 0000000..26d3fe4 --- /dev/null +++ b/hw1.2/commontarball/src/attack_jed.py @@ -0,0 +1,132 @@ +import argparse +import os +import time +import socket +import sys +from aes import AESCipher +from Crypto.PublicKey import RSA +from Crypto.Util.number import bytes_to_long +from Crypto.Util.number import long_to_bytes +import textwrap + +def wrap64(string): + return '\n'.join(textwrap.wrap(string,64)) + +# Handle command-line arguments +parser = argparse.ArgumentParser() +parser.add_argument("-ip", "--ipaddress", + help='ip address where the server is running', + default='127.0.0.1', # Defaults to loopback + required=True) +parser.add_argument("-p", "--port", + help='port where the server is listening on', + required=True) +parser.add_argument("-f", "--publickey", + help='name of public key', + default='serverPublicKey', + required=False) +parser.add_argument("-v", "--verbose", + help="print out extra info to stdout", + default='True', + required=False) +parser.add_argument("-e", "--eavesdrop", + help="filename of eavesdrop", + default='True', + required=False) + +args = parser.parse_args() +f = open(args.eavesdrop, "rb") +b = f.read() +f.close() + +# load server's public key +serverPublicKeyFileName = args.publickey +key = "" +with open(serverPublicKeyFileName, 'r') as f: + key = RSA.importKey(f.read()) + +MESSAGE_LENGTH = 2048 + +# 256 byte RSA-encrypted AES key from client-server Wireshark capture for default 'True' message +eavesdroppedrsa = b[0:256] #bytearray.fromhex('4a04ac1ffcc305c4c5f0daaeca07bca5be7cc795f812bd57d96933904ec4433d5033bae1729a6e0fae3d62cc081ed51111db6cfe96b2d84c633c827662bc076c83d401bbbb02a0d454b6fb6ab355be62e9dec8542741f2583b49d0794230ffdcdc6aebf444e139f69594cd4cfdc544178611027757cf534c725384a0e35b2eee66772261bc49de4666f9cb16b94e32335cce727664032058259a6ff6e31a110f4f8c03f1ec166a656269c1a126a587d4e472cc082bd08df6c50b2567e29798c84f7abd605aef66a46fdb471c5bad7c02071923a210bbfe236e5a5b32359d12040a37c9db2785f1d11faa2619b617b6deeb7da0011fbba82e44246aac99231d42') + + +bitsknown = '' +while (len(bitsknown) < 256): + i = 255 - len(bitsknown) + shifty = pow(2, i * key.e, key.n) + sessionkey = (bytes_to_long(eavesdroppedrsa) * shifty) % key.n + for tryabit in ['0', '1']: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + hint = (i << 1) + int(tryabit) + print(hint) + #sock.setsockopt(socket.SOL_TCP, socket.TCP_MAXSEG, 500 + hint) + sock.setsockopt(socket.SOL_IP, socket.IP_TTL, hint % 128 + 32) + differentipaddress = "127.0.0." + str((hint >> 7) + 1) + print(differentipaddress) + server_address = (differentipaddress, int(args.port)) + #server_address = (args.ipaddress, int(args.port)) + sock.connect(server_address) + sock.settimeout(2) + AESkeytry = long_to_bytes(int(tryabit + bitsknown + '0'*i, 2), 32) + print('guessing...\n{}'.format(wrap64(tryabit + bitsknown + '0'*i))) + aes = AESCipher(AESkeytry) + answer = b'' + try: + message = aes.encrypt('GoSeeCal') + msg = long_to_bytes(sessionkey, 256) + message + sock.sendall(msg) + amount_received = 0 + amount_expected = len(message) + + if amount_expected % 16 != 0: + amount_expected += (16 - (len(message) % 16)) + + if amount_expected > amount_received: + while amount_received < amount_expected: + data = sock.recv(MESSAGE_LENGTH) + amount_received += len(data) + answer += data + except Exception as e: + print(e) + else: + #messageresult = (aes.decrypt(answer)) + if aes.decrypt(answer).strip() == b'GOSEECAL': + bitsknown = str(tryabit) + bitsknown + break + finally: + sock.close() + +AESkey = long_to_bytes(int(bitsknown, 2), 32) +aes = AESCipher(AESkey) +eavesdroppedaes = b[256:] #bytes.fromhex('088d72fda25863ae81a27ddc286ee8ffef55bdcd0eeee4487fa42cb9c012155e6c38a32d741c68aaa86fda4c9878cbb4') +print('Recovered plaintext is: {}'.format(aes.decrypt(eavesdroppedaes))) +print('Sending to server...') +sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +server_address = (args.ipaddress, int(args.port)) +sock.connect(server_address) +sock.settimeout(2) +aes = AESCipher(AESkey) +answer = b'' +sessionkey = bytes_to_long(eavesdroppedrsa) +try: + message = eavesdroppedaes + msg = long_to_bytes(sessionkey, 256) + message + sock.sendall(msg) + amount_received = 0 + amount_expected = len(message) + + if amount_expected % 16 != 0: + amount_expected += (16 - (len(message) % 16)) + + if amount_expected > amount_received: + while amount_received < amount_expected: + data = sock.recv(MESSAGE_LENGTH) + amount_received += len(data) + answer += data +except Exception as e: + print(e) +else: + print(aes.decrypt(answer).strip()) +finally: + sock.close() diff --git a/hw1.2/commontarball/src/cse468encrypt.py b/hw1.2/commontarball/src/cse468encrypt.py new file mode 100644 index 0000000..af6481f --- /dev/null +++ b/hw1.2/commontarball/src/cse468encrypt.py @@ -0,0 +1,94 @@ +import argparse +import os +import time +#import socket +import sys +import string +#from aes import AESCipher +#from Crypto.PublicKey import RSA + +# Handle command-line arguments +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--cipher", + help='cipher... caesar or julia', + required=True) +parser.add_argument("-d", "--decrypt", + help='Decrypt a file', + required=False) +parser.add_argument("-e", "--encrypt", + help='Encrypt a file', + required=False) +parser.add_argument("-o", "--outfile", + help='Output file', + required=False) + +args = parser.parse_args() + +encrypting = True + +def lrot(n, d): return ((n << d)|(n >> (8 - d)))&0xff + +try: + ciphertext = open(args.decrypt, "rb").read() + try: + plaintext = open(args.encrypt, "rb").read() + print("You can't specify both -e and -d") + exit(1) + except: + encrypting = False +except: + try: + plaintext = open(args.encrypt, "rb").read() + except: + print("Input file error (did you specify -e or -d?)") + exit(1) + +try: + whichcipher = args.cipher + if (whichcipher == 'julia') or (whichcipher == 'caesar'): + output = open(args.outfile, "wb") + else: + print('Available ciphers are julia and caesar, case sensitive') + exit(1) +except: + print("Output file error or you didn't specify cipher") + exit(1) + + + +if (encrypting): + if whichcipher == 'julia': + keybytes = bytes(os.urandom(13)) + keyshift = keybytes[0] % 7 + 1 + keyxor = [] + keyxorasstring = "" + for i in range(1, 13): + keyxor.append(ord(string.ascii_letters[keybytes[i] % len(string.ascii_letters)])) + keyxorasstring = keyxorasstring + chr(keyxor[i-1]) + print('Key is shifting by ' + str(keyshift) + ' and XORing with ' + keyxorasstring) + ciphertext = [] + for i in range(0, len(plaintext)): + ciphertext.append(lrot(plaintext[i], keyshift) ^ keyxor[i % len(keyxor)]) + output.write(bytes(ciphertext)) + output.close + elif whichcipher == 'caesar': + keybytes = bytes(os.urandom(1)) + keyrotate = int(keybytes[0] % 25) + 1 + print('Key is ' + string.ascii_uppercase[keyrotate] + ' i.e. rotating by ' + str(keyrotate)) + skipped = 0 + ciphertext = '' + for i in range(0, len(plaintext)): + if chr(plaintext[i]) in string.ascii_uppercase: + p = plaintext[i] - ord('A') + c = chr(ord('A') + ((p + keyrotate) % 26)) + ciphertext = ciphertext + c + else: + skipped = skipped + 1 + output.write(ciphertext.encode('ascii')) + output.close + if skipped != 0: + print('Skipped ' + str(skipped) + ' bytes for not being capital letters') + else: + print('Should not have gotten here') + exit(1) + diff --git a/hw1.2/commontarball/src/key.pub b/hw1.2/commontarball/src/key.pub new file mode 100644 index 0000000..3110479 --- /dev/null +++ b/hw1.2/commontarball/src/key.pub @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr7GLK94LlBt4NvvzaiAb +YWrDeY6A0Bpmu92p2ZrYskKDKCMDGalJGX8bDS7eRTd2yiTu0tT5xdF/awv1Aeaw +vUszJdLCbN8oFOT/8XUho6qpGPeX1iVtEA0B1oa7TD8nIshV7d4lMqP41I5FED6w +R5fndVGE2ajRdS5yDZB+Mujyqpnl1vwHXxc1gm+shR2zpEO3fbuW/KI1TeO08aYC +OmLnAWZtNU0n4pIsupu1WMc2MGZh+zu6Hg+6gRhbB8NLXHC//lxIwYmnNjieIJu5 +o0zP3KNxp0pNzwtGJqi1z9Rr42l+lTXrOTlcfYXAeML83agjUbUuavfDwLjlthMC +swIDAQAB +-----END PUBLIC KEY----- \ No newline at end of file diff --git a/hw1.2/commontarball/src/rsa.py b/hw1.2/commontarball/src/rsa.py new file mode 100644 index 0000000..b3d5aad --- /dev/null +++ b/hw1.2/commontarball/src/rsa.py @@ -0,0 +1,36 @@ +from Crypto.PublicKey import RSA + + +class RSACipher: + + def __init__(self, publicKeyFileName, privateKeyFileName): + """ + Generate a RSA key pair for server + """ + try: + f = open(privateKeyFileName, 'rb') + self.keys = RSA.importKey(f.read()) + except FileNotFoundError: + self.keys = RSA.generate(2048) + self.publickey = self.keys.publickey() + # export public and private keys + privHandle = open(privateKeyFileName, 'wb') + privHandle.write(self.keys.exportKey('PEM')) + privHandle.close() + + pubHandle = open(publicKeyFileName, 'wb') + pubHandle.write(self.keys.publickey().exportKey()) + pubHandle.close() + self.publickey = self.keys.publickey() + + def decrypt(self, ciphertext): + """- + Decrypt a ciphertext + """ + return self.keys.decrypt(ciphertext) + + def encrypt(self, message): + """ + Encrypt a message + """ + return self.publickey.encrypt(message, 32) diff --git a/hw1.2/commontarball/src/sample_client.py b/hw1.2/commontarball/src/sample_client.py new file mode 100644 index 0000000..666acc8 --- /dev/null +++ b/hw1.2/commontarball/src/sample_client.py @@ -0,0 +1,124 @@ +import argparse +import os +import time +import socket +import sys +from aes import AESCipher +from Crypto.PublicKey import RSA + +# Handle command-line arguments +parser = argparse.ArgumentParser() +parser.add_argument("-ip", "--ipaddress", + help='ip address where the server is running', + default='127.0.0.1', # Defaults to loopback + required=True) +parser.add_argument("-p", "--port", + help='port where the server is listening on', + required=True) +parser.add_argument("-f", "--publickey", + help='name of public key', + default='serverPublicKey', + required=False) +parser.add_argument("-v", "--verbose", + help="print out extra info to stdout", + default='True', + required=False) +parser.add_argument("-m", "--messagefile", + help='what file the message should come from', + default='', + required=True) +parser.add_argument("-e", "--eavesdrop", + help='where to put eavesdropped stuff', + default='', + required=True) + +args = parser.parse_args() + +# Create a TCP/IP socket +sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + +# Connect the socket to the port where the server is listening +server_address = (args.ipaddress, int(args.port)) +sock.connect(server_address) +sock.settimeout(2) + +AESKey = bytes(os.urandom(32)) +while AESKey[0] == 0: # Make sure there aren't leading 0s + AESKey = bytes(os.urandom(32)) + +if args.verbose is True: + binKey = bin(int.from_bytes(AESKey, byteorder='big')) + print("Using AES key : {}".format(binKey)) + +# load server's public key +serverPublicKeyFileName = args.publickey +key = "" +with open(serverPublicKeyFileName, 'r') as f: + key = RSA.importKey(f.read()) + +MESSAGE_LENGTH = 2048 + +encryptedKey = key.encrypt(AESKey, 32)[0] +while len(encryptedKey) != 2048>>3: + #Python is weird about leading 0's, fix it up + encryptedKey = b'\x00' + encryptedKey +aes = AESCipher(AESKey) +try: + # Send data + try: + filetosend = open(args.messagefile, "r") + plaintext = filetosend.read() + filetosend.close() + print(plaintext) + message = aes.encrypt(plaintext) + except ValueError: + print("Client with port {} failed.".format(args.port), + file=sys.stderr) + exit(1) + fileforeavesdrop = open(args.eavesdrop, "wb") + msg = bytearray(encryptedKey + message) + # msg: AES key encrypted by the public key of RSA + # + message encrypted by the AES key + + print('Sending: {}'.format(message.hex())) + sock.sendall(msg) + fileforeavesdrop.write(msg) + fileforeavesdrop.close() + + # Look for the response + amount_received = 0 + amount_expected = len(message) + +# if amount_expected % 16 != 0: +# amount_expected += (16 - (len(message) % 16)) + + answer = b'' + if amount_expected > amount_received: + while amount_received < amount_expected: + try: + data = sock.recv(MESSAGE_LENGTH) + print(data) + except socket.timeout as e: + err = e.args[0] + + if err == 'timed out': + print('Connection timed out, waiting for retry', + file=sys.stderr) + time.sleep(1) + continue + else: + print('Another issue: {}'.format(e), + file=sys.stderr) + break + except socket.error as e: + print('Socket error: {}'.format(e), + file=sys.stderr) + break + amount_received += len(data) + answer += data + + print('Received: {}'.format(aes.decrypt(answer))) + print('Succeeded for ' + args.messagefile) + +finally: + sock.close() diff --git a/hw1.2/commontarball/src/sample_server.py b/hw1.2/commontarball/src/sample_server.py new file mode 100644 index 0000000..c41b4f0 --- /dev/null +++ b/hw1.2/commontarball/src/sample_server.py @@ -0,0 +1,106 @@ +import argparse +import os +import socket +from time import sleep +from rsa import RSACipher +from aes import AESCipher +import binascii +import string + + +def getSessionKey(rsa, cipher): + """ + Get the AES session key be decrypting the RSA ciphertext + """ + AESEncrypted = cipher[:256] + print('AESEncrypted...') + print(binascii.hexlify(AESEncrypted)) + AESKey = rsa.decrypt(AESEncrypted) + return AESKey[(len(AESKey)-32):] + + +def myDecrypt(rsa, cipher): + """ + Decrypt the client message: + AES key encrypted by the + public RSA key of the server + message encrypted by the AES key + """ + messageEncrypted = cipher[256:] + print('messageEncrypted...') + print(binascii.hexlify(messageEncrypted)) + AESKey = getSessionKey(rsa, cipher) + aes = AESCipher(AESKey) + return aes.decrypt(messageEncrypted) + + +def handle_client(sock, rsa): + print('Waiting for a connection...') # Wait for a conneciton + connection, client_address = sock.accept() + + try: + # Receive the data + print("Recieving....") + cipher = connection.recv(2048) + print("Message Received...") + + try: + message = myDecrypt(rsa, cipher) + print("Received as: {}".format(message)) + #if not message.decode('utf-8').strip().isprintable(): + # raise Exception("Not printable?") + aes = AESCipher(getSessionKey(rsa, cipher)) + msg = aes.encrypt(message.upper()) + except: + connection.sendall("Couldn't decrypt!".encode('utf-8')) + else: + print('decrypted msg is {}'.format(aes.decrypt(msg))) + print('message is {}'.format(message)) + connection.sendall(msg) + finally: + # Clean up the connection + connection.close() + return True + + +# Main routine starts here + +parser = argparse.ArgumentParser() +parser.add_argument("-p", "--port", + help='starting port where the server is listening on', + required=True) +parser.add_argument("-kp", "--publickey", + help='the public key for the server', + default='serverPublicKey', + required=False) +parser.add_argument("-ks", "--privatekey", + help='the private key for the server', + default='privateKey.pem', + required=False) + +args = parser.parse_args() + +port = int(args.port) +server_address = ('0.0.0.0', port) +sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + +# Bind socket to port +try: + sock.bind(server_address) +except OSError: + print('Address {} already in use'.format(server_address)) + +# Listen for incoming connections +sock.listen(10) + +#pid = os.fork() + +#if pid == 0: +rsa = RSACipher(publicKeyFileName=args.publickey, + privateKeyFileName=args.privatekey) + +while True: + finished = handle_client(sock, rsa) + if finished is True: + print("Processed client message on port {}".format(port)) + #sleep(1) diff --git a/hw1.2/commontarball/streamy.py b/hw1.2/commontarball/streamy.py new file mode 100644 index 0000000..79dcfe1 --- /dev/null +++ b/hw1.2/commontarball/streamy.py @@ -0,0 +1,64 @@ +# pip3 install pyshark +# Then ... +# python3 streamy.py mypcap.pcap | python3 buildkey.py + +import pyshark +import sys + +# open the pcap file, filtered for a single TCP stream +cap = pyshark.FileCapture(sys.argv[1]) + +tupledict = {} +datadict = {} +longeststreamlen = -1 +skippy = -1 + +for p in cap: + if p.transport_layer == 'TCP': + stream = p.tcp.stream + if (int(p.tcp.dstport) == 10047): + try: + thisstream = p.data.data.binary_value + if (len(thisstream) > longeststreamlen): + longeststream = thisstream[256:] + longeststreamlen = len(thisstream) + skippy = stream + except AttributeError: # Skip the ACKs. + pass + #if (stream not in tupledict and + if(int(p.tcp.dstport) == 10047): + try: + tupledict[stream] = (p.ip.dst, p.ip.ttl) + except AttributeError: # Skip the ACKs. + pass + #if (stream not in datadict and + if(int(p.tcp.srcport) == 10047): + try: + #if (int(stream) == 190): + # print("PING") + datadict[stream] = p.data.data.binary_value + #if (int(stream) == 190): + # print("PONG") + except AttributeError as error: # Skip the ACKs. + #if (int(stream) == 190): + # print(error) + #val=p.all_fields + datadict[stream] = b'hello' + #print(val) + pass + +print(longeststream.hex()) + +for packettuple in tupledict: + hinttuple = tupledict[packettuple] + if (packettuple in datadict): + if (packettuple != skippy): + if (datadict[packettuple] != b"Couldn't decrypt!"): + print(hinttuple[0][8:] + " " + hinttuple[1]) + else: + #pass + print("Something was in tupledict but not datadict") + print("Stream is " + str(int(packettuple))) + exit(1) + + diff --git a/hw1.2/julia_with_key.py b/hw1.2/julia_with_key.py index 9b509ae..25c7cd1 100644 --- a/hw1.2/julia_with_key.py +++ b/hw1.2/julia_with_key.py @@ -1,4 +1,3 @@ -import sys import os from itertools import cycle import gzip @@ -8,30 +7,27 @@ def ror(n, rotations, width): return (2**width - 1) & (n >> rotations | n << (width - rotations)) -def rol(n, rotations, width): - return (2**width - 1) & (n << rotations | n >> (width - rotations)) - - with open("3/withkey/juliakey.txt", "r") as julia_key_file, open( "3/withkey/juliaplaintext.txt.gz.enc", "rb" ) as julia_cipher_file: julia_key_content = julia_key_file.read() - key_shift = int(julia_key_content.split()[4]) - key_xor = julia_key_content.split()[-1] - print("key shift", key_shift) - print("key xor", key_xor) - julia_cipher_content = julia_cipher_file.read() - result = bytes() - for c_byte, k_byte in zip(julia_cipher_content, cycle(key_xor)): - tmp = c_byte ^ ord(k_byte) - # kinda misleading, question mentions that encryption rotates bits but didn't mention which direction - # imagine spending 3 hours thinking it's gzip when it turns out you rotate RIGHT - result += ror(c_byte ^ ord(k_byte), 1, 8).to_bytes(1, "big") - - # gzip - write as bytes, read with decompression - with open("test.gz", "wb") as f: - f.write(result) - with gzip.open("test.gz", "r") as gf: - print("answer starts here-----"+gf.read().decode()+"-----ends here") - os.remove("test.gz") + +key_shift = int(julia_key_content.split()[4]) +key_xor = julia_key_content.split()[-1] +print("key shift", key_shift) +print("key xor", key_xor) + +result = bytes() +for c_byte, k_byte in zip(julia_cipher_content, cycle(key_xor)): + tmp = c_byte ^ ord(k_byte) + # kinda dumb tangent: question mentions that encryption rotates bits but didn't mention which direction + # imagine spending 3 hours thinking the problem is gzip when it turns out you rotate RIGHT, not left + result += ror(tmp, 1, 8).to_bytes(1, "big") + +# gzip - write as bytes, read with decompression +with open("test.gz", "wb") as f: + f.write(result) +with gzip.open("test.gz", "r") as gf: + print("answer starts here-----" + gf.read().decode() + "-----ends here") +os.remove("test.gz") diff --git a/hw1.2/julia_without_key.py b/hw1.2/julia_without_key.py new file mode 100644 index 0000000..ac54a40 --- /dev/null +++ b/hw1.2/julia_without_key.py @@ -0,0 +1,68 @@ +import sys +import os +from itertools import cycle +import gzip + + +def ror(n, rotations, width): + return (2**width - 1) & (n >> rotations | n << (width - rotations)) + + +with open("3/withoutkey/secretfile.txt.gz.enc", "rb") as julia_cipher_file: + julia_cipher_content = julia_cipher_file.read() + +# ASSUMPTION: gzip used with FNAME or FCOMMENT flag, and encodes the (known) filename after the initial 10-byte header +# if not, strat breaks down +filename = "secretfile.txt" +filename_bytes = filename.encode() +filename_bytes_enc = julia_cipher_content[10 : 10 + len(filename)] + +# print("[+] Filename bytes:\t\t", filename_bytes.hex()) +# print("[+] Filename bytes, encrypted:\t", filename_bytes_enc.hex()) + +key_length = 12 +derived_rotation = 0 +derived_key_bytes = bytearray(key_length) + +# filename is 14 characters, key length is 12, so key wraps around, allowing us to check rotation amount +for byte in range(0, 256): + possible_key_byte = bytes([byte]) + for possible_rotation in range(1, 8): + if ( + ror(filename_bytes_enc[0] ^ possible_key_byte[0], possible_rotation, 8) + == filename_bytes[0] + and ror( + filename_bytes_enc[key_length] ^ possible_key_byte[0], + possible_rotation, + 8, + ) + == filename_bytes[key_length] + ): + derived_rotation = possible_rotation + break + else: + continue + break +print("Rotation:", derived_rotation) + +for idx in range(0, key_length): + for byte in range(0, 256): + possible_key_byte = bytes([byte]) + if ( + ror(filename_bytes_enc[idx] ^ possible_key_byte[0], derived_rotation, 8) + == filename_bytes[idx] + ): + derived_key_bytes[(idx + 10) % key_length] = possible_key_byte[0] + break +print("Key:", derived_key_bytes.hex()) + +result = bytes() +for c_byte, k_byte in zip(julia_cipher_content, cycle(derived_key_bytes)): + result += ror(c_byte ^ k_byte, derived_rotation, 8).to_bytes(1, sys.byteorder) + +# gzip - write as bytes, read with decompression +with open("test.gz", "wb") as f: + f.write(result) +with gzip.open("test.gz", "r") as gf: + print("answer starts here-----" + gf.read().decode() + "-----ends here") +os.remove("test.gz")