第二次實(shí)踐性作業(yè)

---第一

任意給定兩個(gè)素?cái)?shù)p和q百拓,p!= q晰甚,記 N = p * q 衙传,構(gòu)造Zn*,

問(編程解決):?

1厕九、是否每個(gè)元素都有inverse蓖捶?是否成群? 2扁远、這個(gè)集合有多少元素俊鱼?


判斷是否為素?cái)?shù)

def isprime():?

count =1?

while (count):?

n = int(input("輸入一個(gè)質(zhì)數(shù):"))?

for i in range(2, n):?

if n % i == 0:?

print(" %d 這不是一個(gè)質(zhì)數(shù)!" % n)?

break?

else:?

return n?

生成一個(gè)與N互素的列表

def CommonFactor(a,b):?

if a

? ? t = a?

? ? a = b?

? ? b = t?

while(a%b):?

? ? t = b?

? ? b = a % b?

? ? a = t?

return b?

判斷是否存在逆元

def is_inverse(list,n):?

mark=1?

for i in range(0,len(list)):?

count=1?

for j in range(0,len(list)):?

if((list[i]*list[j])%n==1):?

count =0?

print("%s存在逆元%s"%(list[i],list[j]),end="? ")?

if count:?

print("%s不存在逆元"%(list[i]),end="? ")?

mark=0?

print()?

if(mark):?

print("任何元素都有逆元")?

return mark?

判斷運(yùn)算是否封閉

def is_closed(list,n):?

mark=1?

for i in range(0, len(list)):?

for j in range(0, len(list)):?

count=0?

for k in range(0, len(list)):?

if((list[i]*list[j])%n == list[k]):?

count=1?

? ? ? ? ? ? ? ? num=list[k]?

if count:?

print("%s*%s封閉值為%s"%(list[i],list[j],num))?

else:?

print("%s*%s不封閉"%(list[i],list[j]))?

mark=0?

return mark?

主函數(shù)

def main():?

p=isprime()?

count=1?

while(count):?

? ? q=isprime()?

if not q==p:?

count=0?

else:?

print("與第一個(gè)質(zhì)數(shù)相同畅买,請(qǐng)重新輸入")?

n=p*q?

list=[]?

for i in range(1,n):?

? ? k=CommonFactor(i,n)?

if k==1:?

? ? ? ? list.append(i)?

for i in range(0,len(list)):?

print(list[i],end="? ")?

print()?

a=is_inverse(list,n)?

b=is_closed(list,n)?

if a==1 and b==1:?

print("任意元素都有逆元且運(yùn)算封閉并闲,成群")?

print("群元素有%s個(gè)"%(len(list)))?

elif a==0:?

print("存在元素沒有逆元,不成群")?

elif b==0:?

print("運(yùn)算不封閉谷羞,不成群")?

main()?


--- 第二

寫一個(gè)程序帝火,實(shí)現(xiàn)AES的S-box的構(gòu)造。

importsys, hashlib, string, getpass

fromcopyimportcopy

fromrandomimportrandint

#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

defrotate(word,n):

returnword[n:]+word[0:n]

#iterate over each "virtual" row in the state table and shift the bytes

#to the LEFT by the appropriate offset

defshiftRows(state):

foriinrange(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

defshiftRowsInv(state):

foriinrange(4):

state[i*4:i*4+4]=rotate(state[i*4:i*4+4],-i)

#takes 4-byte word and iteration number

defkeyScheduleCore(word,i):

#rotate word 1 byte to the left

word=rotate(word,1)

newWord=[]

#apply sbox substitution on all bytes of word

forbyteinword:

? ? ? ? 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]

returnnewWord

#expand 256 bit cipher key into 240 byte key from which

#each round key is derived

defexpandKey(cipherKey):

cipherKeySize=len(cipherKey)

assertcipherKeySize==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

foriinrange(cipherKeySize):

? ? ? ? expandedKey.append(cipherKey[i])

currentSize+=cipherKeySize

#generate the remaining bytes until we get a total key size

#of 240 bytes

whilecurrentSize<240:

#assign previous 4 bytes to the temporary storage t

foriinrange(4):

t[i]=expandedKey[(currentSize-4)+i]

#every 32 bytes apply the core schedule to t

ifcurrentSize%cipherKeySize==0:

t=keyScheduleCore(t, rconIter)

rconIter+=1

#since we're using a 256-bit key -> add an extra sbox transform

