ALL the CTFS of Crypto2025 finally
This commit is contained in:
211
crypto-simmetric/long-secret-message/attack.py
Normal file
211
crypto-simmetric/long-secret-message/attack.py
Normal file
@ -0,0 +1,211 @@
|
||||
#!/usr/bin/env python3
|
||||
import numpy
|
||||
from string import *
|
||||
with open("./hacker-manifesto.enc") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
for i in range(len(lines)):
|
||||
lines[i] = bytes.fromhex(lines[i])
|
||||
|
||||
#shortest_line = min(lines,key=len)
|
||||
#min_len = len(shortest_line)
|
||||
longest_line = max(lines, key=len)
|
||||
max_len = len(longest_line)
|
||||
candidates_list = []
|
||||
|
||||
CHARACTER_FREQ = {
|
||||
'a': 0.0651738, 'b': 0.0124248, 'c': 0.0217339, 'd': 0.0349835, 'e': 0.1041442, 'f': 0.0197881, 'g': 0.0158610,
|
||||
'h': 0.0492888, 'i': 0.0558094, 'j': 0.0009033, 'k': 0.0050529, 'l': 0.0331490, 'm': 0.0202124, 'n': 0.0564513,
|
||||
'o': 0.0596302, 'p': 0.0137645, 'q': 0.0008606, 'r': 0.0497563, 's': 0.0515760, 't': 0.0729357, 'u': 0.0225134,
|
||||
'v': 0.0082903, 'w': 0.0171272, 'x': 0.0013692, 'y': 0.0145984, 'z': 0.0007836, ' ': 0.1918182
|
||||
} # ','
|
||||
|
||||
for byte_to_guess in range(max_len):
|
||||
#print(f"Byte num:{byte_to_guess}")
|
||||
counters = numpy.zeros(256,dtype=float)
|
||||
for guessed_byte in range(256):
|
||||
for line in lines:
|
||||
#print(f"Now line: {line}")
|
||||
#line = bytes.fromhex(line)
|
||||
if byte_to_guess >= len(line):
|
||||
continue
|
||||
if chr(line[byte_to_guess] ^ guessed_byte) in printable:
|
||||
counters[guessed_byte] += CHARACTER_FREQ.get(chr(line[byte_to_guess] ^ guessed_byte).lower(),0)
|
||||
|
||||
max_match = max(counters)
|
||||
|
||||
match_list = [(counters[i],i) for i in range(256)]
|
||||
ordered_match_list=sorted(match_list, reverse=True)
|
||||
|
||||
candidates = []
|
||||
#for pair in ordered_match_list:
|
||||
# if pair[0] < max_match * .95:
|
||||
# break
|
||||
# candidates.append(pair)
|
||||
|
||||
candidates_list.append(ordered_match_list)
|
||||
|
||||
keystream = bytearray()
|
||||
for x in candidates_list:
|
||||
keystream += x[0][1].to_bytes(1,byteorder='big')
|
||||
|
||||
|
||||
from Cryptodome.Util.strxor import strxor
|
||||
|
||||
dec = keystream[0] ^ lines[0][0]
|
||||
mask = dec ^ ord('T')
|
||||
keystream[0] = keystream[0] ^ mask
|
||||
|
||||
dec1 = keystream[1] ^ lines[0][1]
|
||||
mask = dec1 ^ ord('h')
|
||||
keystream[1] = keystream[1] ^ mask
|
||||
|
||||
dec2 = keystream[2] ^ lines[0][2]
|
||||
mask = dec2 ^ ord('i')
|
||||
keystream[2] = keystream[2] ^ mask
|
||||
|
||||
dec3 = keystream[3] ^ lines[0][3]
|
||||
mask = dec3 ^ ord('s')
|
||||
keystream[3] = keystream[3] ^ mask
|
||||
|
||||
dec5 = keystream[5] ^ lines[0][5]
|
||||
mask = dec5 ^ ord('i')
|
||||
keystream[5] = keystream[5] ^ mask
|
||||
|
||||
pos=28
|
||||
dec = keystream[pos] ^ lines[0][pos]
|
||||
mask = dec ^ ord('o')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=4
|
||||
pos=17
|
||||
dec = keystream[pos] ^ lines[4][pos]
|
||||
mask = dec ^ ord('s')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=4
|
||||
pos=20
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('w')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=34
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord(' ')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=36
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord(' ')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=37
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('s')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=38
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('e')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=40
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('v')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=2
|
||||
pos=49
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('r')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=2
|
||||
pos=53
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('b')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=2
|
||||
pos=42
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('w')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=2
|
||||
pos=43
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('a')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=2
|
||||
pos=45
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('n')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=0
|
||||
pos=46
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('o')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=57
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('t')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=58
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('i')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=59
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('n')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=64
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('t')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=65
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('h')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
l=1
|
||||
pos=67
|
||||
dec = keystream[pos] ^ lines[l][pos]
|
||||
mask = dec ^ ord('u')
|
||||
keystream[pos] = keystream[pos] ^ mask
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
for line in lines:
|
||||
l = min(len(keystream),len(line))
|
||||
print(strxor(line[:l],keystream[:l]))
|
||||
19
crypto-simmetric/long-secret-message/chall-original.py
Normal file
19
crypto-simmetric/long-secret-message/chall-original.py
Normal file
@ -0,0 +1,19 @@
|
||||
import os
|
||||
from Cryptodome.Cipher import ChaCha20
|
||||
|
||||
key = os.urandom(32)
|
||||
nonce = os.urandom(12)
|
||||
print(f"Using key: {key.hex()}, nonce: {nonce.hex()}")
|
||||
|
||||
with open("./hacker-manifesto.txt") as f:
|
||||
lines = f.readlines()
|
||||
#
|
||||
#hacker-manifesto.txt encrypted in enc
|
||||
enc = []
|
||||
|
||||
for line in lines:
|
||||
cipher = ChaCha20.new(key=key, nonce=nonce)
|
||||
enc.append(cipher.encrypt(line.encode()).hex())
|
||||
|
||||
with open("./hacker-manifesto.enc", "w") as f:
|
||||
f.write("\n".join(enc))
|
||||
21
crypto-simmetric/long-secret-message/chall.py
Normal file
21
crypto-simmetric/long-secret-message/chall.py
Normal file
@ -0,0 +1,21 @@
|
||||
import os
|
||||
from Cryptodome.Cipher import ChaCha20
|
||||
|
||||
key = os.urandom(32)
|
||||
nonce = os.urandom(12)
|
||||
print(f"Using key: {key.hex()}, nonce: {nonce.hex()}")
|
||||
|
||||
with open("./hacker-manifesto.txt") as f:
|
||||
lines = f.readlines()
|
||||
#
|
||||
#hacker-manifesto.txt encrypted in enc
|
||||
enc = []
|
||||
#Maybe recreating the cipher generate the same keystream?
|
||||
# Yes it is.
|
||||
|
||||
for line in lines:
|
||||
cipher = ChaCha20.new(key=key, nonce=nonce)
|
||||
enc.append(cipher.encrypt(line.encode()).hex())
|
||||
|
||||
with open("./hacker-manifesto.enc", "w") as f:
|
||||
f.write("\n".join(enc))
|
||||
@ -0,0 +1,8 @@
|
||||
bafb25656f777862abf3da47fc6cacbd314a2b551260ffa17ac09bc4b88a42ac31620c5733294beae8087fb92801c8bc8c0b682f294ea8bb60ed3dbe02f933f68eade8aa43
|
||||
8cf62d633b672b2da2a6dc0fda1888fc2a41725b6b2bff9873cede93a28b4be87e6b4a1667324bb8fb0d79bf7c12cba0c90b6232295fb8b733ea23b911ba2cb3dab1efba3d79
|
||||
9ef2357f21792b24abf48810d7599ebd3c4a2917586ebd9032c1d2c1a3d84da0746c1a572e270ea3f9446dbb2f1d80a68c1873252958b9fe30ec25b11fee3ebfdcb0eea86979
|
||||
89ff39623b716531e8a6c909db1893f22a053f1a5022ff806185f8e18ea87a872338115967164beae81c6ab63301c2fc8244260a675ee0a72feb6ab417f637fadbaaa0c5
|
||||
8de1257b26706a2eb7a88830da188fe53656285b4b27ab9d7dd0cf93a49347a6316e051b283302eafa0d6eb23306d3f2c20b72226654a1b229ea33fb56ed32aec6b6f5bb6979
|
||||
9cf6207f28776437b7a6ca0ede4bc4b371051d15586ea69a6785d8d2bb940ebd622d09052e2c47a4ec0869f47c2ac8a78c087322655ee0bf34f127be15ba39b5c3bbf3e36979
|
||||
97fc3936387f6c27e4f1c915cc14cae430507c16493cbb9060899bcab88d0eab79680b036b614fa4e94476b33953d3bd8c1f756b6854a4fe34ec33f702f57bb7cfb2e5ef3c005b9c
|
||||
8cf6207f2a686e62adf28f149f5e85ef7f4a29091c21a89b32c3d7d2b0d40eab21680940257319e7bc527fe27147c4e49c473f2a685eeded21a679b315f96aef97eee2e1
|
||||
8
crypto-simmetric/long-secret-message/original.enc
Normal file
8
crypto-simmetric/long-secret-message/original.enc
Normal file
@ -0,0 +1,8 @@
|
||||
bafb25656f777862abf3da47fc6cacbd314a2b551260ffa17ac09bc4b88a42ac31620c5733294beae8087fb92801c8bc8c0b682f294ea8bb60ed3dbe02f933f68eade8aa43
|
||||
8cf62d633b672b2da2a6dc0fda1888fc2a41725b6b2bff9873cede93a28b4be87e6b4a1667324bb8fb0d79bf7c12cba0c90b6232295fb8b733ea23b911ba2cb3dab1efba3d79
|
||||
9ef2357f21792b24abf48810d7599ebd3c4a2917586ebd9032c1d2c1a3d84da0746c1a572e270ea3f9446dbb2f1d80a68c1873252958b9fe30ec25b11fee3ebfdcb0eea86979
|
||||
89ff39623b716531e8a6c909db1893f22a053f1a5022ff806185f8e18ea87a872338115967164beae81c6ab63301c2fc8244260a675ee0a72feb6ab417f637fadbaaa0c5
|
||||
8de1257b26706a2eb7a88830da188fe53656285b4b27ab9d7dd0cf93a49347a6316e051b283302eafa0d6eb23306d3f2c20b72226654a1b229ea33fb56ed32aec6b6f5bb6979
|
||||
9cf6207f28776437b7a6ca0ede4bc4b371051d15586ea69a6785d8d2bb940ebd622d09052e2c47a4ec0869f47c2ac8a78c087322655ee0bf34f127be15ba39b5c3bbf3e36979
|
||||
97fc3936387f6c27e4f1c915cc14cae430507c16493cbb9060899bcab88d0eab79680b036b614fa4e94476b33953d3bd8c1f756b6854a4fe34ec33f702f57bb7cfb2e5ef3c005b9c
|
||||
8cf6207f2a686e62adf28f149f5e85ef7f4a29091c21a89b32c3d7d2b0d40eab21680940257319e7bc527fe27147c4e49c473f2a685eeded21a679b315f96aef97eee2e1
|
||||
Reference in New Issue
Block a user