欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 加密與解密小結(jié)

 更新時(shí)間:2018年12月06日 18:16:43   作者:一只小小的寄居蟹  
這篇文章主要介紹了Python 加密與解密,使用base64或pycrypto模塊需要的朋友可以參考下

閱讀目錄

前言

加密算法分類
Python加密庫
DES加密
AES加密
RSA加密

前言

據(jù)記載,公元前400年,古希臘人發(fā)明了置換密碼。1881年世界上的第一個(gè)電話保密專利出現(xiàn)。在第二次世界大戰(zhàn)期間,德國軍方啟用“恩尼格瑪”密碼機(jī),密碼學(xué)在戰(zhàn)爭中起著非常重要的作用。
隨著信息化和數(shù)字化社會(huì)的發(fā)展,人們對(duì)信息安全和保密的重要性認(rèn)識(shí)不斷提高,于是在1997年,美國國家標(biāo)準(zhǔn)局公布實(shí)施了“美國數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)”,民間力量開始全面介入密碼學(xué)的研究和應(yīng)用中,采用的加密算法有DES、RSA、SHA等。
隨著對(duì)加密強(qiáng)度需求的不斷提高,近期又出現(xiàn)了AES、ECC等。

使用密碼學(xué)可以達(dá)到以下目的:
保密性:防止用戶的標(biāo)識(shí)或數(shù)據(jù)被讀取。
數(shù)據(jù)完整性:防止數(shù)據(jù)被更改。
身份驗(yàn)證:確保數(shù)據(jù)發(fā)自特定的一方。

加密算法分類

對(duì)稱加密算法:
對(duì)稱加密采用了對(duì)稱密碼編碼技術(shù),它的特點(diǎn)是文件加密和解密使用相同的密鑰發(fā)送方和接收方需要持有同一把密鑰,發(fā)送消息和接收消息均使用該密鑰。
相對(duì)于非對(duì)稱加密,對(duì)稱加密具有更高的加解密速度,但雙方都需要事先知道密鑰,密鑰在傳輸過程中可能會(huì)被竊取,因此安全性沒有非對(duì)稱加密高。

常見的對(duì)稱加密算法:DES,AES,3DES等等

非對(duì)稱加密算法:

文件加密需要公開密鑰(publickey)和私有密鑰(privatekey)。
接收方在發(fā)送消息前需要事先生成公鑰和私鑰,然后將公鑰發(fā)送給發(fā)送方。發(fā)送放收到公鑰后,將待發(fā)送數(shù)據(jù)用公鑰加密,發(fā)送給接收方。接收到收到數(shù)據(jù)后,用私鑰解密。
在這個(gè)過程中,公鑰負(fù)責(zé)加密,私鑰負(fù)責(zé)解密,數(shù)據(jù)在傳輸過程中即使被截獲,攻擊者由于沒有私鑰,因此也無法破解。
非對(duì)稱加密算法的加解密速度低于對(duì)稱加密算法,但是安全性更高。

非對(duì)稱加密算法:RSA、DSA、ECC等算法

消息摘要算法:

消息摘要算法可以驗(yàn)證信息是否被篡改。
在數(shù)據(jù)發(fā)送前,首先使用消息摘要算法生成該數(shù)據(jù)的簽名,然后簽名和數(shù)據(jù)一同發(fā)送給接收者。
接收者收到數(shù)據(jù)后,對(duì)收到的數(shù)據(jù)采用消息摘要算法獲得簽名,最后比較簽名是否一致,以此來判斷數(shù)據(jù)在傳輸過程中是否發(fā)生修改。

 Python加密庫

PyCrypto是 Python 中密碼學(xué)方面最有名的第三方軟件包??上У氖?,它的開發(fā)工作于2012年就已停止。

其他人還在繼續(xù)發(fā)布最新版本的 PyCrypto,如果你不介意使用第三方的二進(jìn)制包,仍可以取得Python 3.5 的相應(yīng)版本。

比如,可以在 Github 上找到了對(duì)應(yīng)Python3.5的PyCrypto 二進(jìn)制包。

