簡單瞭解加密算法

目錄

對稱加密算法

非對稱加密算法

加密算法簡單符號瞭解

嘗試應用

代碼

詳解

自帶庫常用加密操作


數據加密的基本過程就是對原來爲明文的文件或數據按某種算法進行處理,使其成爲不可讀的一段代碼爲“密文”,使其只能在輸入相應的密鑰之後才能顯示出原容,通過這樣的途徑來達到保護數據不被非法人竊取、閱讀的目的。 該過程的逆過程爲解密,即將該編碼信息轉化爲其原來數據的過程。我們所說的加密方式,都是對二進制編碼的格式進行加密的,對應到Python中,則是我們的Bytes

對稱加密算法

對稱式加密就是加密和解密使用同一個密鑰,通常稱之爲“Session Key ”這種加密技術在當今被廣泛採用,
如美國政府所採用的DES加密標準就是一種典型的“對稱式”加密法,它的Session Key長度爲56bits。

對稱式加密技術:主要有DES算法3DES算法Blowfish算法RC5算法AESIDEA算法
優點:速度快,對稱性加密通常在消息發送方需要加密大量數據時使用,算法公開、計算量小、加密速度快、加密效率高。
缺點:在數據傳送前,發送方和接收方必須商定好祕鑰,然後使雙方都能保存好祕鑰。其次如果一方的祕鑰被泄露,那麼加密信息也就不安全了。另外,每對用戶每次使用對稱加密算法時,都需要使用其他人不知道的唯一祕鑰,這會使得收、發雙方所擁有的鑰匙數量巨大,密鑰管理成爲雙方的負擔。

非對稱加密算法

非對稱式加密就是加密和解密所使用的不是同一個密鑰,通常有兩個密鑰,稱爲“公鑰”和“私鑰”,它們兩個必需配對使用,否則不能打開加密文件。這裏的“公鑰”是指可以對外公佈的,“私鑰”則不能,只能由持有人一個人知道。它的優越性就在這裏,因爲對稱式的加密方法如果是在網絡上傳輸加密文件就很難不把密鑰告訴對方,不管用什麼方法都有可能被別竊聽到。而非對稱式的加密方法有兩個密鑰,且其中的“公鑰”是可以公開的,也就不怕別人知道,收件人解密時只要用自己的私鑰即可以,這樣就很好地避免了密鑰的傳輸安全性問題。

非對稱式加密技術:RSAElgamalRabinECC(橢圓曲線加密算法)
缺點:速度較慢
優點:安全

加密算法簡單符號瞭解

一個加密系統S可以用數學符號描述如下:
S={P, C, K, E, D}
其中
P——明文空間,表示全體可能出現的明文集合,
C——密文空間,表示全體可能出現的密文集合,
K——密鑰空間,密鑰是加密算法中的可變參數,
E——加密算法,由一些公式、法則或程序構成,
D——解密算法,它是E的逆。
當給定密鑰kÎK時,各符號之間有如下關係:
C = Ek(P), 對明文P加密後得到密文C
P = Dk(C) = Dk(Ek(P)), 對密文C解密後得明文P
如用E-1 表示E的逆,D-1表示D的逆,則有:
Ek = Dk-1且Dk = Ek-1
因此,加密設計主要是確定E,D,K。

                                                                                 以上內容來源於網絡


嘗試應用

總的來說對稱與不對稱就是密鑰的差別,這裏是根據我瞭解到的內容進行對稱算法的簡單應用,嘗試自己寫了個加密字符算法,依據上一篇博客的內容進行再創造,把圖片字符進行加密,簡單明瞭不堪一擊的加密,與真正的加密算法連皮毛都算不上。

