編碼解碼-加密_第1頁
編碼解碼-加密_第2頁
編碼解碼-加密_第3頁
編碼解碼-加密_第4頁
編碼解碼-加密_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

編碼解碼-加密1.編碼解碼編碼是信息從一種形式或格式轉(zhuǎn)換為另一種形式的過程,也稱為計(jì)算機(jī)編程語言的代碼簡(jiǎn)稱編碼。用預(yù)先規(guī)定的方法將文字、數(shù)字或其它對(duì)象編成數(shù)碼,或?qū)⑿畔ⅰ?shù)據(jù)轉(zhuǎn)換成規(guī)定的電脈沖信號(hào)。編碼在點(diǎn)擊計(jì)算機(jī)、遙控和通訊等方面廣泛使用。編碼是信息從一種形式或格式轉(zhuǎn)換為另一種形式的過程。解碼就是編碼的逆過程。編碼制定時(shí)間作用所占字節(jié)數(shù)ASCII1967年表示英語及西歐語言8bit/1bytesGB23121980年國家簡(jiǎn)體中文字符集,兼容ASCII2bytesUnicode1991年國際標(biāo)準(zhǔn)組織統(tǒng)一標(biāo)準(zhǔn)字符集2bytesGBK1995年GBK2312的擴(kuò)展字符集,支持繁體字,兼容GB23122bytesUTF-81992年不定長(zhǎng)編碼1-3bytes第一種:ASCII碼ASCII(AmericanStandardCodeforInformationInterchange,美國信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),并等同于國際標(biāo)準(zhǔn)ISO/IEC646第二種:GBK和GB2312