ifcurrentSize%cipherKeySize==16:

foriinrange(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

foriinrange(4):

expandedKey.append(((expandedKey[currentSize-cipherKeySize])^(t[i])))

currentSize+=1


returnexpandedKey

#do sbox transform on each of the values in the state table

defsubBytes(state):

foriinrange(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

defsubBytesInv(state):

foriinrange(len(state)):

state[i]=sboxInv[state[i]]

#XOR each byte of the roundKey with the state table

defaddRoundKey(state,roundKey):

foriinrange(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

defgaloisMult(a,b):

p=0

hiBitSet=0

foriinrange(8):

ifb&1==1:

p^=a

hiBitSet=a&0x80

a<<=1

ifhiBitSet==0x80:

a^=0x1b

b>>=1

returnp%256

#mixColumn takes a column and does stuff

defmixColumn(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

defmixColumnInv(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

defmixColumns(state):

foriinrange(4):

column=[]

#create the column by taking the same item out of each "virtual" row

forjinrange(4):

column.append(state[j*4+i])

#apply mixColumn on our virtual column

? ? ? ? mixColumn(column)

#transfer the new values back into the state table

forjinrange(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

defmixColumnsInv(state):

foriinrange(4):

column=[]

#create the column by taking the same item out of each "virtual" row

forjinrange(4):

column.append(state[j*4+i])

#apply mixColumn on our virtual column

? ? ? ? mixColumnInv(column)

#transfer the new values back into the state table

forjinrange(4):

state[j*4+i]=column[j]

#aesRound applies each of the four transformations in order

defaesRound(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

defaesRoundInv(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

defcreateRoundKey(expandedKey,n):

returnexpandedKey[(n*16):(n*16+16)]

#create a key from a user-supplied password using SHA-256

defpasswordToKey(password):

sha256=hashlib.sha256()

? ? sha256.update(password)

key=[]

forcinlist(sha256.digest()):

key.append(ord(c))

returnkey

#wrapper function for 14 rounds of AES since we're using a 256-bit key

defaesMain(state,expandedKey,numRounds=14):

roundKey=createRoundKey(expandedKey,0)

? ? addRoundKey(state, roundKey)

foriinrange(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

defaesMainInv(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)

foriinrange(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

defaesEncrypt(plaintext,key):

block=copy(plaintext)

expandedKey=expandKey(key)

? ? aesMain(block, expandedKey)

returnblock

#aesDecrypt - decrypte a single block of ciphertext

defaesDecrypt(ciphertext,key):

block=copy(ciphertext)

expandedKey=expandKey(key)

? ? aesMainInv(block, expandedKey)

returnblock

#return 16-byte block from an open file

#pad to 16 bytes with null chars if needed

defgetBlock(fp):

raw=fp.read(16)

#reached end of file

iflen(raw)==0:

return""

#container for list of bytes

block=[]

forcinlist(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

iflen(block)<16:

padChar=16-len(block)

whilelen(block)<16:

? ? ? ? ? ? block.append(padChar)

returnblock

#encrypt - wrapper function to allow encryption of arbitray length

#plaintext using Output Feedback (OFB) mode

defencrypt(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=[]

foriinrange(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

ifoutputfileisnotNone:

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

forbyteinIV:

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)

whileblock!="":

iffirstRound:

blockKey=aesEncrypt(IV, aesKey)

firstRound=False

else:

blockKey=aesEncrypt(blockKey, aesKey)

foriinrange(16):

ciphertext[i]=block[i]^blockKey[i]

#write ciphertext to outfile

forcinciphertext:

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

iffilesize%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

defdecrypt(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

ifoutputfileisnotNone:

try:

outfile=open(outputfile,"w")

except:

print"pyAES: unable to open output file -", filename

? ? ? ? ? ? sys.exit()

else:

ifmyInput[-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)

whileblock!="":

iffirstRound:

blockKey=aesEncrypt(IV, aesKey)

firstRound=False

else:

blockKey=aesEncrypt(blockKey, aesKey)

foriinrange(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

iffp.tell()==filesize:

plaintext=plaintext[0:-(plaintext[-1])]

#write ciphertext to outfile

forcinplaintext:

outfile.write(chr(c))

#grab next block from input file

block=getBlock(fp)

#close file pointers

? ? fp.close()

? ? outfile.close()

defprintUsage():

print"./pyAES.py [-e | -d ] [(optional) -o ]"

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

defmain():

#containers for command line arguments

inputfile=None

outputfile=None

forainrange(len(sys.argv)):

ifsys.argv[a]=="-e":

try:

inputfile=sys.argv[a+1]

except:

inputfile=raw_input("File to encrypt:")

elifsys.argv[a]=="-d":

try:

inputfile=sys.argv[a+1]

except:

inputfile=raw_input("File to decrypt:")

ifsys.argv[a]=="-o":

try:

outputfile=sys.argv[a+1]

except:

pass

#print help message

if("-h"insys.argv)or("--help"insys.argv):

? ? ? ? printUsage()

ifinputfileisNone:

print"Error: please specify options for encryption or decryption."

? ? ? ? printUsage()

#encrypt file per user instructions

if"-e"insys.argv:

password=getpass.getpass("Password:")

print"Encrypting file:", inputfile

ifoutputfileisnotNone:

? ? ? ? ? ? encrypt(inputfile, password, outputfile)

else:

? ? ? ? ? ? encrypt(inputfile, password)

print"Encryption complete."

#decrypt file per user instructions

elif"-d"insys.argv:

password=getpass.getpass("Password:")

print"Decrypting file:", inputfile

ifoutputfileisnotNone:

? ? ? ? ? ? decrypt(inputfile, password, outputfile)

else:

? ? ? ? ? ? decrypt(inputfile, password)

print"Decryption complete."

if__name__=="__main__":

? ? main()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末湃缎,一起剝皮案震驚了整個(gè)濱河市犀填,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雁歌,老刑警劉巖宏浩,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異靠瞎,居然都是意外死亡比庄,警方通過查閱死者的電腦和手機(jī)求妹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佳窑,“玉大人制恍,你說我怎么就攤上這事∩翊眨” “怎么了净神?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溉委。 經(jīng)常有香客問我鹃唯,道長,這世上最難降的妖魔是什么瓣喊? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任坡慌,我火速辦了婚禮,結(jié)果婚禮上藻三,老公的妹妹穿的比我還像新娘洪橘。我一直安慰自己,他們只是感情好棵帽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布熄求。 她就那樣靜靜地躺著,像睡著了一般逗概。 火紅的嫁衣襯著肌膚如雪弟晚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天仗谆,我揣著相機(jī)與錄音指巡,去河邊找鬼。 笑死隶垮,一個(gè)胖子當(dāng)著我的面吹牛藻雪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狸吞,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勉耀,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蹋偏?” 一聲冷哼從身側(cè)響起便斥,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎威始,沒想到半個(gè)月后枢纠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黎棠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年晋渺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镰绎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡木西,死狀恐怖畴栖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情八千,我是刑警寧澤吗讶,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站恋捆,受9級(jí)特大地震影響照皆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸠信,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一纵寝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧星立,春花似錦、人聲如沸葬凳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火焰。三九已至劲装,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昌简,已是汗流浹背占业。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纯赎,地道東北人谦疾。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像犬金,于是被迫代替她去往敵國和親念恍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 為了迎接2016級(jí)學(xué)生的到來晚顷,展現(xiàn)學(xué)院莘莘學(xué)子的風(fēng)采峰伙。人文傳媒學(xué)院于11月28日晚,在鳳凰音樂廳舉辦“一見傾新”迎...
    豈曰無衣_83d9閱讀 244評(píng)論 0 2
  • 葵花頌 圓臉朝天長長笑该默, 卵葉傍莖輕輕描瞳氓。 秋風(fēng)瀟瀟果掛梢, 歡聲笑語繞山腰栓袖。 向日葵 朵朵葵花沐陽光匣摘, 片片綠葉...
    金賽月閱讀 461評(píng)論 2 12
  • 想到那年回學(xué)校考試囊咏,重慶回瀘州的大巴車上恕洲,窗外綿延著水墨畫般的油菜花,以及淅淅瀝瀝的雨梅割,一想到馬上就要見到你霜第,滿心...
    何小擺閱讀 359評(píng)論 2 2
  • 才飲小三酒,又食石鍋魚户辞。人生黯然過半泌类,何必太苦逼。日日把酒臨風(fēng)底燎,夜夜歌舞升平刃榨,夏日做假期。瓊漿滿玉杯双仍,珍饈香入鼻枢希。...
    古都草堂人閱讀 501評(píng)論 0 0