iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Security

從零開始學資訊安全系列 第 15

從零開始學資訊安全-DAY15:DES

  • 分享至 

  • xImage
  •  

今天來學習對稱式密碼的資料加密標準(Data Encryption Standard,DES)
我後來發現我應該把這篇放在AES之前才對。
這個資料加密標準其實源於美國的1970年代,由美國國家標準局提出徵求適合用於政府機關和商業機構資料的加密演算法,最後選定了IBM公司提交的方案。這也成為後來3DES、IDEA等區塊加密法的原理
它的特性如下:

  1. 採用區塊的方式進行加姊密的演算,金鑰有效長度為56位元,其餘8位元用於位元錯誤(parity error)校驗的用途
  2. DES依據二進位的運算,應此才能加解密各種數位電腦的資料

實作

記得裝pycryptodome

pip install pycryptodome
from Crypto.Cipher import DES
from Crypto.Random import get_random_bytes

def encrypt_des(key, plaintext):
    # Create a DES cipher object using the provided key and DES ECB mode
    cipher = DES.new(key, DES.MODE_ECB)

    # Ensure that the plaintext length is a multiple of the DES block size (8 bytes)
    plaintext = plaintext + b"\0" * (8 - len(plaintext) % 8)

    # Encrypt the plaintext
    ciphertext = cipher.encrypt(plaintext)
    
    return ciphertext

def decrypt_des(key, ciphertext):
    # Create a DES cipher object using the provided key and DES ECB mode
    cipher = DES.new(key, DES.MODE_ECB)

    # Decrypt the ciphertext
    plaintext = cipher.decrypt(ciphertext)

    # Remove padding null bytes from the decrypted plaintext
    plaintext = plaintext.rstrip(b"\0")
    
    return plaintext
# Usage example
if __name__ == "__main__":
    key = get_random_bytes(8)  # 64-bit DES key
    plaintext = b"HELLO!"  # The plaintext to encrypt (in bytes)

    # Encrypt
    ciphertext = encrypt_des(key, plaintext)
    print("key",key)
    print("Ciphertext:", ciphertext.hex())

    # Decrypt
    decrypted_text = decrypt_des(key, ciphertext)
    print("Decrypted Text:", decrypted_text.decode())

結果

key: b'\x0e,%{\xcc\xd1\x81\x92'
Ciphertext: 0ec84c744dac479f
Decrypted Text: HELLO!

心得:相較於AES可以存放128位元,DES的56位元的就顯得比較小了,不過隨者軟硬體的進步,這種取代也是很正常


上一篇
從零開始學資訊安全-DAY14:AES-GCM
下一篇
從零開始學資訊安全-DAY16:非對稱式密碼
系列文
從零開始學資訊安全30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言