今天由於突然需要運送一個很重要檔案,
因此臨時寫了一個Fernet加解密檔案的程式,
結(jié)果意外的好用的說~(^?^)ノ
使用的語言是Python3,
考慮到有人不會Python及其執(zhí)行方法,
所以我就把他轉(zhuǎn)成執(zhí)行檔了。
我知道很多人會說什麼:
「執(zhí)行檔很危險!」
「裡面會不會有插入怪怪的程式嗎?」
「檔案真的沒有被竄改過嗎?」
「會不會在第三方分享平臺上被竄改過?」
因此,
我打算讓諸君體會一下,
一個嚴謹?shù)臋n案交流方式,
而如果你未來有打算到暗網(wǎng)去買/賣資料,
(我是說如果啦,如果真的有的話….
請把這個流程記清楚,
並養(yǎng)成對應的習慣。
檔案原始碼:
——————————————————————
# File Encrypter V1.0
# Coded by Falsedeer(虛鹿), 2022 Jan
from cryptography.fernet import Fernet
import os.path as path
import sys
class Fernet_Hdlr():
def key_gen(self):
# generate key
genkey = Fernet.generate_key()
# writting key value to tmpkey.key
with open('tmpkey.key', 'wb') as khandler:
khandler.write(genkey)
khandler.close()
return genkey
def key_read(self, filename):
# read from file
with open(filename, 'rb') as rhandler:
key = rhandler.read()
rhandler.close()
return key
def file_chk(self, filename):
extg = path.isfile(filename)
print("[#]File existance: {}".format(extg))
if ( extg == True ):
pass
else:
sys.exit(0)
# handle file encryption
def encr(self, key, filename, newname):
encr = Fernet(key)
with open(filename, 'rb') as file:
content = file.read()
file.close()
encrcontent = encr.encrypt(content)
with open(newname, 'wb') as file:
file.write(encrcontent)
file.close()
# handle file decryption
def decr(self, key, filename, newname):
encr = Fernet(key)
with open(filename, 'rb') as file:
content = file.read()
file.close()
decrcontent = encr.decrypt(content)
with open(newname, 'wb') as file:
file.write(decrcontent)
file.close()
# main
encrypt=Fernet_Hdlr()
print("####### Fernet En/Decrypter ######")
print("####### By Falsedeer(虛鹿)#######")
print("####### Coded in 2022, Jan #######")
print("")
print("[#]Please specify current operation.")
keystat = input("[#]Encrytion(en)/Decryption(de): ")
if (keystat.casefold() == "en"):
opt = input("[#]Using exist key? (Y/N):")
print("")
if ( opt.casefold() == 'n' ):
# use new key
key = encrypt.key_gen()
# decode and show fernet temporary key to user
print("[#]Encryption: Fernet")
dkey=key.decode(encoding='utf-8')
print("[#]Key value: {}".format(dkey))
print("[#]Key saved into tmpkey.key by default.")
print("")
name = input("[#]Target file: ")
extg = encrypt.file_chk(name)
print("")
newname = input("[#]New filename: ")
encrypt.encr(key, name, newname)
print("[#]Done.")
sys.exit(0)
else:
print("[#]Encryption: Fernet")
keyfile = input("[#]Key file: ")
encrypt.file_chk(keyfile)
key = encrypt.key_read(keyfile)
dkey = key.decode(encoding='utf-8')
print("[#]Key value: {}".format(dkey))
print("")
name = input("[#]Target file: ")
encrypt.file_chk(name)
newname = input("[#]New filename: ")
encrypt.encr(key, name, newname)
print("[#]Done.")
sys.exit(0)
else:
print("[#]Decryption: Fernet")
keyfile = input("[#]Key file: ")
encrypt.file_chk(keyfile)
key = encrypt.key_read(keyfile)
dkey = key.decode(encoding='utf-8')
print("")
name = input("[#]Target file: ")
encrypt.file_chk(name)
newname = input("[#]New filename: ")
encrypt.decr(key, name, newname)
print("[#]Done.")
sys.exit(0)
—————————————————————-
[#] Step 1: 下載檔案:
含有:falsedeer.zip
壓縮檔的電子簽章:
含有:zip.sig
VirusTotal 檢測結(jié)果:無毒
[#] Step 2: 取得寄件人的public key:
虛鹿2022年的GPG公鑰(public key):
Key ID(long): 784892CCFA96CD4E
Key ID(short): FA96CD4E
附上兩個從第三方平臺取得窩的公鑰的方法,
由於pgp server蠻不穩(wěn)定的,
所以失敗就自己多執(zhí)行幾次、或換個時間執(zhí)行。
要是你真的不行的話,
zip檔內(nèi)我有一份export出來的公鑰讓你匯入,
讓你多少也能參與一下,
很貼心對吧?
( hkp是用11371 port,有些機掰的防火牆會擋。
“gpg2 --keyserver keys.openpgp.org --search-keys 784892CCFA96CD4E”
“gpg2 --keyserver pgp.mit.edu --search-keys 784892CCFA96CD4E”
對於拿不到我的public key的人們,
你可以先解壓縮 falsedeer.zip ,
( 雖說理論上不符流程……
我的public key放在falsedeer.asc中,
直接執(zhí)行 “gpg —import falsedeer.asc” 匯入。
[#]Step 3: 驗證外層包裝(zip)的電子簽章
其實最好的方法是直接簽在 falsedeer.zip 上,
畢竟這樣能夠確保內(nèi)容物完全沒有被動過。
我確實也有簽啦,
但要是你們無法在伺服器上拿到我的公鑰,
那麼你就得先解壓縮zip檔,
理論上來說在認證前解壓縮是不安全的….OwO
好啦,不重要,
總之你在拿到我的 public key 後,
你可以執(zhí)行”gpg —verify zip.sig falsedeer.zip”
只要顯示Good Signature,
就代表檔案在上次被我簽名後,
就未曾受過任何變更。
解壓縮後,
裡面有 fernet(執(zhí)行檔)、falsedeer.asc(虛鹿的公鑰備份)、SHA256SUMS(檔案封裝前所有檔案的Sha256)、SHA256SUMS.sig(證明SHA256SUMS中的檔案sha256值並未被竄改的簽名檔)。
[#] Step 4: 驗證內(nèi)容物的Sha256的紀錄檔的電子簽章。
執(zhí)行”gpg —verify SHA256SUMS.sig”,
確認檔案是Good Signature,
並未被竄改。
[#]Step 5: 檢驗內(nèi)容物個別的Sha256使否與被簽名的紀錄檔中的一致。
在確認裡面檔案的sha256sum,
是跟我封裝時的一模一樣之後。
可用SHA256SUMS檢驗其餘檔案的完整性。
執(zhí)行 “sha256sum —check SHA256SUM”
會比對現(xiàn)有檔案的sha256與紀錄檔中的值是否一致。
若一切正常的話,
你會看到檔案名字旁邊跟著”O(jiān)K”。
[#]Step 6: 安全的呦!
沒問題的話,
就去安心執(zhí)行看看fernet加密程式吧,
還有記得不要弄丟tmpkey.key中的密碼,
否則我也救不了你的說~(^ ^)