切換
舊版
前往
大廳
主題

雜談(1):GPG簽章教學 + 虛鹿贈送的Fernet 加/解密程式

虛鹿 | 2022-01-13 18:49:18 | 巴幣 18 | 人氣 423

今天由於突然需要運送一個很重要檔案,
因此臨時寫了一個Fernet加解密檔案的程式,
結果意外的好用的說~(^ー^)ノ
使用的語言是Python3,
考慮到有人不會Python及其執行方法,
所以我就把他轉成執行檔了。

我知道很多人會說什麼:
「執行檔很危險!」
「裡面會不會有插入怪怪的程式嗎?」
「檔案真的沒有被竄改過嗎?」
「會不會在第三方分享平台上被竄改過?」

因此,
我打算讓諸君體會一下,
一個嚴謹的檔案交流方式,
而如果你未來有打算到暗網去買/賣資料,
(我是說如果啦,如果真的有的話….
請把這個流程記清楚,
並養成對應的習慣。

檔案原始碼:
——————————————————————
# 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 檢測結果:無毒

[#] Step 2: 取得寄件人的public key:

虛鹿2022年的GPG公鑰(public key):
Key ID(long): 784892CCFA96CD4E
Key ID(short): FA96CD4E

附上兩個從第三方平台取得窩的公鑰的方法,
由於pgp server蠻不穩定的,
所以失敗就自己多執行幾次、或換個時間執行。
要是你真的不行的話,
zip檔內我有一份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中,
直接執行 “gpg —import falsedeer.asc” 匯入。


[#]Step 3: 驗證外層包裝(zip)的電子簽章

其實最好的方法是直接簽在 falsedeer.zip 上,
畢竟這樣能夠確保內容物完全沒有被動過。
我確實也有簽啦,
但要是你們無法在伺服器上拿到我的公鑰,
那麼你就得先解壓縮zip檔,
理論上來說在認證前解壓縮是不安全的….OwO

好啦,不重要,
總之你在拿到我的 public key 後,
你可以執行”gpg —verify zip.sig falsedeer.zip”
只要顯示Good Signature,
就代表檔案在上次被我簽名後,
就未曾受過任何變更。

解壓縮後,
裡面有 fernet(執行檔)、falsedeer.asc(虛鹿的公鑰備份)、SHA256SUMS(檔案封裝前所有檔案的Sha256)、SHA256SUMS.sig(證明SHA256SUMS中的檔案sha256值並未被竄改的簽名檔)。


[#] Step 4: 驗證內容物的Sha256的紀錄檔的電子簽章。

執行”gpg —verify SHA256SUMS.sig”,
確認檔案是Good Signature,
並未被竄改。


[#]Step 5: 檢驗內容物個別的Sha256使否與被簽名的紀錄檔中的一致。

在確認裡面檔案的sha256sum,
是跟我封裝時的一模一樣之後。
可用SHA256SUMS檢驗其餘檔案的完整性。
執行 “sha256sum —check SHA256SUM”
會比對現有檔案的sha256與紀錄檔中的值是否一致。

一切正常的話,
你會看到檔案名字旁邊跟著”OK”。

[#]Step 6: 安全的呦!

沒問題的話,
就去安心執行看看fernet加密程式吧,
還有記得不要弄丟tmpkey.key中的密碼,
否則我也救不了你的說~(^ ^)
送禮物贊助創作者 !
0
留言

創作回應

Nero
2022-01-13 23:56:46
虛鹿
感謝
2022-01-14 23:21:53

更多創作