使用Python進行對稱和非對稱密鑰加密和解密
加密和解密是一種加密過程,通過使用加密密鑰將敏感信息轉(zhuǎn)換為不可讀格式(密文),然后使用解密密鑰逆轉(zhuǎn)過程將其恢復(fù)為原始可讀格式(明文),從而確保敏感信息的安全和保護。
加密:
加密涉及將明文數(shù)據(jù)轉(zhuǎn)換為密文,使未經(jīng)授權(quán)的個人或?qū)嶓w無法理解。這一過程是通過使用加密算法和加密密鑰來實現(xiàn)的。其目的是確保即使加密數(shù)據(jù)被未授權(quán)方截獲或訪問,他們也無法在沒有解密密鑰的情況下理解其內(nèi)容。
解密:
解密是加密的逆過程。它涉及將密文轉(zhuǎn)換回原始的明文形式。為了解密密文,需要使用相應(yīng)的解密算法和解密密鑰。獲得解密密鑰訪問權(quán)限的授權(quán)后方可以逆轉(zhuǎn)加密過程,并恢復(fù)原始數(shù)據(jù)。
這些過程在確保各種情況下的數(shù)據(jù)安全和保密性方面發(fā)揮著至關(guān)重要的作用,例如:
- 數(shù)據(jù)傳輸:在將數(shù)據(jù)通過網(wǎng)絡(luò)(如互聯(lián)網(wǎng))發(fā)送之前對其進行加密,有助于防止竊聽和數(shù)據(jù)攔截。
- 數(shù)據(jù)存儲:加密存儲可確保數(shù)據(jù)在物理存儲設(shè)備丟失、被盜或損壞的情況下免遭未經(jīng)授權(quán)的訪問。
- 身份驗證:加密通常用于身份驗證機制,以確保憑證、令牌和其他敏感信息的安全。
- 數(shù)字簽名:加密用于創(chuàng)建數(shù)字簽名,以驗證數(shù)字文件或信息的真實性和完整性。
- 安全通信:加密通信渠道(如HTTPS)可確保用戶瀏覽器和網(wǎng)絡(luò)服務(wù)器之間交換的數(shù)據(jù)安全。
現(xiàn)代加密技術(shù)包括對稱密鑰加密(使用相同的密鑰進行加密和解密)和非對稱密鑰加密(使用一對密鑰:公開密鑰和私人密鑰)。
對稱密鑰加密:
對稱密鑰加密是一種加密技術(shù),數(shù)據(jù)的加密和解密都使用相同的密鑰。換句話說,發(fā)送方和接收方共享同一密鑰。這一過程包括使用加密密鑰將明文數(shù)據(jù)轉(zhuǎn)換為密文,然后使用相同的密鑰進行解密,逆轉(zhuǎn)過程以獲得原始明文。
對稱密鑰解密:
對稱密鑰解密是使用加密時所使用的相同密鑰將加密數(shù)據(jù)(即密文)轉(zhuǎn)換回原始明文形式的過程。在對稱加密技術(shù)中,加密和解密都使用相同的密鑰。
非對稱密鑰加密:
非對稱密鑰加密又稱公鑰加密,是一種使用一對密鑰(公鑰和私鑰)來確保通信安全和保護數(shù)據(jù)的加密技術(shù)。對稱加密在加密和解密時使用相同的密鑰,而非對稱加密則不同,在這兩個過程中使用不同的密鑰。
非對稱密鑰解密:
非對稱密鑰解密是非對稱加密的一部分,在其中使用一對密鑰:用于加密的公鑰和用于解密的私鑰。公鑰可以公開共享,而私鑰必須保密。在此過程中,使用相應(yīng)公鑰加密的數(shù)據(jù)只能使用私鑰解密。
實現(xiàn)對稱密鑰加密的Python代碼:
圖片
對稱密鑰加密代碼解析:
import boto3和import os:導(dǎo)入必要的庫,Boto3用于與AWS交互,os用于操作系統(tǒng)相關(guān)的操作。
region_name = '<aws-region-name>'和kms_key_id = '<kms-key>':設(shè)置用于加密的AWS區(qū)域名稱和KMS密鑰ID。將<aws-region-name>和<kms-key>替換為實際值。
input_file_name = '<path-to-input-csv-file>'和output_file_name = '<path-to-store-the-output-encrypted-file>':指定要加密的輸入文件的路徑和存儲加密輸出的路徑。
kms_client = boto3.client('kms', region_name=region_name):為指定的AWS區(qū)域初始化KMS客戶端對象。
with open(input_file_name, 'rb') as input_file:以二進制模式('rb')打開輸入文件進行讀取。
input_data = input_file.read():將輸入文件(明文數(shù)據(jù))的內(nèi)容讀取到input_data變量中。
response = kms_client.encrypt(...):使用指定的KMS密鑰(kms_key_id)加密input_data。從響應(yīng)中獲取加密數(shù)據(jù)。
encrypted_data = response['CiphertextBlob']:從響應(yīng)中提取加密數(shù)據(jù)(密文)。
with open(output_file_name, 'wb') as output_file:以二進制模式('wb')打開一個新文件進行寫入。
output_file.write(encrypted_data):將加密數(shù)據(jù)(來自encrypted_data變量)寫入輸出文件。
實現(xiàn)對稱密鑰解密的Python代碼:
圖片
對稱密鑰解密代碼解析:
import boto3:導(dǎo)入Boto3庫,這是Python的AWS SDK。
region_name = '<aws-region-name>'和kms_key_id = '<kms-key>':設(shè)置用于解密的AWS區(qū)域名稱和KMS密鑰ID。將<aws-region-name>和<kms-key>替換為實際值。
input_file_name = '<path-of-the-encrypted-file>'和output_file_name = '<path-to-store-the-decrypted-file>':指定加密的輸入文件和解密的輸出文件的路徑。
kms_client = boto3.client('kms', region_name=region_name):為指定的AWS區(qū)域初始化KMS客戶端對象。
with open(input_file_name, 'rb') as input_file:以二進制模式('rb')打開加密的輸入文件進行讀取。
encrypted_data = input_file.read():將加密輸入文件(密文)的內(nèi)容讀取到encrypted_data變量中。
response = kms_client.decrypt(...):使用指定的KMS密鑰(kms_key_id)解密encrypted_data。從響應(yīng)中獲取解密數(shù)據(jù)。
decrypted_data = response['Plaintext']:從響應(yīng)中提取解密數(shù)據(jù)(明文)。
with open(output_file_name, 'wb') as output_file:以二進制模式('wb')打開一個新文件進行寫入。
output_file.write(decrypted_data):將解密數(shù)據(jù)(來自decrypted_data變量)寫入輸出文件。
decrypted_data = response['Plaintext']:再次將解密數(shù)據(jù)賦值給decrypted_data變量。
print(decrypted_data.decode('utf-8')):將解密數(shù)據(jù)解碼為UTF-8格式并打印到控制臺上。
實現(xiàn)非對稱密鑰加密的Python代碼:
圖片
非對稱密鑰加密代碼解析:
import boto3:導(dǎo)入Boto3庫,這是用于Python的AWS SDK。
kms = boto3.client('kms', region_name='<aws-region>'):為指定的AWS區(qū)域設(shè)置一個KMS客戶端對象。將<aws-region>替換為所需的AWS區(qū)域。
key_id = '<public-key-from-aws-kms>':指定將用于加密的公鑰的ID。你需要用AWS KMS中的實際密鑰ID替換此處。
response = kms.get_public_key(KeyId=key_id):檢索與指定密鑰ID相關(guān)聯(lián)的公鑰。
public_key = response['PublicKey']:從響應(yīng)中提取公鑰內(nèi)容。
with open('<path-of-file-to-encrypt>', 'rb') as f:以二進制模式('rb')打開要加密的文件以供讀取。將<path-of-file-to-encrypt>替換為實際的文件路徑。
data = f.read():將要加密的文件內(nèi)容讀取到數(shù)據(jù)變量中。
encrypted_data = kms.encrypt(...):使用公鑰(public_key)和指定的加密算法(RSAES_OAEP_SHA_1)對數(shù)據(jù)進行加密。加密后的數(shù)據(jù)存儲在encrypted_data變量中。
with open('<path-to-store-encrypted-file>', 'wb') as f:以二進制模式('wb')打開一個新文件以供寫入加密數(shù)據(jù)。將<path-to-store-encrypted-file>替換為存儲加密文件的目標(biāo)路徑。
f.write(encrypted_data['CiphertextBlob']):將加密的密文(來自encrypted_data變量)寫入新文件。
實現(xiàn)非對稱密鑰解密的Python代碼:
圖片
非對稱密鑰解密代碼解析:
import boto3:導(dǎo)入Boto3庫,這是用于Python的AWS SDK。
kms = boto3.client('kms', region_name='<aws-region>'):為指定的AWS區(qū)域設(shè)置一個KMS客戶端對象。將<aws-region>替換為所需的AWS區(qū)域。
key_id = '<private-key-from-aws-kms>':指定將用于解密的私鑰的ID。你需要用AWS KMS中的實際密鑰ID替換此處。
with open('<path-of-encrypted-file>', 'rb') as f:以二進制模式('rb')打開加密文件以供讀取。將<path-of-encrypted-file>替換為實際的文件路徑。
encrypted_data = f.read():將加密文件的內(nèi)容讀取到encrypted_data變量中。
decrypted_data = kms.decrypt(...):使用由key_id指定的私鑰對encrypted_data進行解密。解密后的數(shù)據(jù)存儲在decrypted_data變量中。
with open('<path-to-store-decrypted-file>', 'wb') as f:以二進制模式('wb')打開一個新文件以供寫入解密數(shù)據(jù)。將<path-to-store-decrypted-file>替換為存儲解密文件的目標(biāo)路徑。
f.write(decrypted_data['Plaintext']):將解密的明文(來自decrypted_data變量)寫入新文件。