爬虫学习笔记(十五)——加密解密
文章目錄
- 一、概念和作用
- 1.1、概念
- 1.2、作用
- 1.3、常用加密方式
- 二、字符編碼
- 2.1、進(jìn)制間轉(zhuǎn)換方法(python)
- 2.2、unicode
- 三、Base64編碼原理
- 3.1、概念
- 3.2、作用
- 3.3、Base64編碼表
- 3.4、文本到base64格式的轉(zhuǎn)換
- 3.5、BASE64編碼補(bǔ)碼
- 四、單向加密
- 4.1、概念
- 4.2、常見(jiàn)方法
- 4.2.1、md5加密
- 4.2.2、sha加密
- 五、對(duì)稱加密
- 5.1、概念與簡(jiǎn)介
- 5.2、DES
- 5.2.1、概念
- 5.2.2、DES加密原理
- 5.2.3、python實(shí)現(xiàn)DES加密
- 5.3、3DES
- 5.3.1、概念
- 5.3.2、加密原理
- 5.4、AES
- 5.4.1、概念
- 5.4.2、加密過(guò)程
- 5.4.3、python實(shí)現(xiàn)AES加密
- 六、非對(duì)稱加密
- 6.1、概念與簡(jiǎn)介
- 6.2、非對(duì)稱加密原理
- 6.3、RSA加密算法
- 6.3.1、RSA加密原理
- 6.3.2、python實(shí)現(xiàn)RSA加密
一、概念和作用
1.1、概念
加密解密:一個(gè)信息干擾的過(guò)程,保證固定的人才可以看到你的信息
把重要的數(shù)據(jù)變?yōu)閬y碼(加密)傳送,
到達(dá)目的地后再用相同或不同的手段還原(解密)
1.2、作用
網(wǎng)絡(luò)信息傳輸安全涉及到很多個(gè)方面,其中主要有三個(gè)要解決的問(wèn)題:
- 保密性(Confidentiality):信息在傳輸時(shí)不被泄露
- 完整性(Integrity):信息在傳輸時(shí)不被篡改
- 有效性(Availability):信息的使用者是合法的
1.3、常用加密方式
| 對(duì)稱加密 | 指數(shù)據(jù)加密和解密使用相同的密鑰 | 數(shù)據(jù)的機(jī)密性 | DES, AES |
| 非對(duì)稱加密 | 也叫公鑰加密,指數(shù)據(jù)加密和解密使用不同的密鑰–密鑰對(duì)兒 | 身份驗(yàn)證 | DSA,RSA |
| 單向加密 | 指只能加密數(shù)據(jù),而不能解密數(shù)據(jù) | 數(shù)據(jù)的完整性 | MD5,SHA系列算法 |
二、字符編碼
2.1、進(jìn)制間轉(zhuǎn)換方法(python)
十進(jìn)制與二進(jìn)制
>>> bin(255) #十進(jìn)制轉(zhuǎn)二進(jìn)制 '0b11111111'>>> int("0b11111111",2) #二進(jìn)制轉(zhuǎn)十進(jìn)制 255十進(jìn)制與十六進(jìn)制
>>> hex(255) #十進(jìn)制轉(zhuǎn)十六進(jìn)制 '0xff'>>> int('0xff',16) #十六進(jìn)制轉(zhuǎn)十進(jìn)制 2552.2、unicode
字符和unicode編號(hào)是一一對(duì)應(yīng)的關(guān)系,世界上的每個(gè)字符都對(duì)應(yīng)著一個(gè)unicode編號(hào),根據(jù)編號(hào)可以進(jìn)行多種編碼。utf-8、utf-16、utf-32、…、gbk編碼等。
>>>ord('學(xué)') 23398 >>>chr(23398) '學(xué)'>>>'學(xué)'.encode('utf-8') #漢字中utf-8編碼 b'\xe5\xad\xa6' >>>'學(xué)'.encode('gbk') #漢字中g(shù)bk編碼 b'\xd1\xa7'注意:轉(zhuǎn)什么編碼,解碼時(shí)就要用什么編碼,例如:
>>>'學(xué)'.encode('gbk') b'\xd1\xa7' >>>b'\xd1\xa7'.decode('gbk') '學(xué)' >>>b'\xd1\xa7'.decode('utf-8') '?'三、Base64編碼原理
3.1、概念
Base64就是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的方法。
3.2、作用
在參數(shù)傳輸?shù)倪^(guò)程中經(jīng)常遇到的一種情況:使用全英文的沒(méi)問(wèn)題,但一旦涉及到中文就會(huì)出現(xiàn)亂碼情況。
網(wǎng)絡(luò)上傳輸?shù)淖址⒉蝗强纱蛴〉淖址?#xff0c;比如二進(jìn)制文件、圖片等。Base64的出現(xiàn)就是為了解決此問(wèn)題,它是基于64個(gè)可打印的字符來(lái)表示二進(jìn)制的數(shù)據(jù)的一種方法。
實(shí)例:
- 電子郵件剛問(wèn)世的時(shí)候,只能傳輸英文,但后來(lái)隨著用戶的增加,中文、日文等文字的用戶也有需求,但這些字符并不能被服務(wù)器或網(wǎng)關(guān)有效處理,因此Base64就登場(chǎng)了。隨之,Base64在URL、Cookie、網(wǎng)頁(yè)傳輸少量二進(jìn)制文件中也有相應(yīng)的使用。
- 對(duì)證書來(lái)說(shuō),特別是根證書,一般都是作Base64編碼的,因?yàn)樗诰W(wǎng)上被許多人下載。
- 電子郵件的附件一般也作Base64編碼的,因?yàn)橐粋€(gè)附件數(shù)據(jù)往往是有不可見(jiàn)字符的。
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格式的轉(zhuǎn)換
文本轉(zhuǎn)ASCII:ord()
ASCII轉(zhuǎn)文本:chr()
ASCII轉(zhuǎn)二進(jìn)制:bin()
3.5、BASE64編碼補(bǔ)碼
>>> 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'注意:
- 大多數(shù)編碼都是由字符串轉(zhuǎn)化成二進(jìn)制的過(guò)程,而B(niǎo)ase64的編碼則是從二進(jìn)制轉(zhuǎn)換為字符串。與常規(guī)恰恰相反;
- Base64編碼主要用在傳輸、存儲(chǔ)、表示二進(jìn)制領(lǐng)域,不能算得上加密,只是無(wú)法直接看到明文。也可以通過(guò)打亂Base64編碼來(lái)進(jìn)行加密。
- 計(jì)算機(jī)二進(jìn)制存儲(chǔ)數(shù)據(jù)是以8位為一字節(jié)進(jìn)行存儲(chǔ),然而B(niǎo)ASE64編碼是以6位表示一字節(jié),這樣相鄰的數(shù)據(jù)變化了之后會(huì)影響后面整個(gè)的編碼結(jié)果。
四、單向加密
4.1、概念
單向加密是指只能對(duì)明文數(shù)據(jù)進(jìn)行加密,而不能解密數(shù)據(jù)。
例:每個(gè)人都有不同的指紋,看到這個(gè)人,可以得出他的指紋等信息,并且唯一對(duì)應(yīng),但你只看一個(gè)指紋,是不可能看到或讀到這個(gè)人的長(zhǎng)相或身份等信息。
4.2、常見(jiàn)方法
MD5 (message-digest algorithm) SHA (Secure Hash Algorithm)
注意:
4.2.1、md5加密
from hashlib import md5md5_obj=md5() #創(chuàng)建md5算法加密對(duì)象 md5_obj.update("加密數(shù)據(jù)".encode())#參數(shù):內(nèi)容是要加密數(shù)據(jù) 二進(jìn)制格式 md5_obj.hexdigest() #結(jié)果: '648bfc23726d2e76af569f6fea26c1f8'md5_obj.update("加密數(shù)據(jù)".encode()) md5_obj.hexdigest() #同一個(gè)md5對(duì)象兩次調(diào)用update 第二次保留第一次調(diào)用的信息 # 結(jié)果: '47c58fbd984d00c4c0c24396be4ed52f'4.2.2、sha加密
from hashlib import sha256 sha256_obj=sha256()#創(chuàng)建sha算法加密對(duì)象 sha256_obj.update("加密數(shù)據(jù)".encode())#參數(shù):內(nèi)容是要加密數(shù)據(jù) 二進(jìn)制格式 sha256_obj.hexdigest() #結(jié)果:'fc016213ebd4e12fd50ebeee2a074d09aef8b4dffa247401227976cfdec1ebf9'sha256_obj.update("加密數(shù)據(jù)".encode())#參數(shù):內(nèi)容是要加密數(shù)據(jù) 二進(jìn)制格式 sha256_obj.hexdigest() #同一個(gè)sha對(duì)象兩次調(diào)用update 第二次保留第一次調(diào)用的信息 #結(jié)果: '5cbb02bfa5153ef91d29c8edcd213ffde626a9e6c0ac6d25e1d9ad6ddbca0078'注意:這種單向加密因?yàn)椴荒鼙唤饷?#xff0c;顯然是不能作為信息傳輸?shù)?#xff0c;不能解密的消息是沒(méi)有意義的。所以實(shí)際應(yīng)用中一般作為文件完整性的驗(yàn)證,加密結(jié)果相同就認(rèn)為文件在傳輸后也是完整的。
五、對(duì)稱加密
5.1、概念與簡(jiǎn)介
概念: 對(duì)稱加密是指數(shù)據(jù)加密與解密使用相同密鑰
簡(jiǎn)介: 常用的對(duì)稱加密 DES、3DES、 AES
???DES: Data Encryption Standard,秘鑰長(zhǎng)度為56位,8位校驗(yàn)位;
?????????????(2003年左右被破解–秘鑰可以暴力破解。 窮舉法)
???3DES:DES的改進(jìn)版本。
???AES: Advanced Encryption Standard,支持的秘鑰長(zhǎng)度包括 128bits,192bits,258bits,384bits,512bits。
特點(diǎn):
-
加密與解密使用的密鑰相同。
-
但是由于算法一般都是公開(kāi)的,因此機(jī)密性幾乎完全依賴于密鑰。
-
通常使用的是相對(duì)較小的密鑰,一般小于256bit。因?yàn)槊荑€越大,加密越強(qiáng),但加密與解密的過(guò)程越慢。
說(shuō)明: 秘鑰長(zhǎng)度越長(zhǎng),數(shù)據(jù)加密與解密的時(shí)間就越久
5.2、DES
5.2.1、概念
數(shù)據(jù)加密算法(Data Encryption Algorithm,DEA)是一種對(duì)稱加密算法,很可能是使用最廣泛的密鑰系統(tǒng),特別是在保護(hù)金融數(shù)據(jù)的安全中,最初開(kāi)發(fā)的DEA是嵌入硬件中的。
5.2.2、DES加密原理
DES 使用一個(gè) 56 位的密鑰以及附加的 8 位奇偶校驗(yàn)位,產(chǎn)生最大 64 位的分組大小。這是一個(gè)迭代的分組密碼,使用稱為 Feistel 的技術(shù),其中將加密的文本塊分成兩半。使用子密鑰對(duì)其中一半應(yīng)用循環(huán)功能,然后將輸出與另一半進(jìn)行“異或”運(yùn)算;接著交換這兩半,這一過(guò)程會(huì)繼續(xù)下去,但最后一個(gè)循環(huán)不交換。DES 使用 16 個(gè)循環(huán),使用異或,置換,代換,移位操作四種基本運(yùn)算。
5.2.3、python實(shí)現(xiàn)DES加密
安裝密碼庫(kù)
??????windows: pip install pycryptodomex
??????linux: pip install pycryptodome
from Cryptodome.Cipher import DESkey=b'12345678' #創(chuàng)建對(duì)象 des=DES.new(key,DES.MODE_ECB) #key是秘鑰 必須是8個(gè)字節(jié)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()) #王者榮耀注意:
- 設(shè)置的key是秘鑰,必須是8個(gè)字節(jié)
5.3、3DES
5.3.1、概念
3DES(或稱為Triple DES)是三重?cái)?shù)據(jù)加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當(dāng)于是對(duì)每個(gè)數(shù)據(jù)塊應(yīng)用三次DES加密算法。
由于計(jì)算機(jī)運(yùn)算能力的增強(qiáng),原版DES密碼的密鑰長(zhǎng)度變得容易被暴力破解。3DES即是設(shè)計(jì)用來(lái)提供一種相對(duì)簡(jiǎn)單的方法,即通過(guò)增加DES的密鑰長(zhǎng)度來(lái)避免類似的攻擊,而不是設(shè)計(jì)一種全新的塊密碼算法。
5.3.2、加密原理
3DES(即Triple DES)是DES向AES過(guò)渡的加密算法(1999年,NIST將3-DES指定為過(guò)渡的加密標(biāo)準(zhǔn)),加密算法,其具體實(shí)現(xiàn)如下:設(shè)Ek()和Dk()代表DES算法的加密和解密過(guò)程,K代表DES算法使用的密鑰,M代表明文,C代表密文,這樣:
-
3DES加密過(guò)程為:C=Ek3(Dk2(Ek1(M)))
-
3DES解密過(guò)程為:M=Dk1(EK2(Dk3( C)))
5.4、AES
5.4.1、概念
密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。
5.4.2、加密過(guò)程
AES為分組密碼,分組密碼也就是把明文分成一組一組的,每組長(zhǎng)度相等,每次加密一組數(shù)據(jù),直到加密完整個(gè)明文。
在AES標(biāo)準(zhǔn)規(guī)范中,分組長(zhǎng)度只能是128位,也就是說(shuō),每個(gè)分組為16個(gè)字節(jié)(每個(gè)字節(jié)8位)。
密鑰的長(zhǎng)度可以使用128位、192位或256位。密鑰的長(zhǎng)度不同,推薦加密輪數(shù)也不同,C = E(K,P)是加密函數(shù),在這個(gè)加密函數(shù)中會(huì)執(zhí)行10個(gè)加密輪函數(shù)。
| AES-128 | 4 | 4 | 10 |
| AES-192 | 6 | 4 | 12 |
| AES-256 | 8 | 4 | 14 |
5.4.3、python實(shí)現(xiàn)AES加密
from Cryptodome.Cipher import AES key=b"12345678abcdefgh" #構(gòu)建對(duì)象 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) #結(jié)果 b'\x93\xf9\xfaxj\xd6xt\x9a\xd6\xdb\xa3\x8c\xf8M\xdf' #解密 de_data=aes.decrypt(en_data) print(de_data.decode()) # 結(jié)果 王者六、非對(duì)稱加密
6.1、概念與簡(jiǎn)介
指的是加密和解密使用不同的秘鑰。
一把作為公開(kāi)的公鑰,另一把作為私鑰。這對(duì)密鑰中的公鑰進(jìn)行加密,私鑰用于解密。反之亦然(被私鑰加密的數(shù)據(jù)也可以被公鑰解密)。
在實(shí)際使用中私鑰一般保存在發(fā)布者手中,是私有的不對(duì)外公開(kāi)的,只將公鑰對(duì)外公布,就能實(shí)現(xiàn)只有私鑰的持有者才能將數(shù)據(jù)解密的方法。 這種加密方式安全系數(shù)很高,因?yàn)樗挥脤⒔饷艿拿荑€進(jìn)行傳遞,從而沒(méi)有密鑰在傳遞過(guò)程中被截獲的風(fēng)險(xiǎn),而破解密文幾乎又是不可能的。
但是算法的效率低,所以常用于很重要數(shù)據(jù)的加密,常和對(duì)稱配合使用,使用非對(duì)稱加密的密鑰去加密對(duì)稱加密的密鑰。
事實(shí)上,公鑰加密算法很少用于數(shù)據(jù)加密,它通常只是用來(lái)做身份認(rèn)證,因?yàn)樗拿荑€太長(zhǎng),加密速度太慢–公鑰加密算法的速度甚至比對(duì)稱加密算法的速度慢上3個(gè)數(shù)量級(jí)(1000倍)。
6.2、非對(duì)稱加密原理
小藍(lán)與小紅想要進(jìn)行溝通,不能被小黑或其他人看到;(需求)
于是小紅自己做了個(gè)信箱,信箱上有鎖,鑰匙只有小紅自己有;(公鑰加密)
于是小藍(lán)每次與小紅溝通的時(shí)候,都會(huì)把信放在郵箱中,信箱大家都可以看到,都可以知道小紅的信箱位置;(公開(kāi)公鑰)
小紅想要看信的內(nèi)容的時(shí)候,需要拿著自己保管的私鑰,打開(kāi)鎖,讀取信箱里的信。(私鑰解密)
- 過(guò)程2帶鎖的信箱,就是公鑰加密的過(guò)程。
- 過(guò)程4是私鑰解密的過(guò)程
- 公鑰(鎖) 私鑰(鑰匙)是生成的一對(duì),且私鑰不對(duì)外,不傳遞,增加了安全性.
- 同樣的小紅想要給小藍(lán)發(fā)送信息時(shí),小藍(lán)需要告訴小紅帶鎖信箱(公開(kāi)公鑰),并通過(guò)鑰匙打開(kāi)信箱
6.3、RSA加密算法
三位數(shù)學(xué)家Rivest、Shamir 和 Adleman 設(shè)計(jì)了一種算法,可以實(shí)現(xiàn)非對(duì)稱加密
6.3.1、RSA加密原理
(1)選擇一對(duì)不同的、足夠大的素?cái)?shù)p,q。
?(2)計(jì)算n=pq。
? (3)計(jì)算f(n)=(p-1)(q-1),同時(shí)對(duì)p, q嚴(yán)加保密,不讓任何人知道。
? (4)找一個(gè)與f(n)互質(zhì)的數(shù)e作為公鑰指數(shù),且1<e<f(n)。
? (5)計(jì)算私鑰指數(shù)d,使得d滿足(d*e) mod f(n) = 1
? (6)公鑰KU=(e,n),私鑰KR=(d,n)。
? (7)加密時(shí),先將明文變換成0至n-1的一個(gè)整數(shù)M。若明文較長(zhǎng),可先分割成適當(dāng)?shù)慕M, 然后再進(jìn)行交換。 設(shè)密文為C,則加密過(guò)程為:C=M^e mod n。
? (8)解密過(guò)程為:M=C^d mod n。
RSA加密算法的安全性
當(dāng)p和q是一個(gè)大素?cái)?shù)的時(shí)候,從它們的積pq去分解因子p和q,這是一個(gè)公認(rèn)的數(shù)學(xué)難題。
RSA加密算法的缺點(diǎn)
雖然RSA加密算法作為目前最優(yōu)秀的公鑰方案之一,在發(fā)表三十多年的時(shí)間里,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受。但是,也不是說(shuō)RSA沒(méi)有任何缺點(diǎn)。由于沒(méi)有從理論上證明破譯RSA的難度與大數(shù)分解難度的等價(jià)性。所以,RSA的重大缺陷是無(wú)法從理論上把握它的保密性能如何。
在實(shí)踐上,RSA也有一些缺點(diǎn):
產(chǎn)生密鑰很麻煩,受到素?cái)?shù)產(chǎn)生技術(shù)的限制,因而難以做到一次一密;
分組長(zhǎng)度太大,為保證安全性,n 至少也要 600 bits 以上,使運(yùn)算代價(jià)很高,尤其是速度較慢。
6.3.2、python實(shí)現(xiàn)RSA加密
import rsa #生成公鑰和秘鑰PublicKey,PrivateKey=rsa.newkeys(999) print(PublicKey) print(PrivateKey) text="非對(duì)稱加密" #公鑰加密 en_data=rsa.encrypt(text.encode(),PublicKey) print(en_data) #私鑰解密 de_data=rsa.decrypt(en_data,PrivateKey) print(de_data.decode())#單獨(dú)構(gòu)造公鑰 pubkey=rsa.PublicKey(5,3)結(jié)果:
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' 私鑰解密: 非對(duì)稱加密總結(jié)
以上是生活随笔為你收集整理的爬虫学习笔记(十五)——加密解密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 爬虫学习笔记(十三)—— scrapy-
- 下一篇: 爬虫学习笔记(十六)—— Seleniu