幸運(yùn)的是,有一個(gè)該項(xiàng)目的分支PyCrytodome 取代了 PyCrypto 。為了在 Linux 上安裝它,

你可以使用以下pip 命令:

pip3 install -i https://pypi.douban.com/simple pycryptodome

在Windows 系統(tǒng)上安裝則稍有不同:

pip3 install -i https://pypi.douban.com/simple pycryptodomex

DES加密

全稱為Data EncryptionStandard,即數(shù)據(jù)加密標(biāo)準(zhǔn),是一種使用密鑰加密的塊算法

入口參數(shù)有三個(gè):Key、Data、Mode

Key為7個(gè)字節(jié)共56位,是DES算法的工作密鑰;

Data為8個(gè)字節(jié)64位,是要被加密或被解密的數(shù)據(jù);

Mode為DES的工作方式,有兩種:加密或解密

3DES(即Triple DES)是DES向AES過渡的加密算法,

使用兩個(gè)密鑰,執(zhí)行三次DES算法,

加密的過程是加密-解密-加密

解密的過程是解密-加密-解密

from Crypto.Cipher import DES
key = b'abcdefgh' # 密鑰 8位或16位,必須為bytes

def pad(text):
  """
  # 加密函數(shù),如果text不是8的倍數(shù)【加密文本text必須為8的倍數(shù)!】,那就補(bǔ)足為8的倍數(shù)
  :param text: 
  :return: 
  """
  while len(text) % 8 != 0:
    text += ' '
  return text


des = DES.new(key, DES.MODE_ECB) # 創(chuàng)建一個(gè)DES實(shí)例
text = 'Python rocks!'
padded_text = pad(text)
encrypted_text = des.encrypt(padded_text.encode('utf-8')) # 加密
print(encrypted_text)
# rstrip(' ')返回從字符串末尾刪除所有字符串的字符串(默認(rèn)空白字符)的副本
plain_text = des.decrypt(encrypted_text).decode().rstrip(' ') # 解密
print(plain_text)
#

AES加密

高級(jí)加密標(biāo)準(zhǔn)(英語:Advanced EncryptionStandard,縮寫:AES),這個(gè)標(biāo)準(zhǔn)用來替代原先的DES

AES的區(qū)塊長度固定為128 比特,密鑰長度則可以是128,192或256比特(16、24和32字節(jié))

大致步驟如下:

1、密鑰擴(kuò)展(KeyExpansion),

2、初始輪(Initial Round),

3、重復(fù)輪(Rounds),每一輪又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,

4、最終輪(Final Round),最終輪沒有MixColumns。

普通方式

from Cryptodome.Cipher import AES
from binascii import b2a_hex, a2b_hex
#秘鑰,此處需要將字符串轉(zhuǎn)為字節(jié)
key = 'abcdefgh'
#加密內(nèi)容需要長達(dá)16位字符,所以進(jìn)行空格拼接
def pad(text):
  while len(text) % 16 != 0:
    text += ' '
  return text
#加密秘鑰需要長達(dá)16位字符,所以進(jìn)行空格拼接
def pad_key(key):
  while len(key) % 16 != 0:
    key += ' '
  return key
#進(jìn)行加密算法,模式ECB模式,把疊加完16位的秘鑰傳進(jìn)來
aes = AES.new(pad_key(key).encode(), AES.MODE_ECB)
#加密內(nèi)容,此處需要將字符串轉(zhuǎn)為字節(jié)
text = 'hello'
#進(jìn)行內(nèi)容拼接16位字符后傳入加密類中,結(jié)果為字節(jié)類型
encrypted_text = aes.encrypt(pad(text).encode())
encrypted_text_hex = b2a_hex(encrypted_text)
print(encrypted_text_hex)


