【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-信息安全(四)-数据 ...
随机推荐
- Unable to find the ncurses libraries的解决办法
我们在更新CentOS或者Ubuntu的内核时,执行make menuconfig可能看如这样的错误: *** Unable to find the ncurses libraries or the* ...
- spring-java项目中连接redis数据库
最近由于项目需要,要从redis数据库中查询一些数据,还没有了解过redis,只好硬着头皮上阵,记录一下连接过程: 1.需要导入两个jar包:jedis.jar,spring-data-redis.j ...
- SystemVerilog语言简介(一)
1. 接口(Interface) Verilog模块之间的连接是通过模块端口进行的.为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识.不幸的是,在设计的早期,我们很难把握设计 ...
- C#简单工厂和抽象类的实例
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...
- Spring Boot 文件上传
其实网上已经有很多这样的文章了.为什么我还要记录一下呢?原因是在工作中对接外系统时,碰到了他们调取我们文件上传接口确存在着http请求头部规范的情况,从而导致用传统方法获取不到参数.今天就来整理下Sp ...
- 复制粘贴之不带插件的jquery
一.实现点击按钮,复制文本框中的的内容 <script type="text/javascript"> function copyUrl2() { var Url2=d ...
- 内置函数:filter函数
功能: filter函数用于过滤序列,将满足条件的元素取出来构成新的序列. 用法: filter(function, iterable) 接受两个参数,第一个函数为过滤函数(返回True后者False ...
- Docker 小记 — MySQL 与 Redis 配置
前言 本篇随笔是继 "Docker Engine" 与 "Compose & Swarm" 之后的一个实例补充,初衷是记录测试环境中的一次 MySQL ...
- CASE WHEN用法
问题:假如说这个条件有一条数据不满足,那么那条数据就不会读出来,,那么,我怎么才能把它读出并且赋值为空呢 方法: SELECT `s`.*, ( CASE THEN SUM(a.total_numbe ...
- ssm框架之将数据库的数据导入导出为excel文件
在这里首先我要将自己遇到的各种问题,以及需求记录下来,做一个备忘,便于以后查看: 需求:主要实现两个功能,将oracle数据库里的数据导出为excel,同时需要将excel表格的数据导入到数据库 环境 ...