【Python】 基于秘钥的对称加密
【Crypto】
关于用python进行信息的加密,类似的解决方案有很多比如用base64编码进行encode,再或者是hashlib来进行hash。但是还缺少一种明明场景很简单的解决方案,就是把利用一个秘钥,把一段明文加密然后用同一个秘钥可以把密文解密的这么一个简单的对称加密。
不信python会没有好的解决方案,就去网上找了一下。找到了利用Crypto这个模块来进行的。虽然安全性上python加密肯定不如静态语言加密的好,不过好歹有了一招比较像样的“防君子”之手段。
■ 使用
Crypto不是Python自带的模块,需要安装pip install pycrypto。另外在程序中还要用到binascii这个模块。这个模块在2.7中似乎已经是自带的了。
from Crypto.Cipher import AES
from binascii import a2b_hex,b2a_hex class Cryptor:
#创立一个加密解密用的类
def __init__(self,key):
self.key = self.modifyLength(key)
self.mode = AES.MODE_CBC def modifyLength(self,s):
length = len(s)
if length %16 == 0:
add = 0
else:
add = 16 - ( length % 16 )
return s + '\0' * add def encrypt(self,text):
text = self.modifyLength(text)
cryptor = AES.new(self.key,self.mode,b'')
rawText = cryptor.encrypt(text)
return b2a_hex(rawText)[0] def decrypt(self,text):
text = self.modifyLength(text)
cryptor = AES.new(self.key,self.mode,b'')
plain_text = cryptor.decrypt(a2b_hex(text))
return plain_text.rsplit('\0')[0]
上面这个类定义了四个方法,第二个方法modifyLength是将传入的字符串进行位数判断,如果不是16的整数倍则用'\0'(即空字符)补全到16的倍数位数比如32位64位等等。这些是AES加密要求的,它要求秘钥、被加密的字符串等位数都要是16位的整数倍的个数。
key自然是创建这个类对象时用的秘钥了,两个方法encrypt和decrypt分别用于加密和解密。加密后的数据是16进制的数据,如果直接用一些编码格式去编码解码的话可能会存在编解码失败的情况,如果想要避免,则可以在加密阶段的密文先做一个十六进制转二进制的处理,在这里用的就是binascii.b2a_hex方法。解密的时候同样记得调用a2b_hex这个方法。另外还需要注意的是解密后的内容要去除末尾的空字符(因用这个类加密时,原来的明文可能被末尾的空字符补充过)
【Python】 基于秘钥的对称加密的更多相关文章
- 【转】iOS安全之RSA加密/生成公钥、秘钥 pem文件
在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于 ...
- 对称加密,非对称加密,数字签名,https
对称加密和非对称加密 对称加密 概念:加密秘钥和解密秘钥使用相同的秘钥(即加密和解密都必须使用同一个秘钥) 特点:一对一的双向保密通信(每一方既可用该秘钥加密,也可用该秘钥解密,非对称加密是多对一的单 ...
- TLS握手秘钥套件分析
1.为了弄清楚TLS1.3的内部结构,觉得有必要将TLS的整个结构从新整理一遍,方便后续在做握手协议的形式化分析的时候能够不遗漏每个加密和认证的的环节. TLS1.3不论文在协议内容上还是性能上都较之 ...
- Linux下SSH以及SSH秘钥
一.基于秘钥方式实现远程连接 第一步:创建密钥对(在管理端服务器上操作) 中间的输入项可以直接回车 ssh-keygen -t dsa 第二步:分发公钥(在管理端服务器执行) 这个步骤需要输入一个ye ...
- pyDes 实现 Python 版的 DES 对称加密/解密--转
https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...
- 非对称加密 秘钥登录 https
非对称加密简介: 对称加密算法在加密和解密时使用的是同一个秘钥:而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)私有密钥(private key,简 ...
- ZeroMQ接口函数之 :zmq_z85_encode – 使用Z85算法对一个二进制秘钥进行加密,输出可打印的文本
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq-z85-encode zmq_z85_encode(3) ØMQ Manual - ØMQ/4. ...
- java加密算法--MD5加密和哈希散列带秘钥加密算法源码
package com.ompa.common.utils; import java.security.MessageDigest; import java.security.NoSuchAlgori ...
- java-信息安全(七)-基于非对称加密,对称加密等理解HTTPS
概述 java-信息安全(一)-BASE64,MD5,SHA,HMAC java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4 java-信息安全(四)-数据 ...
随机推荐
- rpm检验是否被改动过
参考原文http://vbird.dic.ksu.edu.tw/linux_basic/0520rpm_and_srpm.php#rpmmanager_verify rpm -qVa (当然可 ...
- 2.4 PCI总线的配置
PCI总线定义了两类配置请求,一个是Type 00h配置请求,另一个是Type 01h配置请求.PCI总线使用这些配置请求访问PCI总线树上的设备配置空间,包括PCI桥和PCI Agent设备的配置空 ...
- visualSFM的使用方法
VisualSFM是Changchang Wu编写的使用 Structure from Motion (SfM)进行3D重建的交互界面,具体内容详见http://ccwu.me/vsfm/.本人电脑环 ...
- Java中的“&”和“&&”的区别
Java中的"&"和"&&"的区别 1."&"是位运算符,"&&"是逻辑 ...
- 你还在为如何区分ASCII编码、GB2312编码、Unicod、UTF-8编码而烦恼吗,一篇文章让你柳暗花明
字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...
- 异常-----spring明明注入了Service到Action中,为什么运行的时候Service为空,在抽象类中,有子类来继承的
xml的配置文件 <bean id="fftController" class="com.bill99.query.controller.FftController ...
- Java中==与equals的区别及理解
区别: "==" 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致. 如果两个对象的引用相同时(指向同一对象时)," ...
- 在laravel环境下将图片存入MongoDB数据库
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- 对网易云音乐参数(params,encSecKey)的分析
我们如果对网易云音乐进行爬虫的话,我们会发现,提交的参数是(params,encSecKey),然而这两个参数是一串很长的东西 我们要对网易云进行爬虫,那么就一定要将这两个参数弄明白,然后才可以进行爬 ...
- 近期安卓与IOS招聘面试有感
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.你总是想一步登天,却不知道路是一步步走出来的 大概是放年假前一个月开始招聘吧,陆陆续续到目前为止安卓面试10几个,IOS面试了15个左右,本以为 ...