mirror of
https://github.com/HACKERALERT/Picocrypt.git
synced 2024-12-30 11:22:18 +00:00
Update Picocrypt.py
This commit is contained in:
parent
31f9613591
commit
2f940d3dbd
1 changed files with 90 additions and 39 deletions
|
@ -22,12 +22,13 @@ from Crypto.Hash import SHA3_512 as sha3_512
|
||||||
from secrets import compare_digest
|
from secrets import compare_digest
|
||||||
from os import urandom,fsync,remove,system
|
from os import urandom,fsync,remove,system
|
||||||
from os.path import getsize,expanduser,isdir
|
from os.path import getsize,expanduser,isdir
|
||||||
from os.path import dirname,abspath
|
from os.path import dirname,abspath,realpath
|
||||||
from os.path import join as pathJoin
|
from os.path import join as pathJoin
|
||||||
from os.path import split as pathSplit
|
from os.path import split as pathSplit
|
||||||
from tkinterdnd2 import TkinterDnD,DND_FILES
|
from tkinterdnd2 import TkinterDnD,DND_FILES
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from shutil import rmtree
|
||||||
import sys
|
import sys
|
||||||
import tkinter
|
import tkinter
|
||||||
import tkinter.ttk
|
import tkinter.ttk
|
||||||
|
@ -45,6 +46,7 @@ except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Global variables and notices
|
# Global variables and notices
|
||||||
|
rootDir = dirname(realpath(__file__))
|
||||||
inputFile = ""
|
inputFile = ""
|
||||||
outputFile = ""
|
outputFile = ""
|
||||||
outputPath = ""
|
outputPath = ""
|
||||||
|
@ -55,7 +57,8 @@ working = False
|
||||||
gMode = None
|
gMode = None
|
||||||
headerRsc = None
|
headerRsc = None
|
||||||
draggedFiles = False
|
draggedFiles = False
|
||||||
dragFolderPath = False
|
draggedFolderPaths = False
|
||||||
|
filesToErase = False
|
||||||
adString = "File metadata (used to store some text along with the file):"
|
adString = "File metadata (used to store some text along with the file):"
|
||||||
compressingNotice = "Compressing files together..."
|
compressingNotice = "Compressing files together..."
|
||||||
passwordNotice = "Error. The provided password is incorrect."
|
passwordNotice = "Error. The provided password is incorrect."
|
||||||
|
@ -68,6 +71,7 @@ kVeryCorruptedNotice = "The input file is badly corrupted, but the output has be
|
||||||
derivingNotice = "Deriving key (takes a few seconds)..."
|
derivingNotice = "Deriving key (takes a few seconds)..."
|
||||||
keepNotice = "Keep decrypted output even if it's corrupted or modified"
|
keepNotice = "Keep decrypted output even if it's corrupted or modified"
|
||||||
eraseNotice = "Securely erase and delete original file"
|
eraseNotice = "Securely erase and delete original file"
|
||||||
|
erasingNotice = "Securely erasing original file(s)..."
|
||||||
overwriteNotice = "Output file already exists. Would you like to overwrite it?"
|
overwriteNotice = "Output file already exists. Would you like to overwrite it?"
|
||||||
rsNotice = "Prevent corruption using Reed-Solomon"
|
rsNotice = "Prevent corruption using Reed-Solomon"
|
||||||
rscNotice = "Creating Reed-Solomon tables..."
|
rscNotice = "Creating Reed-Solomon tables..."
|
||||||
|
@ -94,7 +98,7 @@ s.configure("TCheckbutton",background="#f5f6f7")
|
||||||
# Event when user selects an input file
|
# Event when user selects an input file
|
||||||
def inputSelected(draggedFile=None):
|
def inputSelected(draggedFile=None):
|
||||||
global inputFile,working,headerRsc,draggedFiles
|
global inputFile,working,headerRsc,draggedFiles
|
||||||
global dragFolderPath
|
global draggedFolderPaths,filesToErase
|
||||||
dummy.focus()
|
dummy.focus()
|
||||||
status.config(cursor="")
|
status.config(cursor="")
|
||||||
status.bind("<Button-1>",lambda e:None)
|
status.bind("<Button-1>",lambda e:None)
|
||||||
|
@ -102,7 +106,8 @@ def inputSelected(draggedFile=None):
|
||||||
# Try to handle when select file is cancelled
|
# Try to handle when select file is cancelled
|
||||||
try:
|
try:
|
||||||
draggedFiles = None
|
draggedFiles = None
|
||||||
dragFolderPath = None
|
filesToErase = None
|
||||||
|
draggedFolderPaths = []
|
||||||
# Ask for input file
|
# Ask for input file
|
||||||
suffix = ""
|
suffix = ""
|
||||||
if not draggedFile:
|
if not draggedFile:
|
||||||
|
@ -114,20 +119,47 @@ def inputSelected(draggedFile=None):
|
||||||
raise Exception("No file selected.")
|
raise Exception("No file selected.")
|
||||||
inputFile = tmp
|
inputFile = tmp
|
||||||
else:
|
else:
|
||||||
# Check if multiple files
|
tmp = [i for i in draggedFile]
|
||||||
if "} {" in draggedFile:
|
res = []
|
||||||
draggedFiles = draggedFile[1:-1]
|
within = False
|
||||||
draggedFiles = draggedFiles.split("} {")
|
tmpName = ""
|
||||||
elif " " in draggedFile and "{" not in draggedFile:
|
for i in tmp:
|
||||||
draggedFiles = draggedFile.split()
|
if i=="{":
|
||||||
|
within = True
|
||||||
|
elif i=="}":
|
||||||
|
within = False
|
||||||
|
res.append(tmpName)
|
||||||
|
tmpName = ""
|
||||||
else:
|
else:
|
||||||
if isdir(draggedFile):
|
print(tmpName)
|
||||||
draggedFiles = Path(draggedFile).rglob("*")
|
if i==" " and not within:
|
||||||
draggedFiles = [abspath(i) for i in draggedFiles]
|
if tmpName!="":
|
||||||
dragFolderPath = draggedFile
|
res.append(tmpName)
|
||||||
|
tmpName = ""
|
||||||
else:
|
else:
|
||||||
draggedFile = draggedFile.replace("{","")
|
tmpName += i
|
||||||
inputFile = draggedFile.replace("}","")
|
if tmpName:
|
||||||
|
res.append(tmpName)
|
||||||
|
|
||||||
|
draggedFiles = []
|
||||||
|
filesToErase = []
|
||||||
|
|
||||||
|
for i in res:
|
||||||
|
if isdir(i):
|
||||||
|
draggedFolderPaths.append(i)
|
||||||
|
tmp = Path(i).rglob("*")
|
||||||
|
for p in tmp:
|
||||||
|
draggedFiles.append(abspath(p))
|
||||||
|
else:
|
||||||
|
filesToErase.append(i)
|
||||||
|
|
||||||
|
draggedFiles = list(filter(lambda i:not isdir(i),draggedFiles))
|
||||||
|
|
||||||
|
if len(draggedFiles)==1:
|
||||||
|
draggedFiles = []
|
||||||
|
inputFile = draggedFiles[0]
|
||||||
|
else:
|
||||||
|
inputFile = ""
|
||||||
|
|
||||||
# Decide if encrypting or decrypting
|
# Decide if encrypting or decrypting
|
||||||
if ".pcv" in inputFile.split("/")[-1]:
|
if ".pcv" in inputFile.split("/")[-1]:
|
||||||
|
@ -183,7 +215,7 @@ def inputSelected(draggedFile=None):
|
||||||
|
|
||||||
# Show selected file(s)
|
# Show selected file(s)
|
||||||
if draggedFiles:
|
if draggedFiles:
|
||||||
inputString.set(f"{len(draggedFiles)} files selected"+
|
inputString.set(f"{len(draggedFiles)} file(s) selected"+
|
||||||
" (will encrypt).")
|
" (will encrypt).")
|
||||||
else:
|
else:
|
||||||
inputString.set(inputFile.split("/")[-1]+suffix)
|
inputString.set(inputFile.split("/")[-1]+suffix)
|
||||||
|
@ -212,6 +244,7 @@ def inputSelected(draggedFile=None):
|
||||||
|
|
||||||
# Allow drag and drop
|
# Allow drag and drop
|
||||||
def onDrop(e):
|
def onDrop(e):
|
||||||
|
print(e.data)
|
||||||
inputSelected(e.data)
|
inputSelected(e.data)
|
||||||
tk.drop_target_register(DND_FILES)
|
tk.drop_target_register(DND_FILES)
|
||||||
tk.dnd_bind("<<Drop>>",onDrop)
|
tk.dnd_bind("<<Drop>>",onDrop)
|
||||||
|
@ -290,7 +323,7 @@ cpasswordInput["state"] = "disabled"
|
||||||
# Start the encryption/decryption process
|
# Start the encryption/decryption process
|
||||||
def start():
|
def start():
|
||||||
global inputFile,outputFile,password,ad,kept
|
global inputFile,outputFile,password,ad,kept
|
||||||
global working,gMode,headerRsc,draggedFiles
|
global working,gMode,headerRsc,draggedFiles,filesToErase
|
||||||
global dragFolderPath
|
global dragFolderPath
|
||||||
dummy.focus()
|
dummy.focus()
|
||||||
reedsolo = False
|
reedsolo = False
|
||||||
|
@ -347,19 +380,13 @@ def start():
|
||||||
if draggedFiles:
|
if draggedFiles:
|
||||||
statusString.set(compressingNotice)
|
statusString.set(compressingNotice)
|
||||||
tmp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
tmp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
||||||
if dragFolderPath:
|
zfPath = Path(draggedFiles[0]).parent.absolute()
|
||||||
zfName = Path(dragFolderPath).parent.absolute()
|
zfOffset = len(str(zfPath))
|
||||||
zfName = pathJoin(zfName,tmp+".zip")
|
zfName = pathJoin(zfPath,tmp+".zip")
|
||||||
else:
|
|
||||||
zfName = Path(draggedFiles[0]).parent.absolute()
|
|
||||||
zfName = pathJoin(zfName,tmp+".zip")
|
|
||||||
zf = ZipFile(zfName,"w")
|
zf = ZipFile(zfName,"w")
|
||||||
for i in draggedFiles:
|
for i in draggedFiles:
|
||||||
if dragFolderPath:
|
zf.write(i,i[zfOffset:])
|
||||||
nameOffset = len(dragFolderPath)
|
|
||||||
zf.write(i,i[nameOffset:])
|
|
||||||
else:
|
|
||||||
zf.write(i,pathSplit(i)[1])
|
|
||||||
zf.close()
|
zf.close()
|
||||||
inputFile = zfName
|
inputFile = zfName
|
||||||
outputFile = zfName+".pcv"
|
outputFile = zfName+".pcv"
|
||||||
|
@ -474,7 +501,7 @@ def start():
|
||||||
password,
|
password,
|
||||||
salt,
|
salt,
|
||||||
time_cost=8, # 8 iterations
|
time_cost=8, # 8 iterations
|
||||||
memory_cost=2**20, # 2^20 Kibibytes (1GiB)
|
memory_cost=2**10, # 2^20 Kibibytes (1GiB)
|
||||||
parallelism=8, # 8 parallel threads
|
parallelism=8, # 8 parallel threads
|
||||||
hash_len=32,
|
hash_len=32,
|
||||||
type=Type.ID
|
type=Type.ID
|
||||||
|
@ -687,17 +714,26 @@ def start():
|
||||||
fout.close()
|
fout.close()
|
||||||
fin.close()
|
fin.close()
|
||||||
|
|
||||||
|
print(draggedFolderPaths)
|
||||||
|
print(draggedFiles)
|
||||||
|
print(filesToErase)
|
||||||
|
input()
|
||||||
# Securely wipe files as necessary
|
# Securely wipe files as necessary
|
||||||
if wipe:
|
if wipe:
|
||||||
progress.config(mode="indeterminate")
|
if draggedFolderPaths:
|
||||||
progress.start(15)
|
for i in draggedFolderPaths:
|
||||||
if draggedFiles:
|
|
||||||
for i in draggedFiles:
|
|
||||||
print("==============="+i)
|
|
||||||
secureWipe(i)
|
secureWipe(i)
|
||||||
|
if filesToErase:
|
||||||
|
for i in range(len(filesToErase)):
|
||||||
|
statusString.set(erasingNotice+f" ({i}/{len(filesToErase)}")
|
||||||
|
progress["value"] = i/len(filesToErase)
|
||||||
|
print("Erasing file "+filesToErase[i])
|
||||||
|
secureWipe(filesToErase[i])
|
||||||
secureWipe(inputFile)
|
secureWipe(inputFile)
|
||||||
|
# Secure wipe not enabled
|
||||||
else:
|
else:
|
||||||
if draggedFiles:
|
if draggedFiles:
|
||||||
|
# Remove temporary zip file if created
|
||||||
remove(inputFile)
|
remove(inputFile)
|
||||||
|
|
||||||
# Show appropriate notice if file corrupted or modified
|
# Show appropriate notice if file corrupted or modified
|
||||||
|
@ -763,10 +799,25 @@ def startWorker():
|
||||||
|
|
||||||
# Securely wipe file
|
# Securely wipe file
|
||||||
def secureWipe(fin):
|
def secureWipe(fin):
|
||||||
statusString.set("Securely erasing original file...")
|
global draggedFiles
|
||||||
|
statusString.set(erasingNotice)
|
||||||
# Check platform, erase accordingly
|
# Check platform, erase accordingly
|
||||||
if platform.system()=="Windows":
|
if platform.system()=="Windows":
|
||||||
system(f'sdelete64.exe "{fin}" -p 4')
|
if isdir(fin):
|
||||||
|
paths = []
|
||||||
|
for i in Path(fin).rglob("*"):
|
||||||
|
if dirname(i) not in paths:
|
||||||
|
paths.append(dirname(i))
|
||||||
|
for i in range(len(paths)):
|
||||||
|
statusString.set(erasingNotice+f" ({i}/{len(paths)})")
|
||||||
|
progress["value"] = 100*i/len(paths)
|
||||||
|
system(f'cd "{paths[i]}" && "{rootDir}/sdelete64.exe" * -p 4 -s -nobanner')
|
||||||
|
system(f'cd "{i}"')
|
||||||
|
rmtree(fin)
|
||||||
|
else:
|
||||||
|
statusString.set(erasingNotice)
|
||||||
|
progress["value"] = 100
|
||||||
|
system(f'sdelete64.exe "{fin}" -p 4 -nobanner')
|
||||||
elif platform.system()=="Darwin":
|
elif platform.system()=="Darwin":
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
|
@ -982,7 +1033,7 @@ def createRsc():
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def prepare():
|
def prepare():
|
||||||
system("sdelete64.exe /accepteula")
|
system("sdelete64.exe /accepteula -nobanner")
|
||||||
|
|
||||||
# Close window only if not encrypting or decrypting
|
# Close window only if not encrypting or decrypting
|
||||||
def onClose():
|
def onClose():
|
||||||
|
|
Loading…
Reference in a new issue