爬虫学习笔记(十五)——加密解密
文章目錄
- 一、概念和作用
- 1.1、概念
- 1.2、作用
- 1.3、常用加密方式
- 二、字符編碼
- 2.1、進制間轉換方法(python)
- 2.2、unicode
- 三、Base64編碼原理
- 3.1、概念
- 3.2、作用
- 3.3、Base64編碼表
- 3.4、文本到base64格式的轉換
- 3.5、BASE64編碼補碼
- 四、單向加密
- 4.1、概念
- 4.2、常見方法
- 4.2.1、md5加密
- 4.2.2、sha加密
- 五、對稱加密
- 5.1、概念與簡介
- 5.2、DES
- 5.2.1、概念
- 5.2.2、DES加密原理
- 5.2.3、python實現DES加密
- 5.3、3DES
- 5.3.1、概念
- 5.3.2、加密原理
- 5.4、AES
- 5.4.1、概念
- 5.4.2、加密過程
- 5.4.3、python實現AES加密
- 六、非對稱加密
- 6.1、概念與簡介
- 6.2、非對稱加密原理
- 6.3、RSA加密算法
- 6.3.1、RSA加密原理
- 6.3.2、python實現RSA加密
一、概念和作用
1.1、概念
加密解密:一個信息干擾的過程,保證固定的人才可以看到你的信息
把重要的數據變為亂碼(加密)傳送,
到達目的地后再用相同或不同的手段還原(解密)
1.2、作用
網絡信息傳輸安全涉及到很多個方面,其中主要有三個要解決的問題:
- 保密性(Confidentiality):信息在傳輸時不被泄露
- 完整性(Integrity):信息在傳輸時不被篡改
- 有效性(Availability):信息的使用者是合法的
1.3、常用加密方式
| 對稱加密 | 指數據加密和解密使用相同的密鑰 | 數據的機密性 | DES, AES |
| 非對稱加密 | 也叫公鑰加密,指數據加密和解密使用不同的密鑰–密鑰對兒 | 身份驗證 | DSA,RSA |
| 單向加密 | 指只能加密數據,而不能解密數據 | 數據的完整性 | MD5,SHA系列算法 |
二、字符編碼
2.1、進制間轉換方法(python)
十進制與二進制
>>> bin(255) #十進制轉二進制 '0b11111111'>>> int("0b11111111",2) #二進制轉十進制 255十進制與十六進制
>>> hex(255) #十進制轉十六進制 '0xff'>>> int('0xff',16) #十六進制轉十進制 2552.2、unicode
字符和unicode編號是一一對應的關系,世界上的每個字符都對應著一個unicode編號,根據編號可以進行多種編碼。utf-8、utf-16、utf-32、…、gbk編碼等。
>>>ord('學') 23398 >>>chr(23398) '學'>>>'學'.encode('utf-8') #漢字中utf-8編碼 b'\xe5\xad\xa6' >>>'學'.encode('gbk') #漢字中gbk編碼 b'\xd1\xa7'注意:轉什么編碼,解碼時就要用什么編碼,例如:
>>>'學'.encode('gbk') b'\xd1\xa7' >>>b'\xd1\xa7'.decode('gbk') '學' >>>b'\xd1\xa7'.decode('utf-8') '?'三、Base64編碼原理
3.1、概念
Base64就是一種基于64個可打印字符來表示二進制數據的方法。
3.2、作用
在參數傳輸的過程中經常遇到的一種情況:使用全英文的沒問題,但一旦涉及到中文就會出現亂碼情況。
網絡上傳輸的字符并不全是可打印的字符,比如二進制文件、圖片等。Base64的出現就是為了解決此問題,它是基于64個可打印的字符來表示二進制的數據的一種方法。
實例:
- 電子郵件剛問世的時候,只能傳輸英文,但后來隨著用戶的增加,中文、日文等文字的用戶也有需求,但這些字符并不能被服務器或網關有效處理,因此Base64就登場了。隨之,Base64在URL、Cookie、網頁傳輸少量二進制文件中也有相應的使用。
- 對證書來說,特別是根證書,一般都是作Base64編碼的,因為它要在網上被許多人下載。
- 電子郵件的附件一般也作Base64編碼的,因為一個附件數據往往是有不可見字符的。
3.3、Base64編碼表
| A | 0 | Q | 16 | g | 32 |
| B | 1 | R | 17 | h | 33 |
| C | 2 | S | 18 | i | 34 |
| D | 3 | T | 19 | j | 35 |
| E | 4 | U | 20 | k | 36 |
| F | 5 | V | 21 | l | 37 |
| G | 6 | W | 22 | m | 38 |
| H | 7 | X | 23 | n | 39 |
| I | 8 | Y | 24 | o | 40 |
| J | 9 | Z | 25 | p | 41 |
| K | 10 | a | 26 | q | 42 |
| L | 11 | b | 27 | r | 43 |
| M | 12 | c | 28 | s | 44 |
| N | 13 | d | 29 | t | 45 |
| O | 14 | e | 30 | u | 46 |
| P | 15 | f | 31 | v | 47 |
3.4、文本到base64格式的轉換
文本轉ASCII:ord()
ASCII轉文本:chr()
ASCII轉二進制:bin()
3.5、BASE64編碼補碼
>>> import base64 >>> base64.b64encode(b"A") b'QQ==' >>> base64.b64encode(b"BC") b'QkM='>>> base64.b64decode(b'QQ==') b'A' >>> base64.b64decode(b'QkM=') b'BC'注意:
- 大多數編碼都是由字符串轉化成二進制的過程,而Base64的編碼則是從二進制轉換為字符串。與常規恰恰相反;
- Base64編碼主要用在傳輸、存儲、表示二進制領域,不能算得上加密,只是無法直接看到明文。也可以通過打亂Base64編碼來進行加密。
- 計算機二進制存儲數據是以8位為一字節進行存儲,然而BASE64編碼是以6位表示一字節,這樣相鄰的數據變化了之后會影響后面整個的編碼結果。
四、單向加密
4.1、概念
單向加密是指只能對明文數據進行加密,而不能解密數據。
例:每個人都有不同的指紋,看到這個人,可以得出他的指紋等信息,并且唯一對應,但你只看一個指紋,是不可能看到或讀到這個人的長相或身份等信息。
4.2、常見方法
MD5 (message-digest algorithm) SHA (Secure Hash Algorithm)
注意:
4.2.1、md5加密
from hashlib import md5md5_obj=md5() #創建md5算法加密對象 md5_obj.update("加密數據".encode())#參數:內容是要加密數據 二進制格式 md5_obj.hexdigest() #結果: '648bfc23726d2e76af569f6fea26c1f8'md5_obj.update("加密數據".encode()) md5_obj.hexdigest() #同一個md5對象兩次調用update 第二次保留第一次調用的信息 # 結果: '47c58fbd984d00c4c0c24396be4ed52f'4.2.2、sha加密
from hashlib import sha256 sha256_obj=sha256()#創建sha算法加密對象 sha256_obj.update("加密數據".encode())#參數:內容是要加密數據 二進制格式 sha256_obj.hexdigest() #結果:'fc016213ebd4e12fd50ebeee2a074d09aef8b4dffa247401227976cfdec1ebf9'sha256_obj.update("加密數據".encode())#參數:內容是要加密數據 二進制格式 sha256_obj.hexdigest() #同一個sha對象兩次調用update 第二次保留第一次調用的信息 #結果: '5cbb02bfa5153ef91d29c8edcd213ffde626a9e6c0ac6d25e1d9ad6ddbca0078'注意:這種單向加密因為不能被解密,顯然是不能作為信息傳輸的,不能解密的消息是沒有意義的。所以實際應用中一般作為文件完整性的驗證,加密結果相同就認為文件在傳輸后也是完整的。
五、對稱加密
5.1、概念與簡介
概念: 對稱加密是指數據加密與解密使用相同密鑰
簡介: 常用的對稱加密 DES、3DES、 AES
???DES: Data Encryption Standard,秘鑰長度為56位,8位校驗位;
?????????????(2003年左右被破解–秘鑰可以暴力破解。 窮舉法)
???3DES:DES的改進版本。
???AES: Advanced Encryption Standard,支持的秘鑰長度包括 128bits,192bits,258bits,384bits,512bits。
特點:
-
加密與解密使用的密鑰相同。
-
但是由于算法一般都是公開的,因此機密性幾乎完全依賴于密鑰。
-
通常使用的是相對較小的密鑰,一般小于256bit。因為密鑰越大,加密越強,但加密與解密的過程越慢。
說明: 秘鑰長度越長,數據加密與解密的時間就越久
5.2、DES
5.2.1、概念
數據加密算法(Data Encryption Algorithm,DEA)是一種對稱加密算法,很可能是使用最廣泛的密鑰系統,特別是在保護金融數據的安全中,最初開發的DEA是嵌入硬件中的。
5.2.2、DES加密原理
DES 使用一個 56 位的密鑰以及附加的 8 位奇偶校驗位,產生最大 64 位的分組大小。這是一個迭代的分組密碼,使用稱為 Feistel 的技術,其中將加密的文本塊分成兩半。使用子密鑰對其中一半應用循環功能,然后將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續下去,但最后一個循環不交換。DES 使用 16 個循環,使用異或,置換,代換,移位操作四種基本運算。
5.2.3、python實現DES加密
安裝密碼庫
??????windows: pip install pycryptodomex
??????linux: pip install pycryptodome
from Cryptodome.Cipher import DESkey=b'12345678' #創建對象 des=DES.new(key,DES.MODE_ECB) #key是秘鑰 必須是8個字節data="王者榮耀" bwd=data.encode() en_text=data+(8-len(bwd)%8)*" "#加密 en_data=des.encrypt(en_text.encode()) print(en_data) #b'\xf8\x85\xa3\xfb\xc0\x1d\x83\xdd\xc8w2S\xb0\xe9/\t' #解密 de_data=des.decrypt(en_data) print(de_data) #b'\xe7\x8e\x8b\xe8\x80\x85\xe8\x8d\xa3\xe8\x80\x80 ' print(de_data.decode()) #王者榮耀注意:
- 設置的key是秘鑰,必須是8個字節
5.3、3DES
5.3.1、概念
3DES(或稱為Triple DES)是三重數據加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當于是對每個數據塊應用三次DES加密算法。
由于計算機運算能力的增強,原版DES密碼的密鑰長度變得容易被暴力破解。3DES即是設計用來提供一種相對簡單的方法,即通過增加DES的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼算法。
5.3.2、加密原理
3DES(即Triple DES)是DES向AES過渡的加密算法(1999年,NIST將3-DES指定為過渡的加密標準),加密算法,其具體實現如下:設Ek()和Dk()代表DES算法的加密和解密過程,K代表DES算法使用的密鑰,M代表明文,C代表密文,這樣:
-
3DES加密過程為:C=Ek3(Dk2(Ek1(M)))
-
3DES解密過程為:M=Dk1(EK2(Dk3( C)))
5.4、AES
5.4.1、概念
密碼學中的高級加密標準(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。
5.4.2、加密過程
AES為分組密碼,分組密碼也就是把明文分成一組一組的,每組長度相等,每次加密一組數據,直到加密完整個明文。
在AES標準規范中,分組長度只能是128位,也就是說,每個分組為16個字節(每個字節8位)。
密鑰的長度可以使用128位、192位或256位。密鑰的長度不同,推薦加密輪數也不同,C = E(K,P)是加密函數,在這個加密函數中會執行10個加密輪函數。
| AES-128 | 4 | 4 | 10 |
| AES-192 | 6 | 4 | 12 |
| AES-256 | 8 | 4 | 14 |
5.4.3、python實現AES加密
from Cryptodome.Cipher import AES key=b"12345678abcdefgh" #構建對象 aes=AES.new(key,AES.MODE_ECB) #1.key 秘鑰 2.mode AES.MODE_ECB 加密方式#加密 text="王者" bytes_data=(text+(16-len(text.encode())%16)*" ").encode() #加密 en_data=aes.encrypt(bytes_data) print(en_data) #結果 b'\x93\xf9\xfaxj\xd6xt\x9a\xd6\xdb\xa3\x8c\xf8M\xdf' #解密 de_data=aes.decrypt(en_data) print(de_data.decode()) # 結果 王者六、非對稱加密
6.1、概念與簡介
指的是加密和解密使用不同的秘鑰。
一把作為公開的公鑰,另一把作為私鑰。這對密鑰中的公鑰進行加密,私鑰用于解密。反之亦然(被私鑰加密的數據也可以被公鑰解密)。
在實際使用中私鑰一般保存在發布者手中,是私有的不對外公開的,只將公鑰對外公布,就能實現只有私鑰的持有者才能將數據解密的方法。 這種加密方式安全系數很高,因為它不用將解密的密鑰進行傳遞,從而沒有密鑰在傳遞過程中被截獲的風險,而破解密文幾乎又是不可能的。
但是算法的效率低,所以常用于很重要數據的加密,常和對稱配合使用,使用非對稱加密的密鑰去加密對稱加密的密鑰。
事實上,公鑰加密算法很少用于數據加密,它通常只是用來做身份認證,因為它的密鑰太長,加密速度太慢–公鑰加密算法的速度甚至比對稱加密算法的速度慢上3個數量級(1000倍)。
6.2、非對稱加密原理
小藍與小紅想要進行溝通,不能被小黑或其他人看到;(需求)
于是小紅自己做了個信箱,信箱上有鎖,鑰匙只有小紅自己有;(公鑰加密)
于是小藍每次與小紅溝通的時候,都會把信放在郵箱中,信箱大家都可以看到,都可以知道小紅的信箱位置;(公開公鑰)
小紅想要看信的內容的時候,需要拿著自己保管的私鑰,打開鎖,讀取信箱里的信。(私鑰解密)
- 過程2帶鎖的信箱,就是公鑰加密的過程。
- 過程4是私鑰解密的過程
- 公鑰(鎖) 私鑰(鑰匙)是生成的一對,且私鑰不對外,不傳遞,增加了安全性.
- 同樣的小紅想要給小藍發送信息時,小藍需要告訴小紅帶鎖信箱(公開公鑰),并通過鑰匙打開信箱
6.3、RSA加密算法
三位數學家Rivest、Shamir 和 Adleman 設計了一種算法,可以實現非對稱加密
6.3.1、RSA加密原理
(1)選擇一對不同的、足夠大的素數p,q。
?(2)計算n=pq。
? (3)計算f(n)=(p-1)(q-1),同時對p, q嚴加保密,不讓任何人知道。
? (4)找一個與f(n)互質的數e作為公鑰指數,且1<e<f(n)。
? (5)計算私鑰指數d,使得d滿足(d*e) mod f(n) = 1
? (6)公鑰KU=(e,n),私鑰KR=(d,n)。
? (7)加密時,先將明文變換成0至n-1的一個整數M。若明文較長,可先分割成適當的組, 然后再進行交換。 設密文為C,則加密過程為:C=M^e mod n。
? (8)解密過程為:M=C^d mod n。
RSA加密算法的安全性
當p和q是一個大素數的時候,從它們的積pq去分解因子p和q,這是一個公認的數學難題。
RSA加密算法的缺點
雖然RSA加密算法作為目前最優秀的公鑰方案之一,在發表三十多年的時間里,經歷了各種攻擊的考驗,逐漸為人們接受。但是,也不是說RSA沒有任何缺點。由于沒有從理論上證明破譯RSA的難度與大數分解難度的等價性。所以,RSA的重大缺陷是無法從理論上把握它的保密性能如何。
在實踐上,RSA也有一些缺點:
產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密;
分組長度太大,為保證安全性,n 至少也要 600 bits 以上,使運算代價很高,尤其是速度較慢。
6.3.2、python實現RSA加密
import rsa #生成公鑰和秘鑰PublicKey,PrivateKey=rsa.newkeys(999) print(PublicKey) print(PrivateKey) text="非對稱加密" #公鑰加密 en_data=rsa.encrypt(text.encode(),PublicKey) print(en_data) #私鑰解密 de_data=rsa.decrypt(en_data,PrivateKey) print(de_data.decode())#單獨構造公鑰 pubkey=rsa.PublicKey(5,3)結果:
PublicKey(3633767976638772494145124918801479992476887706891140141138898916359, 65537) PrivateKey(3633767976638772494145124918801479992476887706891140141138898916359, 65537, 3591518084239078509975288258775300312809419416102919266938563215673, 139069387608670880268883641030474037, 26129172200454915719136577551307) 公鑰加密: b'\x02\xf1\xe0\xfb\xf2\x1b\x8e\xc1.\x8al\xd2\x1a\x00\x8e\x07_,\xe3@\xfd\xe9\xabH\xc3/v\xd4' 私鑰解密: 非對稱加密總結
以上是生活随笔為你收集整理的爬虫学习笔记(十五)——加密解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫学习笔记(十三)—— scrapy-
- 下一篇: 爬虫学习笔记(十六)—— Seleniu