所需工具
使用python的pycrpto工具就可以簡單的完成AES加解密的程序,要注意的地方是使用的key跟vi需要是16byte的倍數長度的字串,以及加密的區快也需要是16byte的倍數,所以若資料量不足16byte則建議用\0補足16byte。
加密執行完畢後會產生file.encrypt, file.key,file.encrypt就是加密後的檔案,file.key則放入解密需要的資訊,若遺失了檔案就無法解密了。解密執行完畢後則會產生出file.decrypt,就是解密後的檔案。
加密執行完畢後會產生file.encrypt, file.key,file.encrypt就是加密後的檔案,file.key則放入解密需要的資訊,若遺失了檔案就無法解密了。解密執行完畢後則會產生出file.decrypt,就是解密後的檔案。
使用方法
python ./encrypt.py encrypt file
python ./encrypt.py decrypt file keyfile
import os, sys, json
from Crypto.Cipher import AES
if len(sys.argv) < 3 or ( sys.argv[1] == "decrypt" and len(sys.argv) != 4 ):
print "command encrypt/decrypt file (keyfile)"
action = sys.argv[1]
file = sys.argv[2]
def encrypt(file):
print "Encrypt now"
if os.path.isfile(file):
statinfo = os.stat(file)
size = statinfo.st_size
name = os.path.basename(file)
key = genkey(file, size)
obj = AES.new(key[0].decode('hex'), AES.MODE_CBC, key[1].decode('hex') ) # 將key轉回binrary格式再使用
chunksize = 16*4 #單次加密區塊大小 必須為16的倍數
encrypt_file = file + '.encrypt' # 加密後檔名
with open(file, 'rb') as inputfile:
with open(encrypt_file, 'wb') as outputfile:
while True:
chunk = inputfile.read(chunksize) # 讀取原始檔案
if len(chunk) == 0: # 加密完畢後退出迴圈
break
elif len(chunk) % chunksize != 0: # 若剩餘長度不足大小 自動補\0
chunk += '\0' * (chunksize - len(chunk) % chunksize)
outputfile.write(obj.encrypt(chunk)) # 寫入加密後的資料
print "Encrypt finish."
else:
print "Encrypt file not exist.";
def decrypt(file, key):
print "Decrypt now"
if os.path.isfile(file):
f = open(key, 'r')
key = eval(f.read()) # 讀取key
f.close()
obj = AES.new(key[0].decode('hex'), AES.MODE_CBC, key[1].decode('hex') ) # 將key轉回binrary格式再使用
chunksize = 16*4*4 # 解密區塊大小 必須為16的倍數
name = file.split('.')[0] + ".decrypt" # 解密後檔名
with open(file, 'rb') as inputfile:
with open(name, 'wb') as outputfile:
while True:
chunk = inputfile.read(chunksize)
if len(chunk) == 0: # 解密完畢後退出迴圈
break
outputfile.write(obj.decrypt(chunk)) # 寫入解密後的資料
outputfile.truncate(key[2]) # 將多餘的檔案去除
print "Decrypt finish."
else:
print "Decrypt file not exist.";
def genkey(file, size):
# 產生16byte長度的亂數
# [key, vi, filesize]
key = [ os.urandom(16).encode('hex'), os.urandom(16).encode('hex'), size] # 將亂數轉為字串方便存成文字檔
keyfile = file + ".key"
fk = open( keyfile, 'w')
fk.write(json.dumps(key))
fk.close()
return key
if action == "decrypt":
key = sys.argv[3]
decrypt(file, key)
else:
encrypt(file)