對(duì)于我們來說能在計(jì)算機(jī)中顯示中文字符是至關(guān)重要的,然而ASCII表里連個(gè)偏旁部首也沒有。所以我們還需要一張關(guān)于中文和數(shù)字對(duì)應(yīng)的關(guān)系表。一個(gè)字節(jié)只能最多表示256個(gè)字符,要處理中文顯然一個(gè)字節(jié)是不夠的,所以我們需要采用兩個(gè)字節(jié)來表示,而且還不能和ASCII編碼沖突,所以,中國制定了GB2312編碼,用來把中文編進(jìn)去。第三種:Unicode因?yàn)楦鱾€(gè)國家都一套自己的編碼,就不可避免會(huì)有沖突,因此,Unicode應(yīng)運(yùn)而生。Unicode把所有語言都統(tǒng)一至『套編碼里,這樣就不會(huì)再有亂碼問題了。Unicode標(biāo)準(zhǔn)也在不斷發(fā)展,但最常用的是用兩個(gè)字節(jié)表示一個(gè)字符(如果要用到非常偏僻的字符,就需要4個(gè)字節(jié))?,F(xiàn)代操作系統(tǒng)和大多數(shù)編程語言都直接支持Unicode。注:在python中使用函數(shù)encode()進(jìn)行編碼,使用decode()進(jìn)行解碼。函數(shù)decode(char_set)可以實(shí)現(xiàn)從其他編碼到Unicode的轉(zhuǎn)換,函數(shù)encode(char_set)可以實(shí)現(xiàn)從Unicode到其他編碼方式的轉(zhuǎn)換。實(shí)驗(yàn)一:執(zhí)行以下python代碼,通過輸出,比較每種編碼的不同之處#-*-coding:utf-8-*-s='安全實(shí)驗(yàn)’s1=s.encode('utf-8')print(s1,type(s1))#utf-8print(s1,type(s1))#utf-8編碼s2=s1.decode("utf-8")#utf-8轉(zhuǎn)成Unicode,decode解碼)需要注明當(dāng)前編碼格式print(s2,type(s2))s3=s2.encode("gbk")#Unicode轉(zhuǎn)成gbk,encode(編碼)需要注明生成的編碼格式print(s3,type(s3))s4=s2.encode("utf-8")#Unicode轉(zhuǎn)成utf-8,encode(編碼)注明生成的編碼格式print(s4,type(s4))結(jié)果為:b'\xe5\xae\x89\xe5\x85\xa8\xe5\xae\x9e\xe9\xaa\x8c'<class'bytes'>安全實(shí)驗(yàn)<class'str'>b'\xb0\xb2\xc8\xab\xca\xb5\xd1\xe9'<class'bytes'>b'\xe5\xae\x89\xe5\x85\xa8\xe5\xae\x9e\xe9\xaa\x8c'<class'bytes'>2.加密1.前言加密方式,都是對(duì)二進(jìn)制編碼的格式進(jìn)行加密的,對(duì)應(yīng)到Python中,則是我們的Bytes。所以當(dāng)我們?cè)赑ython中進(jìn)行加密操作的時(shí)候,要確保我們操作的是Bytes,否則就會(huì)報(bào)錯(cuò)。將字符串和Bytes互相轉(zhuǎn)換可以使用encode()和decode()方法。如下所示:#方法中不傳參數(shù)則是以默認(rèn)的utf-8編碼進(jìn)行轉(zhuǎn)換In[1]:‘安全'.encode()Out[1]:b'\xe5\xae\x89\xe5\x85\xa8'In[2]:b'\xe5\xae\x89\xe5\x85\xa8'.decode()Out[2]:'安全’注:兩位十六進(jìn)制常常用來顯示一個(gè)二進(jìn)制字節(jié)。利用binascii模塊可以將十六進(jìn)制顯示的字節(jié)轉(zhuǎn)換成我們?cè)诩咏饷苤懈S玫娘@示方式:In[1]:importbinasciiIn[2]:'安全'.encode。Out[2]:b'\xe5\xae\x89\xe5\x85\xa8'In[3]:binascii.b2a_hex('安全'.encode())Out[3]:b'e5ae89e585a8'In[4]:binascii.a2b_hex(b'e5ae89e585a8')Out[4]:b'\xe5\xae\x89\xe5\x85\xa8'In[5]:binascii.a2b_hex(b'e5ae89e585a8').decode()Out[5]:‘安全’URL編碼正常的URL中是只能包含ASCII字符的,也就是字符、數(shù)字和一些符號(hào)。而URL編碼就是一種瀏覽器用來避免url中出現(xiàn)特殊字符(如漢字)的編碼方式。其實(shí)就是將超出ASCII范圍的字符轉(zhuǎn)換成帶%的十六進(jìn)制格式。例子:In[1]:fromurllibimportparse#quote()方法會(huì)自動(dòng)將str轉(zhuǎn)換成bytes,所以這里傳入str和bytes都可以In[2]:parse.quote('安全')Out[2]:'%E5%AE%89%E5%85%A8'In[3]:parse.unquote('%E5%AE%89%E5%85%A8')Out[3]:'安全'Base64編碼Base64是一種用64個(gè)字符來表示任意二進(jìn)制數(shù)據(jù)的方法。Base64編碼可以稱為密碼學(xué)的基石??梢詫⑷我獾亩M(jìn)制數(shù)據(jù)進(jìn)行Base64編碼。所有的數(shù)據(jù)都能被編碼為并只用65個(gè)字符就能表示的文本文件。(65字符:A?Za?z0-9+/=)編碼后的數(shù)據(jù)?二編碼前數(shù)據(jù)的4/3,會(huì)大1/3左右。原理b1b2b3n1n2n3n4.將所有字符轉(zhuǎn)化為ASCII碼。.將ASCII碼轉(zhuǎn)化為8位二進(jìn)制。.將二進(jìn)制3個(gè)歸成一組(不足3個(gè)在后邊補(bǔ)0)共24位,再拆分成4組,每組6位。.統(tǒng)一在6位二進(jìn)制前補(bǔ)兩個(gè)0湊足8位。.將補(bǔ)0后的二進(jìn)制轉(zhuǎn)為十進(jìn)制。.從Base64編碼表獲取十進(jìn)制對(duì)應(yīng)的Base64編碼。說明.轉(zhuǎn)換的時(shí)候,將三個(gè)byte的數(shù)據(jù),先后放入一個(gè)24bit的緩沖區(qū)中,先來的byte占高位。.數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的bit用0補(bǔ)足。然后,每次取出6個(gè)bit,按照其值選擇查表選擇對(duì)應(yīng)的字符作為編碼后的輸出。.不斷進(jìn)行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成。.如果最后剩下兩個(gè)輸入數(shù)據(jù),在編碼結(jié)果后加1個(gè)“=”。.如果最后剩下一個(gè)輸入數(shù)據(jù),編碼結(jié)果后加2個(gè)“=”。.如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。python使用Python內(nèi)置的base64模塊可以直接進(jìn)行base64的編解碼注意:用于base64編碼的,要么是松酊1包含的字符,要么是二進(jìn)制數(shù)據(jù)In[1]:importbase64In[2]:base64.b64encode(b'helloworld')Out[2]:b'aGVsbG8gd29ybGQ='In[3]:base64.b64decode(b'aGVsbG8gd29ybGQ=')Out[3]:b'helloworld'MD5(信息-摘要算法)message-digestalgorithm5(信息-摘要算法)。經(jīng)常說的“MD5加密”,就是信息摘要算法。md5,其實(shí)就是一種算法??梢詫⒁粋€(gè)字符串,或文件,或壓縮包,執(zhí)行md5后,就可以生成一個(gè)固定長(zhǎng)度為128bit的串。這個(gè)串就是唯一的。目前破解MD5加密的字符串只能通過查詢數(shù)據(jù)庫表中存儲(chǔ)的已知的密文來解密,因此只能破解少部分常用的密文。特點(diǎn).壓縮性:任意長(zhǎng)度的數(shù)據(jù),算出的MD5值長(zhǎng)度都是固定的。.容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易。.抗修改性:對(duì)原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕只修改1個(gè)字節(jié),所得到的MD5值都有很大區(qū)別。.強(qiáng)抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。.不可逆性:每個(gè)人都有不同的指紋,看到這個(gè)人,可以得出他的指紋等信息,并且唯一對(duì)應(yīng),但你只看一個(gè)指紋,是不可能看到或讀到這個(gè)人的長(zhǎng)相或身份等信息。舉個(gè)栗子:世界上只有一個(gè)我,但是但是妞卻是非常非常多的,以一個(gè)有限的我對(duì)幾乎是無限的妞,所以可能能搞定非常多(100+)的妞,這個(gè)理論上的確是通的,可是實(shí)際情況下....python使用由于MD5模塊在python3中被移除,在python3中使用hashlib模塊進(jìn)行md5操作importhashlib待加密信息str='這是一個(gè)測(cè)試‘創(chuàng)建md5對(duì)象hl=hashlib.md5()此處必須聲明encode若寫法為hl.update(str)報(bào)錯(cuò)為:Unicode-objectsmustbeencodedbeforehashinghl.update(str.encode(encoding='utf-8'))print('MD5加密前為:'+str)print('MD5加密后為:'+hl.hexdigest())運(yùn)行結(jié)果MD5加密前為:這是一個(gè)測(cè)試MD5加密后為:cfca700b9e09cf664f3ae80733274d9fmd5的長(zhǎng)度,默認(rèn)為128bit,也就是128個(gè)0和1的二進(jìn)制串。這樣表達(dá)是很不友好的。所以將二進(jìn)制轉(zhuǎn)成了16進(jìn)制,每4個(gè)bit表示一個(gè)16進(jìn)制,所以128/4=32換成16進(jìn)制表示后,為32位了。Python力口密庫PyCryptodomePyCrypto是Python中密碼學(xué)方面最有名的第三方軟件包,提供了許多加密算法的使用??上У氖?,它的開發(fā)工作于2012年就已停止。幸運(yùn)的是,有一個(gè)該項(xiàng)目的分支PyCrytodome取代了PyCrypto。DESDES算法為密碼體制中的對(duì)稱密碼體制,又被稱為美國數(shù)據(jù)加密標(biāo)準(zhǔn)。DES是一個(gè)分組加密算法,典型的DES以64位為分組對(duì)數(shù)據(jù)加密,加密和解密用的是同一個(gè)算法。DES算法的入口參數(shù)有三個(gè):Key、Data、Mode。其中Key為7個(gè)字節(jié)共56位,是DES算法的工作密鑰;Data為8個(gè)字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加密或解密。密鑰長(zhǎng)64位,密鑰事實(shí)上是56位參與DES運(yùn)算(第8、16、24、32、40、48、56、64位是校驗(yàn)位,使得每個(gè)密鑰都有奇數(shù)個(gè)1),分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組。python使用導(dǎo)入DES模塊fromCryptodome.CipherimportDESimportbinascii這是密鑰key=b,abcdefgh,需要去生成一個(gè)DES對(duì)象des=DES.new(key,DES.MODE_ECB)需要加密的數(shù)據(jù)text='安全’text=text+(8-(len(text)%8))*'='加密的過程encrypto_text=des.encrypt(text.encode())encrypto_text=binascii.b2a_hex(encrypto_text)print(encrypto_text)結(jié)果為b'084725d8f5ffafc61814fae0796bfd2f'3DES3DES(或稱為TripleDES)是三重?cái)?shù)據(jù)加密算法(TDEA,TripleDataEncryptionAlgorithm)塊密碼的通稱。它相當(dāng)于是對(duì)每個(gè)數(shù)據(jù)塊應(yīng)用三次DES加密算法。由于計(jì)算機(jī)運(yùn)算能力的增強(qiáng),原版DES密碼的密鑰長(zhǎng)度變得容易被暴力破解。3DES即是設(shè)計(jì)用來提供一種相對(duì)簡(jiǎn)單的方法,即通過增加DES的密鑰長(zhǎng)度來避免類似的攻擊,而不是設(shè)計(jì)一種全新的塊密碼算法。3DES(即TripleDES)是DES向AES過渡的加密算法(1999年,NIST將3-DES指定為過渡的加密標(biāo)準(zhǔn)),加密算法,其具體實(shí)現(xiàn)如下:設(shè)Ek()和Dk()代表DES算法的加密和解密過程,K代表DES算法使用的密鑰,M代表明文,C代表密文,這樣:3DES加密過程為:C=Ek3(Dk2(Ek1(M)))3DES解密過程為:M=Dk1(EK2(Dk3(C)))AES高級(jí)加密標(biāo)準(zhǔn)(英語:AdvancedEncryptionStandard,縮寫:AES),在密碼學(xué)中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來替代原先的DES,E經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級(jí)加密標(biāo)準(zhǔn)由美國國家標(biāo)準(zhǔn)與技術(shù)研究院小衛(wèi)丁)于2001年11月26日發(fā)布于FIPSPUB197,并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級(jí)加密標(biāo)準(zhǔn)已然成為對(duì)稱密鑰加密中最流行的算法之一。AES在軟件及硬件上都能快速地加解密,相對(duì)來說較易于實(shí)作,且只需要很少的存儲(chǔ)器。作為一個(gè)新的加密標(biāo)準(zhǔn),目前正被部署應(yīng)用到更廣大的范圍。特點(diǎn).抵抗所有已知的攻擊。.在多個(gè)平臺(tái)上速度快,編碼緊湊。.設(shè)計(jì)簡(jiǎn)單。發(fā)送方桂收方AES加密函數(shù)發(fā)送方桂收方AES加密函數(shù)AES解超困數(shù)AES為分組密碼,分組密碼也就是把明文分成一組一組的,每組長(zhǎng)度相等,每次加密一組數(shù)據(jù),直到加密完整個(gè)明文。在AES標(biāo)準(zhǔn)規(guī)范中,分組長(zhǎng)度只能是128位,也就是說,每個(gè)分組為16個(gè)字節(jié)(每個(gè)字節(jié)8位)。密鑰的長(zhǎng)度可以使用128位、192位或256位。密鑰的長(zhǎng)度不同,推薦加密輪數(shù)也不同。一般常用的是128位Python實(shí)現(xiàn)fromCryptodome.CipherimportAESfromCryptodomeimportRandomfrombinasciiimportb2a_hex要加密的明文data='安全實(shí)驗(yàn)'密鑰key長(zhǎng)度必須為16(AES-128)、24(AES-192)、或32(AES-256)Bytes長(zhǎng)度.目前AES-128足夠用key=b,thisisa16key,生成長(zhǎng)度等于AES塊大小的不可重復(fù)的密鑰向量iv=Random.new().read(AES.block_size)使用key和iv初始化AES對(duì)象,使用MODE_CFB模式mycipher=AES.new(key,AES.MODE_CFB,iv)加密的明文長(zhǎng)度必須為16的倍數(shù),如果長(zhǎng)度不為16的倍數(shù),則需要補(bǔ)足為16的倍數(shù)將iv(密鑰向量)加到加密的密文開頭,一起傳輸ciphertext=iv+mycipher.encrypt(data.encode())解密的話要用key和iv生成新的AES對(duì)象mydecrypt=AES.new(key,AES.MODE_CFB,ciphertext[:16])使用新生成的AES對(duì)象,將加密的密文解密decrypttext=mydecrypt.decrypt(ciphertext[16:])print('密鑰k為:',key)print('iv為:',b2a_hex(ciphertext)[:16])print('加密后數(shù)據(jù)為:',b2a_hex(ciphertext)[16:])print('解密后數(shù)據(jù)為:',decrypttext.decode())運(yùn)行結(jié)果:密鑰k為:b'thisisa16key'iv為:b'185445baf342d8ad'加密后數(shù)據(jù)為:b'eb32eef2c834bf3a46abb09b23289c28172aef70'解密后數(shù)據(jù)為:安全實(shí)驗(yàn)RSARSA加密算法是一種非對(duì)稱加密算法。在公開密鑰加密和電子商業(yè)中RSA被廣泛使用。該算法基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰,即公鑰,而兩個(gè)大素?cái)?shù)組合成私鑰。公鑰是可發(fā)布的供任何人使用,私鑰則為自己所有,供解密之用。非對(duì)稱加密典型的如RSA等,常見方法,使用openssl,keytools等工具生成一對(duì)公私鑰對(duì),使用被公鑰加密的數(shù)據(jù)可以使用私鑰來解密,反之亦然(被私鑰加密的數(shù)據(jù)也可以被公鑰解密)。在實(shí)際使用中私鑰一般保存在發(fā)布者手中,是私有的不對(duì)外公開的,只將公鑰對(duì)外公布,就能實(shí)現(xiàn)只有私鑰的持有者才能將數(shù)據(jù)解密的方法。這種加密方式安全系數(shù)很高,因?yàn)樗挥脤⒔饷艿拿荑€進(jìn)行傳遞,從而沒有密鑰在傳遞過程中被截獲的風(fēng)險(xiǎn),而破解密文幾乎又是不可能的。但是算法的效率低,所以常用于很重要數(shù)據(jù)的加密,常和對(duì)稱配合使用,使用非對(duì)稱加密的密鑰去加密對(duì)稱加密的密鑰。Python實(shí)現(xiàn)首先我們需要安裝一個(gè)rsa模塊:pipinstallrsa而且,因?yàn)镽SA加密算法的特性,RSA的公鑰私鑰都是10進(jìn)制的,但公鑰的值常常保存為16進(jìn)制的格式,所以需要將其用int()方法轉(zhuǎn)換為10進(jìn)制格式。importrsaimportbinascii#使用網(wǎng)頁中獲得的n和e值,將明文加密defrsa_encrypt(rsa_n,rsa_e,message):用n值和e值生成公鑰key=rsa.PublicKey(rsa_n,rsa_e)用公鑰把明文加密message=rsa.encrypt(message.encode(),key)轉(zhuǎn)化成常用的可讀性高的十六進(jìn)制message=binascii.b2a_hex(messa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論