This commit is contained in:
2018-11-06 14:02:57 +01:00
commit 5e0faa3f52
36 changed files with 621 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
import sys
import os
import getpass
from Crypto.Cipher import AES
# from Crypto.Random import get_random_bytes, random
# from Crypto.Util import Padding
from Crypto.Hash import MD5, SHA256
# generates key based on password
def generatekey():
password = getpass.getpass('Password for decryption: ')
h = MD5.new()
h.update(''.join(password))
return h.digest()
# calculates and return hash for message
def calculatehash(message):
h = SHA256.new()
h.update(message)
# use hexdigest to prevent problems with control characters
# e.g. \r in charcter 5, appends 4, then overwrites beginning of message with rest of digest
return h.hexdigest()
# check integrity and return cleartext or error message
def checkintegrity(decryptedcontent):
return calculatehash(decryptedcontent[0:-64]) == decryptedcontent[-64:]
# encrypts content in AES CBC mode
def decrypt_AES_CBC(inputfilename, encryptedContent):
# create encrypted filename, keep extension
outputfilename = inputfilename[0:inputfilename.find('.', len(inputfilename) - 5)] + '_decrypted' + inputfilename[
inputfilename.find(
'.'):len(
inputfilename)]
key = generatekey()
decipher = AES.new(key, AES.MODE_CBC)
decryptedcontent = decipher.decrypt(encryptedContent)
ivlength = 16
# remove iv and padding
decryptedcontent = decryptedcontent[ivlength:-ord(decryptedcontent[-1])]
# check Integrity and retain cleartext
if checkintegrity(decryptedcontent):
cleartext = decryptedcontent[0:-64]
else:
cleartext = 'Integrity check error'
# useful only for decrypted text files
# print(cleartext)
# write to file
outputfile = open(outputfilename, 'wb')
outputfile.write(cleartext)
outputfile.close()
for i in sys.argv[1:]:
inputfilename = i
try:
inputfile = open(inputfilename, 'rb')
except IOError:
print("File " + inputfilename + " not found, working directory: " + os.getcwd())
continue
else:
# if file opened, read content into variable
content = inputfile.read()
inputfile.close()
# apply symmetric encryption
decrypt_AES_CBC(inputfilename, content)
# encrypt_AES_ECB(inputfilename,content)

1
uncrackable/hash34.txt Normal file
View File

@@ -0,0 +1 @@
084b8b05fae51beed25806aacf738fea

3
uncrackable/uitleg.txt Normal file
View File

@@ -0,0 +1,3 @@
Gegeven is een md5 hash. Het is moeilijk te onthouden, maar het paswoord dat bij de hash hoort, is random gegenereerd op basis van de karakters in python<6F>s string.printable. Het paswoord is 10 karakters lang en is bruikbaar om met het meegeleverde script het eveneens meegeleverde png bestand te decrypteren.
Dit script is hetzelfde script als wat bruikbaar was in de AES-CBC opgave.
Om het script uit te voeren is python 2.7 met de pycryptodome library nodig (zoals in de installatie op de labo pc<70>s). De vlag staat in de gedecrypteerde afbeelding.

Binary file not shown.