during class commit
This commit is contained in:
parent
3630a61186
commit
68c6fbb5c4
646
crypttool.py
646
crypttool.py
@ -1,323 +1,323 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
import sys, string, types, hashlib, base64, re, urllib, binascii
|
import sys, string, types, hashlib, base64, re, urllib, binascii
|
||||||
import operator
|
import operator
|
||||||
from collections import Counter
|
from collections import Counter
|
||||||
|
|
||||||
LOWER_LETTERS = [chr(x) for x in range(97, 123)]
|
LOWER_LETTERS = [chr(x) for x in range(97, 123)]
|
||||||
UPPER_LETTERS = [chr(x) for x in range(65, 91)]
|
UPPER_LETTERS = [chr(x) for x in range(65, 91)]
|
||||||
COMMON_LETTERS = 'ETAOIN SHRDLU'
|
COMMON_LETTERS = 'ETAOIN SHRDLU'
|
||||||
|
|
||||||
def xorRepeating():
|
def xorRepeating():
|
||||||
plain = raw_input('Please input your Plaintext: ')
|
plain = raw_input('Please input your Plaintext: ')
|
||||||
key = raw_input('Key: ')
|
key = raw_input('Key: ')
|
||||||
hexkey = list()
|
hexkey = list()
|
||||||
i = 0
|
i = 0
|
||||||
for c in key:
|
for c in key:
|
||||||
print(i)
|
print(i)
|
||||||
hexkey.append(ord(c))
|
hexkey.append(ord(c))
|
||||||
i += 1
|
i += 1
|
||||||
resultString = ''
|
resultString = ''
|
||||||
i = 0
|
i = 0
|
||||||
for char in plain:
|
for char in plain:
|
||||||
resultString += str(hex(ord(char) ^ hexkey[i]))[2:]
|
resultString += str(hex(ord(char) ^ hexkey[i]))[2:]
|
||||||
i += 1
|
i += 1
|
||||||
if i == len(key):
|
if i == len(key):
|
||||||
i = 0
|
i = 0
|
||||||
print(resultString)
|
print(resultString)
|
||||||
|
|
||||||
def xorBrutePrompt():
|
def xorBrutePrompt():
|
||||||
isfile = (raw_input('f for file; for string:') == 'f')
|
isfile = (raw_input('f for file; for string:') == 'f')
|
||||||
maxresults = input('How many top hits? ')
|
maxresults = input('How many top hits? ')
|
||||||
keylength = input('Maximum key length in bytes: ')
|
keylength = input('Maximum key length in bytes: ')
|
||||||
if isfile:
|
if isfile:
|
||||||
path = raw_input('path: ')
|
path = raw_input('path: ')
|
||||||
path = path.strip()
|
path = path.strip()
|
||||||
results = list()
|
results = list()
|
||||||
with open(path, 'r') as file:
|
with open(path, 'r') as file:
|
||||||
contents = file.readlines()
|
contents = file.readlines()
|
||||||
contents = [line.strip() for line in contents]
|
contents = [line.strip() for line in contents]
|
||||||
for code in contents:
|
for code in contents:
|
||||||
recursiveResult = xorSingleBrute(code, maxresults, keylength)
|
recursiveResult = xorSingleBrute(code, maxresults, keylength)
|
||||||
#nach Punkten aufsteigend sortieren:
|
#nach Punkten aufsteigend sortieren:
|
||||||
sortedList = sorted(recursiveResult.items(), key=operator.itemgetter(1))[-maxresults:]
|
sortedList = sorted(recursiveResult.items(), key=operator.itemgetter(1))[-maxresults:]
|
||||||
#Liste in maximalwert dieser als Tupel anhaengen:
|
#Liste in maximalwert dieser als Tupel anhaengen:
|
||||||
results.append((sortedList, max(recursiveResult.iteritems(), key=operator.itemgetter(1))[1]))
|
results.append((sortedList, max(recursiveResult.iteritems(), key=operator.itemgetter(1))[1]))
|
||||||
#sortieren nach MaxWert:
|
#sortieren nach MaxWert:
|
||||||
sortedResults = sorted(results, key=operator.itemgetter(1))
|
sortedResults = sorted(results, key=operator.itemgetter(1))
|
||||||
for item in sortedResults:
|
for item in sortedResults:
|
||||||
#da tupel muss so iteriert werden:
|
#da tupel muss so iteriert werden:
|
||||||
for tupel in item[::2]:
|
for tupel in item[::2]:
|
||||||
for i in tupel:
|
for i in tupel:
|
||||||
print(i[0])
|
print(i[0])
|
||||||
else:
|
else:
|
||||||
encoded = raw_input('Input your Hex String: ')
|
encoded = raw_input('Input your Hex String: ')
|
||||||
result = xorSingleBrute(encoded, maxresults, keylength)
|
result = xorSingleBrute(encoded, maxresults, keylength)
|
||||||
sortedResults = sorted(result.items(), key=operator.itemgetter(1))[-maxresults:]
|
sortedResults = sorted(result.items(), key=operator.itemgetter(1))[-maxresults:]
|
||||||
for i, j in sortedResults:
|
for i, j in sortedResults:
|
||||||
print(i)
|
print(i)
|
||||||
|
|
||||||
|
|
||||||
def xorSingleBrute(encoded='', maxresults=20, keybytes=1):
|
def xorSingleBrute(encoded='', maxresults=20, keybytes=1):
|
||||||
resultDict = dict()
|
resultDict = dict()
|
||||||
if(encoded == ''):
|
if(encoded == ''):
|
||||||
isfile = (raw_input('f for file; for string:') == 'f')
|
isfile = (raw_input('f for file; for string:') == 'f')
|
||||||
for xor_key in range(0, 2**(keybytes*8)):
|
for xor_key in range(0, 2**(keybytes*8)):
|
||||||
decoded = '';
|
decoded = '';
|
||||||
for i, j in zip(encoded[::2], encoded[1::2]):
|
for i, j in zip(encoded[::2], encoded[1::2]):
|
||||||
decoded += ''.join(chr(int(i+j, 16) ^ xor_key))
|
decoded += ''.join(chr(int(i+j, 16) ^ xor_key))
|
||||||
resultDict[decoded] = commonCounter(decoded)
|
resultDict[decoded] = commonCounter(decoded)
|
||||||
return resultDict
|
return resultDict
|
||||||
|
|
||||||
def commonCounter(inputString, limit=7):
|
def commonCounter(inputString, limit=7):
|
||||||
countObj = Counter(inputString.upper())
|
countObj = Counter(inputString.upper())
|
||||||
common = countObj & Counter(COMMON_LETTERS)
|
common = countObj & Counter(COMMON_LETTERS)
|
||||||
return sum(common.values())
|
return sum(common.values())
|
||||||
|
|
||||||
def fixedxor(string1 = '', string2 = ''):
|
def fixedxor(string1 = '', string2 = ''):
|
||||||
if(string1 == ''):
|
if(string1 == ''):
|
||||||
string1 = raw_input('Please input your first hex string: ')
|
string1 = raw_input('Please input your first hex string: ')
|
||||||
string2 = raw_input('Please input your second hex string: ')
|
string2 = raw_input('Please input your second hex string: ')
|
||||||
hex1 = int(string1, 16)
|
hex1 = int(string1, 16)
|
||||||
hex2 = int(string2, 16)
|
hex2 = int(string2, 16)
|
||||||
result = hex1 ^ hex2
|
result = hex1 ^ hex2
|
||||||
print(hex(result))
|
print(hex(result))
|
||||||
|
|
||||||
def rot(inputString, amount):
|
def rot(inputString, amount):
|
||||||
outputString = ''
|
outputString = ''
|
||||||
for char in inputString:
|
for char in inputString:
|
||||||
resultChar = ''
|
resultChar = ''
|
||||||
if char.isupper():
|
if char.isupper():
|
||||||
index = UPPER_LETTERS.index(char)
|
index = UPPER_LETTERS.index(char)
|
||||||
resultChar = UPPER_LETTERS[(index + amount)%len(UPPER_LETTERS)]
|
resultChar = UPPER_LETTERS[(index + amount)%len(UPPER_LETTERS)]
|
||||||
elif char.islower():
|
elif char.islower():
|
||||||
index = LOWER_LETTERS.index(char)
|
index = LOWER_LETTERS.index(char)
|
||||||
resultChar = LOWER_LETTERS[(index + amount) % len(LOWER_LETTERS)]
|
resultChar = LOWER_LETTERS[(index + amount) % len(LOWER_LETTERS)]
|
||||||
else:
|
else:
|
||||||
resultChar = char
|
resultChar = char
|
||||||
outputString += resultChar
|
outputString += resultChar
|
||||||
return outputString
|
return outputString
|
||||||
|
|
||||||
def translate(inputString, inputType, outputType):
|
def translate(inputString, inputType, outputType):
|
||||||
result = ''
|
result = ''
|
||||||
if(inputType == outputType):
|
if(inputType == outputType):
|
||||||
result = inputString
|
result = inputString
|
||||||
return result
|
return result
|
||||||
|
|
||||||
if (inputType == 5):
|
if (inputType == 5):
|
||||||
for char in inputString:
|
for char in inputString:
|
||||||
if(outputType == 1):
|
if(outputType == 1):
|
||||||
result += bin(ord(char)) + ' '
|
result += bin(ord(char)) + ' '
|
||||||
elif(outputType == 2):
|
elif(outputType == 2):
|
||||||
result += ord(char) + ' '
|
result += ord(char) + ' '
|
||||||
elif(outputType == 3):
|
elif(outputType == 3):
|
||||||
result += oct(ord(char)) + ' '
|
result += oct(ord(char)) + ' '
|
||||||
elif(outputType == 4):
|
elif(outputType == 4):
|
||||||
result += hex(ord(char)) + ' '
|
result += hex(ord(char)) + ' '
|
||||||
else:
|
else:
|
||||||
result = inputString
|
result = inputString
|
||||||
break
|
break
|
||||||
return result
|
return result
|
||||||
|
|
||||||
elif(inputType == 1):
|
elif(inputType == 1):
|
||||||
inputString = int(inputString, 2)
|
inputString = int(inputString, 2)
|
||||||
elif(inputType == 2):
|
elif(inputType == 2):
|
||||||
inputString = int(inputString)
|
inputString = int(inputString)
|
||||||
elif(inputType == 3):
|
elif(inputType == 3):
|
||||||
inputString = int(inputString, 8)
|
inputString = int(inputString, 8)
|
||||||
elif(inputType == 4):
|
elif(inputType == 4):
|
||||||
inputString = int(inputString, 16)
|
inputString = int(inputString, 16)
|
||||||
|
|
||||||
if(outputType == 1):
|
if(outputType == 1):
|
||||||
result = bin(inputString)
|
result = bin(inputString)
|
||||||
elif(outputType == 2):
|
elif(outputType == 2):
|
||||||
result = inputString
|
result = inputString
|
||||||
elif(outputType == 3):
|
elif(outputType == 3):
|
||||||
result = oct(inputString)
|
result = oct(inputString)
|
||||||
elif(outputType == 4):
|
elif(outputType == 4):
|
||||||
result = hex(inputString)
|
result = hex(inputString)
|
||||||
elif(outputType == 5):
|
elif(outputType == 5):
|
||||||
result = chr(inputString)
|
result = chr(inputString)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def zeroWidthString(inputstring):
|
def zeroWidthString(inputstring):
|
||||||
resultstring = '>'
|
resultstring = '>'
|
||||||
binary = translate(inputstring, 5, 1)
|
binary = translate(inputstring, 5, 1)
|
||||||
binaryArray = binary.split(" ")
|
binaryArray = binary.split(" ")
|
||||||
print (binaryArray)
|
print (binaryArray)
|
||||||
for byte in binaryArray:
|
for byte in binaryArray:
|
||||||
for bit in byte[2:10]:
|
for bit in byte[2:10]:
|
||||||
if(bit == '1'):
|
if(bit == '1'):
|
||||||
resultstring+= u'\u200b' #zero-width space
|
resultstring+= u'\u200b' #zero-width space
|
||||||
else:
|
else:
|
||||||
resultstring+= u'\u200d' #zero-width joiner
|
resultstring+= u'\u200d' #zero-width joiner
|
||||||
resultstring += '<'
|
resultstring += '<'
|
||||||
print resultstring
|
print resultstring
|
||||||
|
|
||||||
def resolveZeroWidthString(inputstring):
|
def resolveZeroWidthString(inputstring):
|
||||||
charfound = False
|
charfound = False
|
||||||
binarystring = ''
|
binarystring = ''
|
||||||
resultstring = ''
|
resultstring = ''
|
||||||
inputstring = inputstring.decode('unicode-escape')
|
inputstring = inputstring.decode('unicode-escape')
|
||||||
for char in inputstring:
|
for char in inputstring:
|
||||||
print char
|
print char
|
||||||
if char == u'\u200b':
|
if char == u'\u200b':
|
||||||
binarystring += '1'
|
binarystring += '1'
|
||||||
elif char == u'\u200d':
|
elif char == u'\u200d':
|
||||||
binarystring += '0'
|
binarystring += '0'
|
||||||
for byte in binarystring[::8]:
|
for byte in binarystring[::8]:
|
||||||
resultstring += translate(byte, 1, 5)
|
resultstring += translate(byte, 1, 5)
|
||||||
print resultstring
|
print resultstring
|
||||||
|
|
||||||
def vignere(plain, key):
|
def vignere(plain, key):
|
||||||
i = 0
|
i = 0
|
||||||
result = ''
|
result = ''
|
||||||
plain = plain.upper()
|
plain = plain.upper()
|
||||||
key = key.upper()
|
key = key.upper()
|
||||||
for char in plain:
|
for char in plain:
|
||||||
if char in UPPER_LETTERS:
|
if char in UPPER_LETTERS:
|
||||||
result += chr( (((ord(char)) + (ord(key[i])))%26)+65)
|
result += chr( (((ord(char)) + (ord(key[i])))%26)+65)
|
||||||
i += 1
|
i += 1
|
||||||
if (i == len(key)):
|
if (i == len(key)):
|
||||||
i = 0
|
i = 0
|
||||||
else:
|
else:
|
||||||
result += '.'
|
result += '.'
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def string2bin(input):
|
def string2bin(input):
|
||||||
return ''.join(format(ord(x), 'b').zfill(8) for x in input)
|
return ''.join(format(ord(x), 'b').zfill(8) for x in input)
|
||||||
|
|
||||||
def hammingDistance(string1, string2):
|
def hammingDistance(string1, string2):
|
||||||
diffs = 0
|
diffs = 0
|
||||||
bin1 = string2bin(string1)
|
bin1 = string2bin(string1)
|
||||||
bin2 = string2bin(string2)
|
bin2 = string2bin(string2)
|
||||||
for b1, b2 in zip(bin1, bin2):
|
for b1, b2 in zip(bin1, bin2):
|
||||||
if b1 != b2:
|
if b1 != b2:
|
||||||
diffs += 1
|
diffs += 1
|
||||||
return diffs
|
return diffs
|
||||||
|
|
||||||
def urlEncoder():
|
def urlEncoder():
|
||||||
input = raw_input('Pleae input your String: ')
|
input = raw_input('Pleae input your String: ')
|
||||||
print(urllib.quote_plus(input))
|
print(urllib.quote_plus(input))
|
||||||
|
|
||||||
def reverser():
|
def reverser():
|
||||||
string = raw_input('Please input your string to reverse:')
|
string = raw_input('Please input your string to reverse:')
|
||||||
print(string[::-1])
|
print(string[::-1])
|
||||||
|
|
||||||
def base64prompt():
|
def base64prompt():
|
||||||
b64regex = '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$'
|
b64regex = '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$'
|
||||||
isfile = (raw_input('f for file, s for string: ') == 'f')
|
isfile = (raw_input('f for file, s for string: ') == 'f')
|
||||||
if isfile:
|
if isfile:
|
||||||
path = raw_input('Path: ')
|
path = raw_input('Path: ')
|
||||||
path = path.strip()
|
path = path.strip()
|
||||||
outputPath = raw_input('Output file: ')
|
outputPath = raw_input('Output file: ')
|
||||||
with open(path, 'r') as file:
|
with open(path, 'r') as file:
|
||||||
contents = file.read()
|
contents = file.read()
|
||||||
file.close()
|
file.close()
|
||||||
#contents = [line.strip() for line in contents]
|
#contents = [line.strip() for line in contents]
|
||||||
decoded = base64.b64decode(contents)
|
decoded = base64.b64decode(contents)
|
||||||
with open(outputPath, 'w') as outfile:
|
with open(outputPath, 'w') as outfile:
|
||||||
#for line in contents:
|
#for line in contents:
|
||||||
outfile.write(decoded)
|
outfile.write(decoded)
|
||||||
outfile.close()
|
outfile.close()
|
||||||
else:
|
else:
|
||||||
inputString = raw_input('Please input your string: ')
|
inputString = raw_input('Please input your string: ')
|
||||||
if (re.match(b64regex, inputString)):
|
if (re.match(b64regex, inputString)):
|
||||||
print(base64.b64decode(inputString))
|
print(base64.b64decode(inputString))
|
||||||
else:
|
else:
|
||||||
print(base64.b64encode(inputString))
|
print(base64.b64encode(inputString))
|
||||||
|
|
||||||
|
|
||||||
def rotPrompt():
|
def rotPrompt():
|
||||||
choice = input('What kind of ROT do you want to perform? 1-25, or all: ')
|
choice = input('What kind of ROT do you want to perform? 1-25, or all: ')
|
||||||
userInput = raw_input('Please insert a string: ')
|
userInput = raw_input('Please insert a string: ')
|
||||||
if type(choice) is types.IntType:
|
if type(choice) is types.IntType:
|
||||||
print(rot(userInput, choice))
|
print(rot(userInput, choice))
|
||||||
else:
|
else:
|
||||||
for i in range(0, 26):
|
for i in range(0, 26):
|
||||||
print(rot(userInput, i))
|
print(rot(userInput, i))
|
||||||
|
|
||||||
def translatePrompt():
|
def translatePrompt():
|
||||||
print('1: Binary')
|
print('1: Binary')
|
||||||
print('2: Decimal')
|
print('2: Decimal')
|
||||||
print('3: Octal')
|
print('3: Octal')
|
||||||
print('4: Hexadecimal')
|
print('4: Hexadecimal')
|
||||||
print('5: ASCII')
|
print('5: ASCII')
|
||||||
inputType = input('Please specify input type: ')
|
inputType = input('Please specify input type: ')
|
||||||
outputType = input('Please specify output type: ')
|
outputType = input('Please specify output type: ')
|
||||||
if (inputType == 5):
|
if (inputType == 5):
|
||||||
inputString = raw_input('Please input your strings, seperated by semicolon: ')
|
inputString = raw_input('Please input your strings, seperated by semicolon: ')
|
||||||
else:
|
else:
|
||||||
inputString = raw_input('Please input your values, seperated by semicolon: ')
|
inputString = raw_input('Please input your values, seperated by semicolon: ')
|
||||||
|
|
||||||
inputList = inputString.split(';')
|
inputList = inputString.split(';')
|
||||||
for entry in inputList:
|
for entry in inputList:
|
||||||
print(str(translate(entry, inputType, outputType)))
|
print(str(translate(entry, inputType, outputType)))
|
||||||
|
|
||||||
def hashPrompt():
|
def hashPrompt():
|
||||||
typeChoice = raw_input('Would you like to hash a file or a String? f for file, s for string: ')
|
typeChoice = raw_input('Would you like to hash a file or a String? f for file, s for string: ')
|
||||||
algoList = hashlib.algorithms_available
|
algoList = hashlib.algorithms_available
|
||||||
for word in algoList:
|
for word in algoList:
|
||||||
print(word)
|
print(word)
|
||||||
algoChoice = raw_input('Which hashing algorithm? ')
|
algoChoice = raw_input('Which hashing algorithm? ')
|
||||||
if algoChoice in algoList:
|
if algoChoice in algoList:
|
||||||
hasher = hashlib.new(algoChoice)
|
hasher = hashlib.new(algoChoice)
|
||||||
else:
|
else:
|
||||||
print('That\'s no algorithm!')
|
print('That\'s no algorithm!')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
if (typeChoice == 'f'):
|
if (typeChoice == 'f'):
|
||||||
filePath = raw_input('Please input a fully qualified path: ')
|
filePath = raw_input('Please input a fully qualified path: ')
|
||||||
filePath = filePath.strip()
|
filePath = filePath.strip()
|
||||||
with open(filePath, 'rb') as hashFile:
|
with open(filePath, 'rb') as hashFile:
|
||||||
content = hashFile.read()
|
content = hashFile.read()
|
||||||
hasher.update(content)
|
hasher.update(content)
|
||||||
else:
|
else:
|
||||||
inputString = raw_input('Please input a string: ')
|
inputString = raw_input('Please input a string: ')
|
||||||
hasher.update(inputString)
|
hasher.update(inputString)
|
||||||
print(hasher.hexdigest())
|
print(hasher.hexdigest())
|
||||||
|
|
||||||
print('Welcome aboard PankiCrypt Airlines!')
|
print('Welcome aboard PankiCrypt Airlines!')
|
||||||
print('How may we serve you today?')
|
print('How may we serve you today?')
|
||||||
print('1: ROT/Ceasar Encryption')
|
print('1: ROT/Ceasar Encryption')
|
||||||
print('2: Hashing functions')
|
print('2: Hashing functions')
|
||||||
print('3: Translation')
|
print('3: Translation')
|
||||||
print('4: Base64 Encoder/Decoder')
|
print('4: Base64 Encoder/Decoder')
|
||||||
print('5: String Reverser')
|
print('5: String Reverser')
|
||||||
print('6: URL Encoder')
|
print('6: URL Encoder')
|
||||||
print('7: Fixed XOR')
|
print('7: Fixed XOR')
|
||||||
print('8: XOR Bruteforce Single Byte ')
|
print('8: XOR Bruteforce Single Byte ')
|
||||||
print('9: XOR Repeating Key')
|
print('9: XOR Repeating Key')
|
||||||
print('10: Zero-Width String')
|
print('10: Zero-Width String')
|
||||||
print('11: Resolve Zero-Width Strings')
|
print('11: Resolve Zero-Width Strings')
|
||||||
choice = raw_input('Please make a selection: ')
|
choice = raw_input('Please make a selection: ')
|
||||||
if (choice == '1'):
|
if (choice == '1'):
|
||||||
rotPrompt()
|
rotPrompt()
|
||||||
elif (choice == '2'):
|
elif (choice == '2'):
|
||||||
hashPrompt()
|
hashPrompt()
|
||||||
elif (choice == '3'):
|
elif (choice == '3'):
|
||||||
translatePrompt()
|
translatePrompt()
|
||||||
elif(choice == '4'):
|
elif(choice == '4'):
|
||||||
base64prompt()
|
base64prompt()
|
||||||
elif(choice == '5'):
|
elif(choice == '5'):
|
||||||
reverser()
|
reverser()
|
||||||
elif(choice == '6'):
|
elif(choice == '6'):
|
||||||
urlEncoder()
|
urlEncoder()
|
||||||
elif(choice[0] == '7'):
|
elif(choice[0] == '7'):
|
||||||
if(len(choice) > 1):
|
if(len(choice) > 1):
|
||||||
argList = choice.split(' ')
|
argList = choice.split(' ')
|
||||||
fixedxor(argList[1], argList[2])
|
fixedxor(argList[1], argList[2])
|
||||||
else:
|
else:
|
||||||
fixedxor()
|
fixedxor()
|
||||||
elif(choice == '8'):
|
elif(choice == '8'):
|
||||||
#xorSingleBrute()
|
#xorSingleBrute()
|
||||||
xorBrutePrompt()
|
xorBrutePrompt()
|
||||||
elif(choice == '9'):
|
elif(choice == '9'):
|
||||||
xorRepeating()
|
xorRepeating()
|
||||||
elif(choice == '10'):
|
elif(choice == '10'):
|
||||||
i = raw_input('String:')
|
i = raw_input('String:')
|
||||||
zeroWidthString(i)
|
zeroWidthString(i)
|
||||||
elif(choice == '11'):
|
elif(choice == '11'):
|
||||||
i = raw_input('String:')
|
i = raw_input('String:')
|
||||||
resolveZeroWidthString(i)
|
resolveZeroWidthString(i)
|
||||||
print('Thank you for flying with PankiCrypt Airlines!')
|
print('Thank you for flying with PankiCrypt Airlines!')
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user