Added all files

master
John Hammond 2018-02-05 22:28:51 -05:00
commit 7cd21cb690
3 changed files with 93 additions and 0 deletions

18
README.md Normal file
View File

@ -0,0 +1,18 @@
# cipherplane
> John Hammond | February 4th, 2018
------------------------
This is a project based off of my reaction to the "[DES]" [challenge](https://amritabi0s.wordpress.com/2018/02/03/sharif-ctf-2018-crypto-writeups/) during SharifCTF 2018.
The [DES] challenge offered about a thousand known plaintext/ciphertext pairs, and asked you to determine the key to submit as the flag. The real difficulty in this challenge was just __sorting through the pairs to find duplicates or similarities in the pairs.__ Had we found one single similarity in a plaintext or ciphertext, we would have been able to find a lead on the challenge and probably solve it.
But, we didn't have anything that would smartly detect duplicates or similarities in the data. I tossed the challenge aside and never completed it during the competition, but after [reading the writeups](https://ctftime.org/task/5215) I realized we seriously needed that capability.
So this is just some [Python] code to do that. It doesn't have support for command-line arguments or anything fancy... I expect dirty usage, just slapping in your own data for the script. _It will still get you the information you need._
The project is nicknamed *`cipherplane`*, as a gag off of "ciphertext" and "plaintext."
[DES]: https://en.wikipedia.org/wiki/Data_Encryption_Standard
[Python]: https://www.python.org/

75
cipherplane.py Executable file
View File

@ -0,0 +1,75 @@
#!/usr/bin/env python
from colorama import *
import collections
'''
We need to know...
1. if there are duplicates in the plaintext
2. if there are duplicates in the ciphertext
3. if there are entries in the plaintext that are in the ciphertext
4. if there are entries in the ciphertext that are in the plaintext
'''
def G(string): return Style.BRIGHT + Fore.GREEN + string + Fore.RESET + Style.NORMAL
def g(string): return Fore.GREEN + string + Fore.RESET
def B(string): return Style.BRIGHT + Fore.BLUE + string + Fore.RESET + Style.NORMAL
def b(string): return Fore.BLUE + string + Fore.RESET
def Y(string): return Style.BRIGHT + Fore.YELLOW + string + Fore.RESET + Style.NORMAL
def y(string): return Fore.YELLOW + string + Fore.RESET
def C(string): return Style.BRIGHT + Fore.CYAN + string + Fore.RESET + Style.NORMAL
def c(string): return Fore.CYAN + string + Fore.RESET
def get_duplicates( entries ):
counted_entries = collections.Counter(entries)
duplicates = { item : count for item, count in counted_entries.items() if count > 1 }
return duplicates
def print_duplicates(entries):
duplicates = get_duplicates(entries)
number_duplicates = len(duplicates.keys())
if number_duplicates > 0:
print g("\n[!] There are "+ G(str(number_duplicates)) +" duplicates!")
index = 1
for duplicate, count in duplicates.iteritems():
print y("["+str(index)+"] " ) + Y(str(duplicate)) + y(" duplicated ") + G(str(count)) + y(" times!")
index += 1
print "\n"
def get_similarities( a, b ):
return list(set(a).intersection(set(b)))
def print_similarities( a, b ):
similarities = get_similarities(a, b)
number_similarities = len(similarities)
if number_similarities > 0:
print g("\n[!] There are ") + G(str(number_similarities)) + g(" same entries in the two sets!")
index = 1
for similarity in similarities:
print y("["+str(index)+"] " ) + Y(str(similarity))
index += 1
print "\n"
def process( plaintext, ciphertext ):
print C("Processing plaintext...")
print_duplicates(plaintext)
print C("Processing ciphertext...")
print_duplicates(ciphertext)
print C("Processing plaintext and ciphertext...")
print_similarities( plaintext, ciphertext )
plaintext = range(1, 10) + range(1, 4)
ciphertext = [ x**2 for x in range(1,10) ]
process(plaintext, ciphertext)

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB