Python不同版本實(shí)現(xiàn)配置文件加密
AES對(duì)稱加密
AES(Advanced Encryption Standard),在密碼學(xué)中又稱Rijndael加密法,是美國(guó)采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過(guò)五年的甄選流程,高級(jí)加密標(biāo)準(zhǔn)由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級(jí)加密標(biāo)準(zhǔn)已然成為對(duì)稱密鑰加密中最流行的算法之一。
高級(jí)加密標(biāo)準(zhǔn)(AES,Advanced Encryption Standard)是密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn),AES為分組加密法,把明文分成一組一組的,每組長(zhǎng)度相等,每次加密一組數(shù)據(jù),直到加密完整個(gè)明文,在AES標(biāo)準(zhǔn)規(guī)范中,分組長(zhǎng)度只能是128位,AES是按照字節(jié)進(jìn)行加密的,也就是說(shuō)每個(gè)分組為16個(gè)字節(jié)(每個(gè)字節(jié)8位)。密鑰的長(zhǎng)度可以使用128位、192位或256位。這導(dǎo)致密鑰長(zhǎng)度不同,推薦加密的輪數(shù)也不同。
1.明文P
沒(méi)有經(jīng)過(guò)加密的數(shù)據(jù)
2.密鑰K
用來(lái)加密明文的密碼,在對(duì)稱加密算法中,加密與解密的密鑰是相同的。密鑰為接收方與發(fā)送方協(xié)商產(chǎn)生,但不可以直接在網(wǎng)絡(luò)上傳輸,否則會(huì)導(dǎo)致密鑰泄漏,通常是通過(guò)非對(duì)稱加密算法加密密鑰,然后再通過(guò)網(wǎng)絡(luò)傳輸給對(duì)方,或者直接面對(duì)面商量密鑰。密鑰是絕對(duì)不可以泄漏的,否則會(huì)被攻擊者還原密文,竊取機(jī)密數(shù)據(jù)
3.AES加密函數(shù)
設(shè)AES加密函數(shù)為E,則 C = E(K, P),其中P為明文,K為密鑰,C為密文。也就是說(shuō),把明文P和密鑰K作為加密函數(shù)的參數(shù)輸入,則加密函數(shù)E會(huì)輸出密文C
4.密文C
經(jīng)加密函數(shù)處理后的數(shù)據(jù)
5.AES解密函數(shù)
設(shè)AES解密函數(shù)為D,則 P = D(K, C),其中C為密文,K為密鑰,P為明文。也就是說(shuō),把密文C和密鑰K作為解密函數(shù)的參數(shù)輸入,則解密函數(shù)會(huì)輸出明文P
Python Crypto 加密庫(kù)
# python不同版本不一樣 pip install pycryptodome (python3.7.3) pip install cryptography (python3.12.2)
python3.7.3 版本
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
def encrypt_config(config_file, encrypted_file):
"""加密配置文件"""
# 生成一個(gè) 16 字節(jié)的隨機(jī)密鑰
key = get_random_bytes(16)
print("Key: ", key)
# 讀取配置文件
with open(config_file, 'rb') as f:
plaintext = f.read()
# 加密
cipher = AES.new(key, AES.MODE_CBC)
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
with open(encrypted_file, 'wb') as f:
f.write(cipher.iv)
f.write(ciphertext)
print(f'File encrypted: {encrypted_file}')
def encrypt_config_one_key(config_files, encrypted_files):
"""加密配置文件,多個(gè)文件用同一個(gè)密鑰"""
if not isinstance(config_files, list) or not isinstance(encrypted_files, list):
raise TypeError('config_files and encrypted_files must be list')
# 生成一個(gè) 16 字節(jié)的隨機(jī)密鑰
key = get_random_bytes(16)
print("Key: ", key)
config_add_key(config_files[0], encrypted_files[0], key)
config_add_key(config_files[1], encrypted_files[1], key)
return
def config_add_key(config_file, encrypted_file, key):
# 讀取配置文件
with open(config_file, 'rb') as f:
plaintext = f.read()
# 加密
cipher = AES.new(key, AES.MODE_CBC)
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
with open(encrypted_file, 'wb') as f:
f.write(cipher.iv)
f.write(ciphertext)
print(f'File encrypted: {encrypted_file}')
def decrypt_config(encrypted_file, key):
"""解密配置文件"""
# 解密
with open(encrypted_file, 'rb') as f:
iv = f.read(16)
encrypted_data = f.read()
cipher = AES.new(key, AES.MODE_CBC, iv)
config_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
print(f'解密后的數(shù)據(jù): {config_data.decode()}')
if __name__ == '__main__':
# file1 = "/home/pi/printer_data/config/printer.cfg"
# target1 = "/home/pi/printer_data/config/test/printer_test.cfg"
# # encrypt_config(file1, target1)
# key1 = b'.)7[\x8c\xab\x12Y\xd6tm\x06\xe2\xd1l\xb5'
# key2 = b'\xf9\x19Uf\x11\xe9q\x0ci\x87\xe32%\xf8:W'
# # decrypt_config(target1, key1)
# decrypt_config(target2, key2)python3.12.2 版本
import pickle
import configparser
from cryptography.fernet import Fernet
import os
def cfg2bin(file, result_file):
# 讀取配置文件
config = configparser.ConfigParser()
config.read(file)
# 將配置文件對(duì)象序列化為二進(jìn)制文件
with open(result_file, 'wb') as f:
pickle.dump(config, f)
def encrypt_config(config_file, encrypted_file):
"""加密配置文件"""
# 生成密鑰
key = Fernet.generate_key()
print("Key: ", key)
# 讀取配置文件內(nèi)容
with open(config_file, 'r') as f:
config_data = f.read()
# 使用密鑰加密配置數(shù)據(jù)
fernet = Fernet(key)
encrypted_data = fernet.encrypt(config_data.encode())
# 寫(xiě)入加密后的文件
with open(encrypted_file, 'wb') as f:
f.write(encrypted_data)
print(f'配置文件已加密并保存為: {encrypted_file}')
def decrypt_config(encrypted_file, key):
"""解密配置文件"""
# 讀取加密后的文件
with open(encrypted_file, 'rb') as f:
encrypted_data = f.read()
# 使用密鑰解密配置數(shù)據(jù)
fernet = Fernet(key)
config_data = fernet.decrypt(encrypted_data).decode()
print(f'解密后的數(shù)據(jù): {config_data}')
if __name__ == '__main__':
file1 = "/home/cln/printer_data/config/printer.cfg"
file2 = "/home/cln/printer_data/config/mainsail.cfg"
target1 = "/home/cln/printer_data/config/test/printer_test.cfg"
target2 = "/home/cln/printer_data/config/test/mainsail.cfg"
# encrypt_config(file1, target1)
key1 = b'FN8eGSYuXtK2K7-X2jUcm6r1FK16PAzdTMOpg6wyLGQ='
decrypt_config(target1, key1)涉及模塊
- moonraker 動(dòng)態(tài)修改配置文件模塊
- klippy 讀取配置模塊
擠出機(jī)配置剝離
在打印機(jī)初始化加載完配置文件后,只針對(duì)擠出機(jī)的參數(shù)進(jìn)行賦值,達(dá)到棄用配置文件里的參數(shù)值
擠出機(jī)配置參數(shù)賦值實(shí)現(xiàn),可以創(chuàng)建一個(gè)常量類(放在util目錄下),或者單獨(dú)創(chuàng)建一個(gè)擠出機(jī)的ini配置,放在klippy目錄下
或者在toolhead模塊加載擠出機(jī)對(duì)象之前進(jìn)行擠出機(jī)配置參數(shù)賦值
配置文件參數(shù)
extruder 用到的所有參數(shù)值信息
到此這篇關(guān)于Python不同版本實(shí)現(xiàn)配置文件加密的文章就介紹到這了,更多相關(guān)Python配置文件加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于python 的legend圖例,參數(shù)使用說(shuō)明
這篇文章主要介紹了關(guān)于python 的legend圖例,參數(shù)使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python3中bytes類型轉(zhuǎn)換為str類型
Python 3最重要的新特性之一是對(duì)字符串和二進(jìn)制數(shù)據(jù)流做了明確的區(qū)分。這篇文章主要介紹了Python3中bytes類型轉(zhuǎn)換為str類型的相關(guān)知識(shí),需要的朋友可以參考下2018-09-09
Python簡(jiǎn)單爬蟲(chóng)導(dǎo)出CSV文件的實(shí)例講解
今天小編就為大家分享一篇Python簡(jiǎn)單爬蟲(chóng)導(dǎo)出CSV文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
python實(shí)現(xiàn)簡(jiǎn)單坦克大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單坦克大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
python使用turtle庫(kù)寫(xiě)六角形的思路與代碼
學(xué)習(xí)Python,接觸到turtle包,就用它來(lái)畫(huà)一下六邊形,下面這篇文章主要給大家介紹了關(guān)于python使用turtle庫(kù)寫(xiě)六角形的思路與代碼,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
如何用python腳本實(shí)現(xiàn)一次獲取token,多次使用token
這篇文章主要介紹了如何用python腳本實(shí)現(xiàn)一次獲取token,多次使用token問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Python利用pandas和matplotlib實(shí)現(xiàn)繪制雙柱狀圖
在數(shù)據(jù)分析和可視化中,常用的一種圖形類型是柱狀圖,柱狀圖能夠清晰地展示不同分類變量的數(shù)值,并支持多組數(shù)據(jù)進(jìn)行對(duì)比,本篇文章將介紹python如何使用pandas和matplotlib繪制雙柱狀圖,需要的可以參考下2023-11-11
Python實(shí)現(xiàn)多張圖片合成一張馬賽克圖片
這篇文章主要介紹了了Python如何實(shí)現(xiàn)將多張圖片合成一張馬賽克圖片。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以學(xué)習(xí)一下2021-12-12

