Ir para conteúdo
Fórum Script Brasil

brdarkmoon

Membros
  • Total de itens

    1
  • Registro em

  • Última visita

Sobre brdarkmoon

brdarkmoon's Achievements

0

Reputação

  1. Bom Dia pessoal, sou novo em Python. Comecei a estudar ele agora em um curso de segurança que estou fazendo. Bom, eu travei em uma tarefa que me falaram ser simples, mas, infelizmente até agora eu não consegui chegar no objetivo e todos os recursos online que consegui achar também não ajudaram, bem, o que preciso fazer é o seguinte: Implementar: DES 3DES AES RSA Esta parte eu fiz, tem muito recurso online e ajuda bastante, encriptar não é o problema, porque o monte de recursos que tem online, esta parte é bem fácil de entender e fazer, mas, onde eu travei é no seguinte: A cada round da encriptação printar na tela as mudanças que acontecem em um plaintext até chegar no round final, e no final de tudo printar na tela também: O tempo de encriptação O tempo de decriptação A Utilização de memória O efeito avalanche Alguém tem alguma idéia de como fazer? Aqui abaixo tem o que consegui adaptar com o que encontrei online, O primeiro código pede a escolha do que você quer fazer, e baseado na resposta ele cncripta em DES(3D tb) ou chama arquivos externos para encriptar em AES ou RSA: Código Principal: #import commands <- This have to be replaced with subprocess for it to work in python 3 import subprocess import os from datetime import datetime, date, time from pyDes import * os.system("cls") print("1. Encryption") print("2. Decryption\n") option = input("Enter your Choice:") if option == '1': print("\n1. AES Encryption") print("2. DES Encryption") print("3. RSA Encryption\n") op = input("Enter your Choice :") if op == '1': print("AES Encrytion Started ...") before_time = datetime.now() #print "Time before AES Encryption Starts :", before_time os.system("python aes.py -e testfile.txt -o testfile_encrytped_AES.txt") after_time = datetime.now() #print "Time after AES Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by AES ", total_time) elif op == '2': print("1. Single DES Encryption") print("2. Triple DES Encryption\n") op2 = input("Enter your Choice:") if op2 == '1': print("DES Encryption Started...") before_time = datetime.now() #print "Time before AES Encryption Starts :", before_time with file('testfile.txt') as f: data = f.read() k = des("DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5) d = k.encrypt(data) with open('testfile_encrypted_Single_DES.txt','w') as f: f.write(d) after_time = datetime.now() #print "Time after DES Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by DES ", total_time) elif op2 == '2': print("DES Encryption Started...") before_time = datetime.now() #print "Time before AES Encryption Starts :", before_time with file('testfile.txt') as f: data = f.read() k = triple_des("TRIPLE00DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5) d = k.encrypt(data) with open('testfile_encrypted_Triple_DES.txt','w') as f: f.write(d) after_time = datetime.now() #print "Time after DES Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by DES ", total_time) else: print("Wrong Option") elif op == '3': print("\n1. Private Key Encryption") print("2. Public Key Encryption\n") op1=input("Enter your Choice:") if op1 == '1': print("RSA Private Key Encrytion Started ...") before_time = datetime.now() #print "Time before RSA Private Key Encryption Starts :", before_time os.system("python rsa.py -e testfile.txt -k rsa_privateKey.txt > testfile_encrytped_RSA_private.txt") after_time = datetime.now() #print "Time after RSA Private Key Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by RSA Private Key Encryption ", total_time) elif op1 == '2': print("RSA Public Key Encrytion Started ...") before_time = datetime.now() #print "Time before RSA Public Key Encryption Starts :", before_time os.system("python rsa.py -e testfile.txt -k rsa_publicKey.txt > testfile_encrytped_RSA_public.txt") after_time = datetime.now() #print "Time after RSA Public Key Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by RSA Public Key Encryption ", total_time) else: print("Wrong Choice, Exiting ...") else: print("Wrong Option") elif option == '2': print("*** Please perform encryption before proceesing with decryption ***") print("\n1. AES Decryption") print("2. DES Decryption") print("3. RSA Decryption\n") op = input("Enter your Choice :") if op == '1': print("AES Decrytion Started ...") before_time = datetime.now() #print "Time before AES Encryption Starts :", before_time os.system("python aes.py -d testfile_encrytped_AES.txt -o testfile_decrypted_AES.txt ") after_time = datetime.now() #print "Time after AES Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by AES Decryption", total_time) elif op == '2': print("1. Single DES Decryption") print("2. Triple DES Decryption\n") op2 = input("Enter your Choice:") if op2 == '1': print("Single DES Decryption Started...") before_time = datetime.now() #print "Time before AES Encryption Starts :", before_time with file('testfile_encrypted_Single_DES.txt') as f: data = f.read() #password = getpass.getpass('Password :') k = des("DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5) d = k.decrypt(data) with open('testfile_decrypted_Single_DES.txt','w') as f: f.write(d) after_time = datetime.now() #print "Time after DES Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by DES ", total_time) elif op2 == '2': print("Triple DES Decryption Started...") before_time = datetime.now() #print "Time before AES Encryption Starts :", before_time with file('testfile_encrypted_Triple_DES.txt') as f: data = f.read() #password = getpass.getpass('Password :') k = triple_des("TRIPLE00DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5) d = k.decrypt(data) with open('testfile_decrypted_Triple_DES.txt','w') as f: f.write(d) after_time = datetime.now() #print "Time after DES Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by DES ", total_time) else: print("Wrong Option") elif op == '3': print("\n1. Private Key Decryption") print("2. Public Key Decryption\n") op1=input("Enter your Choice:") if op1 == '1': print("RSA Private Key Decrytion Started ...") before_time = datetime.now() #print "Time before RSA Private Key Encryption Starts :", before_time os.system("python rsa.py -d testfile_encrytped_RSA_private.txt -k rsa_privateKey.txt > testfile_decrytped_RSA_private.txt") after_time = datetime.now() #print "Time after RSA Private Key Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by RSA Private Key Decryption ", total_time) elif op1 == '2': print("RSA Public Key Decrytion Started ...") before_time = datetime.now() #print "Time before RSA Public Key Encryption Starts :", before_time os.system("python rsa.py -d testfile_encrytped_RSA_public.txt -k rsa_publicKey.txt > testfile_decrytped_RSA_public.txt") after_time = datetime.now() #print "Time after RSA Public Key Encryption completes :", after_time total_time = after_time - before_time print("Total Time conceeded by RSA Public Key Decryption ", total_time) else: print("Wrong Choice, Exiting ...") else: print("Wrong Option") else : print("Author") AES: #!/usr/bin/python # Copyright (c) 2013 Nagaraja . T # Licensed under the GPL. # Python AES Implementation import sys, hashlib, string, getpass from copy import copy from random import randint # The actual Rijndael specification includes variable block size, but # AES uses a fixed block size of 16 bytes (128 bits) # Additionally, AES allows for a variable key size, though this implementation # of AES uses only 256-bit cipher keys (AES-256) sbox = [ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ] sboxInv = [ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d ] rcon = [ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb ] # returns a copy of the word shifted n bytes (chars) # positive values for n shift bytes left, negative values shift right def rotate(word, n): return word[n:]+word[0:n] # iterate over each "virtual" row in the state table and shift the bytes # to the LEFT by the appropriate offset def shiftRows(state): for i in range(4): state[i*4:i*4+4] = rotate(state[i*4:i*4+4],i) # iterate over each "virtual" row in the state table and shift the bytes # to the RIGHT by the appropriate offset def shiftRowsInv(state): for i in range(4): state[i*4:i*4+4] = rotate(state[i*4:i*4+4],-i) # takes 4-byte word and iteration number def keyScheduleCore(word, i): # rotate word 1 byte to the left word = rotate(word, 1) newWord = [] # apply sbox substitution on all bytes of word for byte in word: newWord.append(sbox[byte]) # XOR the output of the rcon[i] transformation with the first part of the word newWord[0] = newWord[0]^rcon[i] return newWord # expand 256 bit cipher key into 240 byte key from which # each round key is derived def expandKey(cipherKey): cipherKeySize = len(cipherKey) assert cipherKeySize == 32 # container for expanded key expandedKey = [] currentSize = 0 rconIter = 1 # temporary list to store 4 bytes at a time t = [0,0,0,0] # copy the first 32 bytes of the cipher key to the expanded key for i in range(cipherKeySize): expandedKey.append(cipherKey[i]) currentSize += cipherKeySize # generate the remaining bytes until we get a total key size # of 240 bytes while currentSize < 240: # assign previous 4 bytes to the temporary storage t for i in range(4): t[i] = expandedKey[(currentSize - 4) + i] # every 32 bytes apply the core schedule to t if currentSize % cipherKeySize == 0: t = keyScheduleCore(t, rconIter) rconIter += 1 # since we're using a 256-bit key -> add an extra sbox transform if currentSize % cipherKeySize == 16: for i in range(4): t[i] = sbox[t[i]] # XOR t with the 4-byte block [16,24,32] bytes before the end of the # current expanded key. These 4 bytes become the next bytes in the # expanded key for i in range(4): expandedKey.append(((expandedKey[currentSize - cipherKeySize]) ^ (t[i]))) currentSize += 1 return expandedKey # do sbox transform on each of the values in the state table def subBytes(state): for i in range(len(state)): #print "state[i]:", state[i] #print "sbox[state[i]]:", sbox[state[i]] state[i] = sbox[state[i]] # inverse sbox transform on each byte in state table def subBytesInv(state): for i in range(len(state)): state[i] = sboxInv[state[i]] # XOR each byte of the roundKey with the state table def addRoundKey(state, roundKey): for i in range(len(state)): #print i #print "old state value:", state[i] #print "new state value:", state[i] ^ roundKey[i] state[i] = state[i] ^ roundKey[i] # Galois Multiplication def galoisMult(a, b): p = 0 hiBitSet = 0 for i in range(8): if b & 1 == 1: p ^= a hiBitSet = a & 0x80 a <<= 1 if hiBitSet == 0x80: a ^= 0x1b b >>= 1 return p % 256 # mixColumn takes a column and does stuff def mixColumn(column): temp = copy(column) column[0] = galoisMult(temp[0],2) ^ galoisMult(temp[3],1) ^ \ galoisMult(temp[2],1) ^ galoisMult(temp[1],3) column[1] = galoisMult(temp[1],2) ^ galoisMult(temp[0],1) ^ \ galoisMult(temp[3],1) ^ galoisMult(temp[2],3) column[2] = galoisMult(temp[2],2) ^ galoisMult(temp[1],1) ^ \ galoisMult(temp[0],1) ^ galoisMult(temp[3],3) column[3] = galoisMult(temp[3],2) ^ galoisMult(temp[2],1) ^ \ galoisMult(temp[1],1) ^ galoisMult(temp[0],3) # mixColumnInv does stuff too def mixColumnInv(column): temp = copy(column) column[0] = galoisMult(temp[0],14) ^ galoisMult(temp[3],9) ^ \ galoisMult(temp[2],13) ^ galoisMult(temp[1],11) column[1] = galoisMult(temp[1],14) ^ galoisMult(temp[0],9) ^ \ galoisMult(temp[3],13) ^ galoisMult(temp[2],11) column[2] = galoisMult(temp[2],14) ^ galoisMult(temp[1],9) ^ \ galoisMult(temp[0],13) ^ galoisMult(temp[3],11) column[3] = galoisMult(temp[3],14) ^ galoisMult(temp[2],9) ^ \ galoisMult(temp[1],13) ^ galoisMult(temp[0],11) # mixColumns is a wrapper for mixColumn - generates a "virtual" column from # the state table and applies the weird galois math def mixColumns(state): for i in range(4): column = [] # create the column by taking the same item out of each "virtual" row for j in range(4): column.append(state[j*4+i]) # apply mixColumn on our virtual column mixColumn(column) # transfer the new values back into the state table for j in range(4): state[j*4+i] = column[j] # mixColumnsInv is a wrapper for mixColumnInv - generates a "virtual" column from # the state table and applies the weird galois math def mixColumnsInv(state): for i in range(4): column = [] # create the column by taking the same item out of each "virtual" row for j in range(4): column.append(state[j*4+i]) # apply mixColumn on our virtual column mixColumnInv(column) # transfer the new values back into the state table for j in range(4): state[j*4+i] = column[j] # aesRound applies each of the four transformations in order def aesRound(state, roundKey): #print "aesRound - before subBytes:", state subBytes(state) #print "aesRound - before shiftRows:", state shiftRows(state) #print "aesRound - before mixColumns:", state mixColumns(state) #print "aesRound - before addRoundKey:", state addRoundKey(state, roundKey) #print "aesRound - after addRoundKey:", state # aesRoundInv applies each of the four inverse transformations def aesRoundInv(state, roundKey): #print "aesRoundInv - before addRoundKey:", state addRoundKey(state, roundKey) #print "aesRoundInv - before mixColumnsInv:", state mixColumnsInv(state) #print "aesRoundInv - before shiftRowsInv:", state shiftRowsInv(state) #print "aesRoundInv - before subBytesInv:", state subBytesInv(state) #print "aesRoundInv - after subBytesInv:", state # returns a 16-byte round key based on an expanded key and round number def createRoundKey(expandedKey, n): return expandedKey[(n*16):(n*16+16)] # create a key from a user-supplied password using SHA-256 def passwordToKey(password): sha256 = hashlib.sha256() sha256.update(password) key = [] for c in list(sha256.digest()): key.append(ord(c)) return key # wrapper function for 14 rounds of AES since we're using a 256-bit key def aesMain(state, expandedKey, numRounds=14): roundKey = createRoundKey(expandedKey, 0) addRoundKey(state, roundKey) for i in range(1, numRounds): roundKey = createRoundKey(expandedKey, i) aesRound(state, roundKey) # final round - leave out the mixColumns transformation roundKey = createRoundKey(expandedKey, numRounds) subBytes(state) shiftRows(state) addRoundKey(state, roundKey) # 14 rounds of AES inverse since we're using a 256-bit key def aesMainInv(state, expandedKey, numRounds=14): # create roundKey for "last" round since we're going in reverse roundKey = createRoundKey(expandedKey, numRounds) # addRoundKey is the same funtion for inverse since it uses XOR addRoundKey(state, roundKey) shiftRowsInv(state) subBytesInv(state) for i in range(numRounds-1,0,-1): roundKey = createRoundKey(expandedKey, i) aesRoundInv(state, roundKey) # last round - leave out the mixColumns transformation roundKey = createRoundKey(expandedKey, 0) addRoundKey(state, roundKey) # aesEncrypt - encrypt a single block of plaintext def aesEncrypt(plaintext, key): block = copy(plaintext) expandedKey = expandKey(key) aesMain(block, expandedKey) return block # aesDecrypt - decrypte a single block of ciphertext def aesDecrypt(ciphertext, key): block = copy(ciphertext) expandedKey = expandKey(key) aesMainInv(block, expandedKey) return block # return 16-byte block from an open file # pad to 16 bytes with null chars if needed def getBlock(fp): raw = fp.read(16) # reached end of file if len(raw) == 0: return "" # container for list of bytes block = [] for c in list(raw): block.append(ord(c)) # if the block is less than 16 bytes, pad the block # with the string representing the number of missing bytes if len(block) < 16: padChar = 16-len(block) while len(block) < 16: block.append(padChar) return block # encrypt - wrapper function to allow encryption of arbitray length # plaintext using Output Feedback (OFB) mode def encrypt(myInput, password, outputfile=None): block = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # plaintext ciphertext = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # ciphertext # Initialization Vector IV = [] for i in range(16): IV.append(randint(0, 255)) # convert password to AES 256-bit key aesKey = passwordToKey(password) # create handle for file to be encrypted try: fp = open(myInput, "rb") except: print "pyAES: unable to open input file -", myInput sys.exit() # create handle for encrypted output file if outputfile is not None: try: outfile = open(outputfile,"w") except: print "pyAES: unable to open output file -", outputfile sys.exit() else: filename = myInput+".aes" try: outfile = open(filename,"w") except: print "pyAES: unable to open output file -", filename sys.exit() # write IV to outfile for byte in IV: outfile.write(chr(byte)) # get the file size (bytes) # if the file size is a multiple of the block size, we'll need # to add a block of padding at the end of the message fp.seek(0,2) filesize = fp.tell() # put the file pointer back at the beginning of the file fp.seek(0) # begin reading in blocks of input to encrypt firstRound = True block = getBlock(fp) while block != "": if firstRound: blockKey = aesEncrypt(IV, aesKey) firstRound = False else: blockKey = aesEncrypt(blockKey, aesKey) for i in range(16): ciphertext[i] = block[i] ^ blockKey[i] # write ciphertext to outfile for c in ciphertext: outfile.write(chr(c)) # grab next block from input file block = getBlock(fp) # if the message ends on a block boundary, we need to add an # extra block of padding if filesize % 16 == 0: outfile.write(16*chr(16)) # close file pointers fp.close() outfile.close() # decrypt - wrapper function to allow decryption of arbitray length # ciphertext using Output Feedback (OFB) mode def decrypt(myInput, password, outputfile=None): block = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # ciphertext plaintext = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # plaintext container # convert password to AES 256-bit key aesKey = passwordToKey(password) # create handle for file to be encrypted try: fp = open(myInput, "rb") except: print "pyAES: unable to open input file -", myInput sys.exit() # create handle for file to be decrypted try: fp = open(myInput, "rb") except: print "pyAES: unable to open input file -", myInput sys.exit() # create handle for decrypted output file if outputfile is not None: try: outfile = open(outputfile,"w") except: print "pyAES: unable to open output file -", filename sys.exit() else: if myInput[-4:] == ".aes": filename = myInput[:-4] print "Using", filename, "for output file name." else: filename = raw_input("output file name: ") try: outfile = open(filename,"w") except: print "pyAES: unable to open output file -", filename sys.exit() # recover Initialization Vector, the first block in file IV = getBlock(fp) # get the file size (bytes) in order to handle the # padding at the end of the file fp.seek(0,2) filesize = fp.tell() # put the file pointer back at the first block of ciphertext fp.seek(16) # begin reading in blocks of input to decrypt firstRound = True block = getBlock(fp) while block != "": if firstRound: blockKey = aesEncrypt(IV, aesKey) firstRound = False else: blockKey = aesEncrypt(blockKey, aesKey) for i in range(16): plaintext[i] = block[i] ^ blockKey[i] # if we're in the last block of text -> throw out the # number of bytes represented by the last byte in the block if fp.tell() == filesize: plaintext = plaintext[0:-(plaintext[-1])] # write ciphertext to outfile for c in plaintext: outfile.write(chr(c)) # grab next block from input file block = getBlock(fp) # close file pointers fp.close() outfile.close() def printUsage(): print "./pyAES.py [-e <input file> | -d <input file>] [(optional) -o <output file>]" print "You will be prompted for a password after you specify the encryption/decryption args.\n" sys.exit() # gather command line arguments and validate input def main(): # containers for command line arguments inputfile = None outputfile = None for a in range(len(sys.argv)): if sys.argv[a] == "-e": try: inputfile = sys.argv[a+1] except: inputfile = raw_input("File to encrypt: ") elif sys.argv[a] == "-d": try: inputfile = sys.argv[a+1] except: inputfile = raw_input("File to decrypt: ") if sys.argv[a] == "-o": try: outputfile = sys.argv[a+1] except: pass # print help message if ("-h" in sys.argv) or ("--help" in sys.argv): printUsage() if inputfile is None: print "Error: please specify options for encryption or decryption." printUsage() # encrypt file per user instructions if "-e" in sys.argv: #password = getpass.getpass("Password: ") password = 'godwin' print "Encrypting file:", inputfile if outputfile is not None: encrypt(inputfile, password, outputfile) else: encrypt(inputfile, password) print "Encryption complete." # decrypt file per user instructions elif "-d" in sys.argv: #password = getpass.getpass("Password: ") password = 'godwin' print "Decrypting file:", inputfile if outputfile is not None: decrypt(inputfile, password, outputfile) else: decrypt(inputfile, password) print "Decryption complete." if __name__ == "__main__": main() RSA: #!/usr/bin/python from random import randint, choice from math import log from string import atoi, replace, join from time import time import sys """ Globals to catch command line options """ infile = None outfile = None keyfile = None keylen = None # print help message def printHelp(): print "Usage: ./pyrsa.py [OPTION] [FILE]" print " or: ./pyrsa.py [OPTION] [VALUE]" print "Perform pyrsa function specified by OPTION on FILE or VALUE." print " -e, --encrypt\t\tencrypt FILE" print " -d, --decrypt\t\tdecrypt FILE" print " -k, --key\t\tencrypt or decrypt using FILE as key" print " -g, --generate\tgenerate public/private key pair of length" + \ " VALUE bits" print " -h, --help\t\tprint help message" # parse command line options def getOptions(): global infile, outfile, keyfile, keylen if (len(sys.argv) < 2): print "pyrsa: too few arguments" printHelp() sys.exit() try: for i in range(len(sys.argv)): if (sys.argv[i][0] == "-"): option = sys.argv[i][1:] if (option == "e") or (option == "-encrypt"): infile = sys.argv[i+1] elif (option == "d") or (option == "-decrypt"): outfile = sys.argv[i+1] elif (option == "k") or (option == "-key"): keyfile = sys.argv[i+1] elif (option == "g") or (option == "-generate"): keylen = sys.argv[i+1] elif (option == "h") or (option == "-help"): printHelp() sys.exit() except: print "pyrsa: error reading arguments" printHelp() sys.exit() # Return the highest bit that is set in decimal number n def highbit(n): return 2**(int(log(n, 2))) # Here is a modular exponentiation function that I wrote. It turns # out that the built-in function pow(x, y, z) is substantially faster. # We will use pow(x, y, z) for our purposes, but I will leave this code # in to demonstrate how the exponentiation might be done. def modExp(x, y, n): d = 1 mask = highbit(y) # step through the bits of y, the exponent while (mask > 0): d = (d*d)%n # if the mask bit is 1, multiply the result by x mod n if (y & mask): d = (d*x)%n # shift the mask bit mask = mask >> 1L return d # The witness function used in the Miller-Rabin primality test. # Returns true if a is a witness to the compositeness i.e. non-primality # of n. If true is returned, it is guaranteed that n is composite. However, # if false is returned, there is a chance that n is only pseudoprime. We # account for this in the actual primality test def witness(a, n): # return Composite right away if n is even if not n & 1: return True # solve for n-1 = (2^t)u, where (t >= 1) and u is odd num = n - 1 t = int(log(num,2)) while (t >= 1): if (num % (2**t) == 0): break t -= 1 u = num / (2**t) test = {} test[0] = pow(a, u, n) # square for i in range(1, t+1): test[i] = pow(test[i-1], 2, n) if (test[i]==1) and (test[i-1]!=1) and (test[i-1]!=n-1): return True if (test[t]!=1): return True return False # The Miller-Rabin test for primality: # The function tests witnesses for compositeness in the range of [1, n-1]. # Test is done s times to reduce chance of false positives for primality. # The probability of a false positive is at most 2^(-s) def isPrime(n, s): if n in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, \ 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]: return True for i in range(s): a = randint(1, n-1) if witness(a, n): return False return True # return an N bit prime number. Since we are using a value of 20 for # s in the Miller-Rabin test, the probability of a false prime is about # .000095% def bigPrime(N): p = randint(2**(N-1),2**N) while 1: # check primality with Miller-Rabin test with certainty of # 99.9999046% that p is prime if isPrime(p, 20): return p p += 1 # Compute the multiplicative inverse of a and b. This function is # essentially Euclid's Extended Algorithm. def inverse(a, b): e = a ; phiN = b v1 = [1, 0] v2 = [0, 1] while (a != 0) and (b != 0): if (a > b): m = a / b a %= b for i in range(2): v1[i] = v1[i] - m*v2[i] else: m = b / a b %= a for i in range(2): v2[i] = v2[i] - m*v1[i] if (a == 1): if (v1[0] < 0): return (v1[0]%phiN) else: return v1[0] else: if (v2[0] < 0): return (v2[0]%phiN) else: return v2[0] # Function to generate a public/private key pair. For N, we take # the product of two primes of user-specified length. For e, we use 17, # a moderate value in the balance between high security and ease of # computation. For d, we use Extended Euclidean to find the inverse of # e mod N def generateKey(keylen): # take a string to append to the begining of the key file names firstName = raw_input("\nEnter file identifier (i.e. first name): ") publicKey = firstName + "_publicKey.txt" privateKey = firstName + "_privateKey.txt" # exponentiation value e = 17 # generate public key: (e, N) with N as the product of two large primes fp = open(publicKey, "w") p = bigPrime(keylen/2) q = bigPrime(keylen/2) fp.write("----- Begin pyRSA Public Key Block -----\n") fp.write(str(e)) fp.write("\n") fp.write(str(p*q)) fp.write("\n") fp.write("----- End pyRSA Public Key Block -----") fp.close() # generate private key: (e, N) with d as the multiplicative inverse of # e mod N fp = open(privateKey, "w") phiN = (p - 1)*(q - 1) d = inverse(e, phiN) fp.write("----- Begin pyRSA Private Key Block -----\n") fp.write(str(d)) fp.write("\n") fp.write(str(p*q)) fp.write("\n") fp.write("----- End pyRSA Private Key Block -----") fp.close() # Function to convert a character string to a long integer. We use 8 bits # per character so the long integer takes no more space than the byte string # representing the ASCII text def string2long(s): m = 0 x = len(s) - 1 # loop backwards through string, for each character add its ASCII value # multiplied by its position in the string to the return value for char in s: m += (256**x)*ord(char) x -= 1 return m # Function to convert a long integer to a string. def long2string(m): try: m = atol(m) except: pass # temporary container for message characters letters = [] # string which will hold the return value cleartext = "" # treat the long integer as base-256 and loop through, converting each # base-256 "digit" to a character i = int(log(m, 256)) while (i >= 0): c = m / (256**i) letters.append(chr(c)) m -= c*(256**i) i -=1 # convert the list of characters to a single string for l in letters: cleartext += l return cleartext # Function to encrypt a character string into a numeric ciphertext. # KNOWN BUG: when message is too long, i.e. longer than the value of N, this # function cannot encrypt the message. # POSSIBLE FIX: in this case, break the message into fixed-sized blocks and # encrypt each block separately def encrypt(m): # container for the encryption key filename global keyfile if (keyfile == None): print "pyrsa: no encryption key specified. Use [-k FILE] option.\n" sys.exit() # convert the character string to a long integer message = string2long(m) # attempt to take the encryption key data from the key file try: fp = open(keyfile, "r") fp.readline() e = int(fp.readline()) N = int(fp.readline()) fp.close() except: print "Cannot read from private key file: ", keyfile return None # bail out if message is too long if (message > N): print "Message string is too long.\n" return None # encrypt the message with modular exponentiation using the values # from the encryption key message = pow(message, e, N) return message # decrypt a numeric ciphertext and convert it to a plaintext message def decrypt(m): # container for decryption key filename global keyfile if (keyfile == None): print "pyrsa: no decryption key specified. Use [-k FILE] option.\n" sys.exit() # attempt to take the decryption key data from the key file try: fp = open(keyfile, "r") fp.readline() d = int(fp.readline()) N = int(fp.readline()) fp.close() except: print "Cannot read from key file: ", keyfile return None # decrypt message using modular exponentiation message = pow(int(m), d, N) return long2string(message) # Main Function: get command line options and perform RSA functions based # on options def main(): global infile, outfile, keyfile, keylen # get command line options getOptions() if infile: m = open(infile, "r") message = m.readlines() m.close() message = join(message) print encrypt(message) elif outfile: c = open(outfile, "r") ciphertext = c.readlines() c.close() ciphertext = join(ciphertext) print "Decrypted text:\n", decrypt(ciphertext) elif keylen: generateKey(int(keylen)) if __name__ == "__main__": main()
×
×
  • Criar Novo...