# #此處是為了驗(yàn)證是否能將字節(jié)轉(zhuǎn)為字符串后,進(jìn)行解密成功
# #實(shí)際上a 就是 encrypted_text ,也就是加密后的內(nèi)容
# #用aes對(duì)象進(jìn)行解密,將字節(jié)類型轉(zhuǎn)為str類型,錯(cuò)誤編碼忽略不計(jì)
de = str(aes.decrypt(a2b_hex(encrypted_text_hex)), encoding='utf-8',errors="ignore")
# #獲取str從0開始到文本內(nèi)容的字符串長度。
print(de[:len(text)])

面向?qū)ο蠓绞?/p>

from Cryptodome.Cipher import AES
from binascii import b2a_hex, a2b_hex

AES_LENGTH = 16

class prpcrypt():
  def __init__(self, key):
    self.key = key
    self.mode = AES.MODE_ECB
    self.cryptor = AES.new(self.pad_key(self.key).encode(), self.mode)

  # 加密函數(shù),如果text不是16的倍數(shù)【加密文本text必須為16的倍數(shù)!】,那就補(bǔ)足為16的倍數(shù)
  # 加密內(nèi)容需要長達(dá)16位字符,所以進(jìn)行空格拼接
  def pad(self,text):
    while len(text) % AES_LENGTH != 0:
      text += ' '
    return text

  # 加密密鑰需要長達(dá)16位字符,所以進(jìn)行空格拼接
  def pad_key(self,key):
    while len(key) % AES_LENGTH != 0:
      key += ' '
    return key

  def encrypt(self, text):

    # 這里密鑰key 長度必須為16(AES-128)、24(AES-192)、或32(AES-256)Bytes 長度.目前AES-128足夠用
    # 加密的字符需要轉(zhuǎn)換為bytes
    # print(self.pad(text))
    self.ciphertext = self.cryptor.encrypt(self.pad(text).encode())
    # 因?yàn)锳ES加密時(shí)候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時(shí)候可能存在問題
    # 所以這里統(tǒng)一把加密后的字符串轉(zhuǎn)化為16進(jìn)制字符串
    return b2a_hex(self.ciphertext)

    # 解密后,去掉補(bǔ)足的空格用strip() 去掉

  def decrypt(self, text):
    plain_text = self.cryptor.decrypt(a2b_hex(text)).decode()
    return plain_text.rstrip(' ')


if __name__ == '__main__':
  pc = prpcrypt('abcdef') # 初始化密鑰
  e = pc.encrypt("0123456789ABCDEF")
  d = pc.decrypt(e)
  print(e, d)
  e = pc.encrypt("00000000000000000000000000")
  d = pc.decrypt(e)
  print(e, d)

RSA加密

公鑰加密算法,一種非對(duì)稱密碼算法

公鑰加密,私鑰解密

3個(gè)參數(shù):

rsa_n, rsa_e,message

rsa_n, rsa_e 用于生成公鑰

message: 需要加密的消息

安裝 pip install rsa

使用

import rsa
from binascii import b2a_hex, a2b_hex



class rsacrypt():
  def __init__(self, pubkey, prikey):
    self.pubkey = pubkey
    self.prikey = prikey

  def encrypt(self, text):
    self.ciphertext = rsa.encrypt(text.encode(), self.pubkey)
    # 因?yàn)閞sa加密時(shí)候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時(shí)候可能存在問題
    # 所以這里統(tǒng)一把加密后的字符串轉(zhuǎn)化為16進(jìn)制字符串
    return b2a_hex(self.ciphertext)

  def decrypt(self, text):
    decrypt_text = rsa.decrypt(a2b_hex(text), prikey)
    return decrypt_text


if __name__ == '__main__':
  pubkey, prikey = rsa.newkeys(256)
  rs_obj = rsacrypt(pubkey,prikey)
  text='hello'
  ency_text = rs_obj.encrypt(text)
  print(ency_text)
  print(rs_obj.decrypt(ency_text))

"""
b'7cb319c67853067abcd16aad25b3a8658e521f83b1e6a6cf0c4c2e9303ad3e14'
b'hello'
"""

python 加密解密 使用base64或pycrypto模塊

1. 使用base64

s1 = base64.encodestring('hello world')
s2 = base64.decodestring(s1)
print s1, s2