第一個爲原文(YuanW.txt)也就是明文(MingW.txt),第二個爲根據密文解密出來的明文(MingW.txt),第三個爲密文(MiW.txt

代碼

import base64,os,cv2
def img_str(img_path,K):
    """
    返回圖片字符密文
    """
    with open(img_path, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        s = base64_data.decode()
    with open('YuanW.txt', 'w') as f:
        #寫入圖片字符原文
        f.write(s)
    s=Ek(s,K)
    return s
    
def str_img(imaStr,img_name):
    """
    將圖片字符轉爲圖片
    """
    imadata = base64.b64decode(imaStr)#解碼
    with open(img_name, 'wb') as f:
        f.write(imadata)
        
"""
S={P, C, K, E, D}
其中
P——明文空間,表示全體可能出現的明文集合,
C——密文空間,表示全體可能出現的密文集合,
K——密鑰空間,密鑰是加密算法中的可變參數,
E——加密算法,由一些公式、法則或程序構成,
D——解密算法,它是E的逆。
"""

def Ek(strs,K):
    """
    對每個字符加密
    加密算法:f(x)=x-1-k
    """
    new_strs=''
    for i in strs:
        i=(ord(i)-1)-K
        new_strs+=chr(int(i))
    return new_strs

def Dk(strs,k):
    """
    對每個字符加密
    加密算法:f(x)=x+1+k
    """
    new_strs=''
    for i in strs:
        i=(ord(i)+1)+k
        new_strs+=chr(i)
    return new_strs

#密鑰 K
K=2
img_path='2.jpg'
C=img_str(img_path,K)

#嘗試對密文進行轉圖片,基本上是不可行的,轉不出來
try:
    str_img(C,'cxk.jpg')
except Exception:
    print('轉化失敗,字符不是圖片所轉')

#將密文轉明文再轉圖片
P=Dk(C,K)
str_img(P,'cxk2.jpg')

#寫入密文
with open('MiW.txt', 'w') as f:
        f.write(C)
#寫入明文
with open('MingW.txt', 'w') as f:
        f.write(P)
print('ok')

詳解

這裏我簡單的設計的一個加密函數 f(x)=x-1-kx則爲每個字符的ASCLL碼,將該碼進行加減操作後轉爲字符返回密文,後續將密文寫入數據庫,需要時提取出來根據DK解密函數進行解密操作,K值是一個粗暴可以更改的密鑰參數,不過加密解密都是Bytes的,而我這裏只是簡單的字符類型,太low了,不過用來玩一下還是可行的。

自帶庫常用加密操作

  • Python3.x開始去掉了md5和sha模塊,僅剩下hashlib和hmac模塊;
  • Python3.6增加了一個新的可以產生用於密鑰管理的安全隨機數的模塊:secrets。

我們就用hashlib試試。MD5不可逆,所以應該算不上加密算法,不過發現好像MD5加密簡單的字符使用網上的解密網站都能解出來,應該是暴力破解吧。

import hashlib
# 該庫可以創建的加密算法有:md5, sha1, sha224, sha256, sha384, sha512

# hash.hexdigest() 返回傳遞給update()函數的所有數據的摘要信息--十六進制格式的字符串
# hexdigest()方法返回的結果是一個16進制格式的字符串,字符串中每個元素是一個16進制數字,
# 我們知道每個16進制數字佔4bits,MD5算法獲取的數據摘要長度是128bits,因此最後得到的字符串長度是128/4=32。


#MD5信息摘要算法(英語:MD5 Message-Digest Algorithm)
#一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value)
#用於確保信息傳輸完整一致。
#該加密算法不可逆,只有輸入原文再進行加密比對,並且一個字符改變整個散列值大不相同
#具體用法:密碼比對,客戶端傳入客戶輸入的密碼產生的散列值與服務器比對
# 待加密信息
C = '123'
X = '123'
K = '124'
# 創建md5對象
h1 = hashlib.md5()
h2 = hashlib.md5()
h3 = hashlib.md5()
# 此處必須聲明encode
# 將對象轉爲Bytes類型
h1.update(C.encode('utf-8'))
print('MD5加密前爲 :' + C)
print('MD5加密後爲 :' + h1.hexdigest())

h2.update(X.encode('utf-8'))
print('MD5加密前爲 :' + X)
print('MD5加密後爲 :' + h2.hexdigest())

h3.update(K.encode('utf-8'))
print('MD5加密前爲 :' + K)
print('MD5加密後爲 :' + h3.hexdigest())

#輸出
MD5加密前爲 :123
MD5加密後爲 :202cb962ac59075b964b07152d234b70
MD5加密前爲 :123
MD5加密後爲 :202cb962ac59075b964b07152d234b70
MD5加密前爲 :124
MD5加密後爲 :c8ffe9a587b126f152ed3d89a146b445

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章