在本節中,我們將介紹加密和解密技術的基礎知識,以及一些常見的加密演算法,我們將涵蓋以下主題:
- 加密和解密的基本概念
- 對稱加密
- 非對稱加密
- 哈希函式
- 數字簽名
- 實際應用及案例代碼
1. 加密和解密的基本概念
-
加密:加密是一種將資料(明文)轉換為其他格式(密文)的程序,以防止未經授權的人員訪問,加密使用特定的演算法(稱為加密演算法)和密鑰來執行此轉換,
-
解密:解密是將加密后的資料(密文)還原為原始資料(明文)的程序,解密通常使用相同的加密演算法和相應的密鑰來進行,
-
密鑰:密鑰是用于加密和解密資料的特定字符序列,密鑰的長度和復雜性直接影響到加密演算法的安全性,
2. 對稱加密
對稱加密是一種使用相同的密鑰進行加密和解密的加密方法,這意味著加密和解密程序中使用的密鑰是相同的,對稱加密演算法通常更快,但密鑰管理可能會成為一個問題,因為每對通信方都需要共享相同的密鑰,
常見對稱加密演算法:
- AES(Advanced Encryption Standard)
- DES(Data Encryption Standard)
- 3DES(Triple Data Encryption Standard)
- RC4(Rivest Cipher 4)
- Blowfish
實體:使用Python的cryptography
庫進行AES加密和解密:
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
import os
# 生成一個隨機密鑰
key = os.urandom(32)
# 生成一個隨機初始化向量(IV)
iv = os.urandom(16)
# 使用AES加密演算法和CBC模式創建一個加密物件
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
# 創建一個加密器物件
encryptor = cipher.encryptor()
# 明文資料
plaintext = b"Hello, world!"
# 使用PKCS7填充對明文進行填充
padder = padding.PKCS7(128).padder()
padded_data = https://www.cnblogs.com/yaoqian/archive/2023/07/13/padder.update(plaintext) + padder.finalize()
# 對填充后的明文進行加密
ciphertext = encryptor.update(padded_data) + encryptor.finalize()
# 創建一個解密器物件
decryptor = cipher.decryptor()
# 對密文進行解密
decrypted_data = decryptor.update(ciphertext) + decryptor.finalize()
# 使用PKCS7填充的解除器對解密后的資料進行解填充
unpadder = padding.PKCS7(128).unpadder()
unpadded_data = unpadder.update(decrypted_data) + unpadder.finalize()
assert plaintext == unpadded_data
3. 非對稱加密
非對稱加密是一種使用兩個不同密鑰進行加密和解密的加密方法:一個公鑰用于加密資料,一個私鑰用于解密資料,公鑰可以公開分享,而私鑰必須保密,非對稱加密演算法通常比對稱加密慢,但解決了密鑰管理的問題,
常見非對稱加密演算法:
- RSA(Rivest-Shamir-Adleman)
- DSA(Digital Signature Algorithm)
- ElGamal
- ECC(Elliptic Curve Cryptography)
實體:使用Python的cryptography
庫進行RSA加密和解密:
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric importpadding as asym_padding
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.backends import default_backend
# 生成RSA密鑰對
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = private_key.public_key()
# 明文資料
plaintext = b"Hello, world!"
# 使用公鑰對明文進行加密
ciphertext = public_key.encrypt(
plaintext,
asym_padding.OAEP(
mgf=asym_padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# 使用私鑰對密文進行解密
decrypted_data = https://www.cnblogs.com/yaoqian/archive/2023/07/13/private_key.decrypt(
ciphertext,
asym_padding.OAEP(
mgf=asym_padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
assert plaintext == decrypted_data
4. 哈希函式
哈希函式是一種將任意長度的資料映射到固定長度的輸出的單向函式,哈希函式具有以下特性:
- 輸入變化時,輸出有很大概率發生變化(敏感性)
- 不同輸入產生相同輸出的概率極低(碰撞抵抗)
- 無法從輸出反推輸入(單向性)
常見哈希演算法:
- MD5(Message-Digest Algorithm 5)
- SHA-1(Secure Hash Algorithm 1)
- SHA-2(Secure Hash Algorithm 2)
- SHA-3(Secure Hash Algorithm 3)
實體:使用Python的hashlib
庫進行SHA-256哈希:
import hashlib
# 需要進行哈希的資料
data = https://www.cnblogs.com/yaoqian/archive/2023/07/13/b"Hello, world!"
# 計算SHA-256哈希值
hash_object = hashlib.sha256(data)
hash_hex = hash_object.hexdigest()
print("SHA-256 hash:", hash_hex)
5. 數字簽名
數字簽名是一種用于驗證資料完整性和身份驗證的技術,數字簽名的基本原理是:
- 發送者使用私鑰對資料生成簽名,
- 接收者使用發送者的公鑰驗證簽名,
實體:使用Python的cryptography
庫進行RSA數字簽名和驗證:
from cryptography.hazmat.primitives.asymmetric import padding as asym_padding
from cryptography.hazmat.primitives import hashes
# 需要簽名的資料
data = https://www.cnblogs.com/yaoqian/archive/2023/07/13/b"Hello, world!"
# 使用私鑰對資料生成簽名
signature = private_key.sign(
data,
asym_padding.PSS(
mgf=asym_padding.MGF1(hashes.SHA256()),
salt_length=asym_padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
# 使用公鑰驗證簽名
try:
public_key.verify(
signature,
data,
asym_padding.PSS(
mgf=asym_padding.MGF1(hashes.SHA256()),
salt_length=asym_padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("Signature is valid.")
except Exception as e:
print("Signature is invalid:", e)
6. 實際應用及案例代碼
在現實中,加密和解密技術被廣泛應用于各種場景,如:
- 安全通信:HTTPS、SSH、SSL/TLS等協議使用加密技術保護資料在傳輸程序中的安全性,
- 資料存盤:加密檔案系統和資料庫使用加密技術保護存盤的資料,
- 身份驗證:密碼學可以用于實作各種身份驗證機制,如一次性密碼(OTP)、雙因素身份驗證(2FA)等,
- 數字貨幣:位元幣等數字貨幣使用加密技術確保交易的安全性和匿名性,
上述示例代碼已經展示了如何使用Python的cryptography
和hashlib
庫進行加密、解密、哈希和數字簽名操作,在實際應用中,請確保使用適當的加密演算法、密鑰長度和庫,同時遵循最佳實踐來保護資料的安全,
以下是一些加密和解密實踐的建議:
-
保護密鑰:確保密鑰的安全存盤和傳輸,對于對稱加密,可以考慮使用密鑰管理服務(如AWS KMS、Google Cloud KMS等)來管理密鑰,對于非對稱加密,保護私鑰的安全至關重要,
-
使用現代、安全的加密演算法:避免使用被認為是不安全或過時的演算法,如DES、RC4等,相反,選擇經過時間檢驗且被廣泛認可的演算法,如AES、RSA等,
-
加密模式和填充方案:選擇正確的加密模式和填充方案也很重要,例如,對于對稱加密,推薦使用諸如AES-CBC、AES-GCM等模式;對于非對稱加密,推薦使用OAEP填充,
-
更新和維護:隨著技術的發展,密鑰長度、加密演算法或其他加密相關技術可能變得不再安全,因此,請關注加密技術的最新發展,并根據需要更新和維護您的加密實踐,
-
性能和效率:加密和解密操作可能會對性能產生影響,在選擇加密演算法時,請權衡安全性和性能,在某些情況下,可以考慮使用硬體加速來提高加密和解密操作的性能,
-
審計和合規:確保遵循相關法規和行業標準,如GDPR、HIPAA、PCI DSS等,這可能要求使用特定的加密演算法、密鑰長度或其他安全措施,
總之,了解加密和解密技術的基礎知識以及如何在實際應用中使用它們,對于確保資訊安全至關重要,請務必關注最新的加密技術和最佳實踐,以保護您的資料和系統免受未經授權的訪問和攻擊,
推薦閱讀:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/557112.html
標籤:其他
上一篇:Java 封裝
下一篇:返回列表