結(jié)果

aGVsbG8gd29ybGQ=
hello world

Base64編碼,64指A-Z、a-z、0-9、+和/這64個(gè)字符,還有“=”號(hào)不屬于編碼字符,而是填充字符。為什么發(fā)明這么個(gè)編碼呢,這個(gè)編碼的原理很簡單,“破解”也很容易,原因是電子郵件剛出來的時(shí)候,只傳遞英文字符,這沒有問題,但是后來,中國人,日本人都要發(fā)email,這樣問題就來了,因?yàn)檫@些字符有可能會(huì)被郵件服務(wù)器或者網(wǎng)關(guān)當(dāng)成命令處理,故必須得有一種編碼來對(duì)郵件進(jìn)行加密,但是加密的目的是為了能夠使得一些原始的服務(wù)器不出問題(現(xiàn)在服務(wù)器早已經(jīng)能處理這些亂七八糟得情況了,不過因?yàn)橐呀?jīng)形成了一套規(guī)范,所以郵件還是得經(jīng)過Base64編碼才能傳遞)。

優(yōu)點(diǎn):方法簡單

缺點(diǎn):不保險(xiǎn),別人拿到密文可以自己解密出明文

編碼原理:將3個(gè)字節(jié)轉(zhuǎn)換成4個(gè)字節(jié)((3 X 8)=24=(4X6)),先讀入3個(gè)字節(jié),每讀一個(gè)字節(jié),左移8位,再右移四次,每次6位,這樣就有4個(gè)字節(jié)了。
解碼原理:將4個(gè)字節(jié)轉(zhuǎn)換成3個(gè)字節(jié),先讀入4個(gè)6位(用或運(yùn)算),每次左移6位,再右移3次,每次8位,這樣就還原了。

2. 使用pycrypto模塊

>>> from Crypto.Cipher import AES
>>> obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
>>> message = "The answer is no"
>>> ciphertext = obj.encrypt(message)
>>> ciphertext
'\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1'
>>> obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
>>> obj2.decrypt(ciphertext)
'The answer is no'

高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級(jí)加密標(biāo)準(zhǔn)由美國國家標(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ì)稱密鑰加密中最流行的算法之一。

AES只是個(gè)基本算法,實(shí)現(xiàn)AES有若干模式。其中的CBC模式因?yàn)槠浒踩远籘LS(就是https的加密標(biāo)準(zhǔn))和IPSec(win采用的)作為技術(shù)標(biāo)準(zhǔn)。簡單地說,CBC使用密碼和salt(起擾亂作用)按固定算法(md5)產(chǎn)生key和iv。然后用key和iv(初始向量,加密第一塊明文)加密(明文)和解密(密文)。

再來一例

#coding: utf8
import sys
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
 
class prpcrypt():
  def __init__(self, key):
    self.key = key
    self.mode = AES.MODE_CBC
   
  #加密函數(shù),如果text不是16的倍數(shù)【加密文本text必須為16的倍數(shù)!】,那就補(bǔ)足為16的倍數(shù)
  def encrypt(self, text):
    cryptor = AES.new(self.key, self.mode, self.key)
    #這里密鑰key 長度必須為16(AES-128)、24(AES-192)、或32(AES-256)Bytes 長度.目前AES-128足夠用
    length = 16
    count = len(text)
    add = length - (count % length)
    text = text + ('\0' * add)
    self.ciphertext = cryptor.encrypt(text)
    #因?yàn)锳ES加密時(shí)候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時(shí)候可能存在問題
    #所以這里統(tǒng)一把加密后的字符串轉(zhuǎn)化為16進(jìn)制字符串
    return b2a_hex(self.ciphertext)
   
  #解密后,去掉補(bǔ)足的空格用strip() 去掉
  def decrypt(self, text):
    cryptor = AES.new(self.key, self.mode, self.key)
    plain_text = cryptor.decrypt(a2b_hex(text))
    return plain_text.rstrip('\0')
 
if __name__ == '__main__':
  pc = prpcrypt('keyskeyskeyskeys')   #初始化密鑰
  e = pc.encrypt("00000")
  d = pc.decrypt(e)           
  print e, d
  e = pc.encrypt("00000000000000000000000000")
  d = pc.decrypt(e)         
  print e, d

運(yùn)行結(jié)果

a9755fd70d8d6db65a6fac12d4797dde 00000
2c1969f213c703ebedc36f9e7e5a2b88922ac938c983201c200da51073d00b2c 00000000000000000000000000

這篇文章就介紹到這了需要朋友可以參考一下。

相關(guān)文章

  • Python群發(fā)郵件實(shí)例代碼

    Python群發(fā)郵件實(shí)例代碼

    今天試了試Python發(fā)郵件,突然想到能不能群發(fā)郵件呢?群發(fā)郵件是smtplib的一個(gè)bug,不過最終還是解決了
    2014-01-01
  • Python相關(guān)庫設(shè)置技巧保護(hù)你的C盤

    Python相關(guān)庫設(shè)置技巧保護(hù)你的C盤

    這篇文章主要為大家介紹了Python相關(guān)庫設(shè)置,保護(hù)你的C盤技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Python操作Sonqube API獲取檢測結(jié)果并打印過程解析

    Python操作Sonqube API獲取檢測結(jié)果并打印過程解析

    這篇文章主要介紹了Python操作Sonqube API獲取檢測結(jié)果并打印過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Python?第三方opencv庫實(shí)現(xiàn)圖像分割處理

    Python?第三方opencv庫實(shí)現(xiàn)圖像分割處理

    這篇文章主要介紹了Python?第三方opencv庫實(shí)現(xiàn)圖像分割處理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • python用裝飾器自動(dòng)注冊(cè)Tornado路由詳解

    python用裝飾器自動(dòng)注冊(cè)Tornado路由詳解

    這篇文章主要給大家介紹了python用裝飾器自動(dòng)注冊(cè)Tornado路由,文中給出了三個(gè)版本的解決方法,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • python自動(dòng)化之Ansible的安裝教程

    python自動(dòng)化之Ansible的安裝教程

    這篇文章主要介紹了python自動(dòng)化之Ansible的安裝方法,結(jié)合實(shí)例形式分析了自動(dòng)化運(yùn)維工具Ansible的安裝步驟及相關(guān)操作命令,需要的朋友可以參考下
    2019-06-06
  • python使用tkinter實(shí)現(xiàn)自定義多參數(shù)對(duì)話框

    python使用tkinter實(shí)現(xiàn)自定義多參數(shù)對(duì)話框

    Tkinter模塊是Python標(biāo)準(zhǔn)庫中的一部分,用于創(chuàng)建圖形用戶界面(GUI)應(yīng)用程序,它提供了一組工具和組件,用于創(chuàng)建窗口、按鈕、文本框等用戶界面元素,并且可以響應(yīng)用戶的輸入,本文將給大家講講python如何使用tkinter實(shí)現(xiàn)自定義多參數(shù)對(duì)話框
    2023-08-08
  • python中dir函數(shù)用法分析

    python中dir函數(shù)用法分析

    這篇文章主要介紹了python中dir函數(shù)用法,實(shí)例分析了dir函數(shù)的功能及相應(yīng)的使用技巧,需要的朋友可以參考下
    2015-04-04
  • 使用python實(shí)現(xiàn)三維圖可視化

    使用python實(shí)現(xiàn)三維圖可視化

    這篇文章主要介紹了使用python實(shí)現(xiàn)三維圖可視化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python http服務(wù)flask架構(gòu)實(shí)用代碼詳解分析

    python http服務(wù)flask架構(gòu)實(shí)用代碼詳解分析

    本篇文章主要分享一個(gè)python的簡單http服務(wù)flask架構(gòu)。目前主流的python的服務(wù)框架有django、flask,相較于django來說,flask更小巧玲瓏。至于并發(fā)的問題,使用了gevent協(xié)程io進(jìn)行處理
    2021-10-10

最新評(píng)論