整理一下关于Crypto加密的坑

  之前写接口一般不用加密(做了权限处理),最近公司要求接口加密,我开始了入坑之路

  因为公司其他人用的AES和DES加密,我就在网上查了下关于这方面的使用方法。

  首先安装Crypto

  pip install Crypto

  安装成功,但是这个包是1.4.1根本不支持python3.6版本,

  然后就下载pycrypto:pip install pycrypto,但是报错(需要安装visual C++ 2015 14.0版本),感觉麻烦就没弄。。

  之后就网上下载pycrypto的包,将里面的Crypto放到C:\Python36\Lib\site-packages,网上找了一下代码,测试

  from Crypto.Cipher import AES这一块会报错,在源码中有一个import _AES(DES有一个import _DES),死活不行。。    接下来各种捣鼓,各种版本都是import那一块出错,实在不行,安装c++库,安完提示已安装c++其它版本,终止安装。。(这个时候心态已经崩了),

  !!!重点来了!

  接下来我在知乎上发布帖子,希望得到回复,有一个办法回复:安装Anaconda,自带 Crypto,网上查了下600多m,有点大,,,  就逛知乎,无意间看到。。pycryptodome模块,对,就是它,用pip安装,C:\Python36\Lib\site-package目录下就会有Crypto文件夹,  试了下代码,没有import错误

  之后,执行了下代码
#!/usr/bin/env python
#! usr/bin/python
# coding: utf8
import os,django
from django.conf import settings
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tuling.settings")# project_name 项目名称
django.setup()
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
class Prpcrypt():
    """AES加密,采用CBC模式,这里key和iv值一样"""
    def __init__(self, key):
        self.key = key
        self.mode = AES.MODE_CBC
        # 加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数
    def encrypt(self, text):
        cryptor = AES.new(self.key, self.mode, self.key)#cryptor = AES.new(key,mode,iv)#
        # 这里密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.目前AES-128足够用
        length = 16
        count = len(text)
        if (count % length != 0):
            add = length - (count % length)
        else:
            add = 0
        text = text + (b‘\0‘ * add)
        self.ciphertext = cryptor.encrypt(text)
        # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
        # 所以这里统一把加密后的字符串转化为16进制字符串
        return b2a_hex(self.ciphertext)
        # 解密后,去掉补足的空格用strip() 去掉
    def decrypt(self, text):
        cryptor = AES.new(self.key, self.mode, self.key)
        plain_text = cryptor.decrypt(a2b_hex(text))
        return plain_text.rstrip(b‘\0‘)
pc = Prpcrypt(settings.AES_KEY.encode())  # 初始化密钥
# e = pc.encrypt(b‘0123456789ABCDEF‘)#加密
# d = pc.decrypt(e) #解密
# print(e.decode())
# print(d.decode())

  这个模块要在字符串前加b,不然会报错。

  参考:https://blog.csdn.net/nurke/article/details/77267081

  http://cakin24.iteye.com/blog/2384909

  https://blog.csdn.net/s740556472/article/details/78778522

原文地址:https://www.cnblogs.com/zhangningyang/p/9117626.html

时间: 2024-08-01 15:43:07

整理一下关于Crypto加密的坑的相关文章

crypto加密解密

加密Crypto# 使用require('crypto') 可以访问该模块. 加密模块要求底层系统的OpenSSL是支持的.它提供了一个安全证书,作为一个安全的HTTPS net或HTTP连接的一部分要用于封装方式. 它还提供了一套OpenSSL的哈希,HMAC,加密,解密,签名和验证方法的包装. crypto.createCredentials(details)# 创建一个认证对象,detail是可选的钥(key)字典的参数. key : 存储PEM编码私钥的字符串 cert : 存储PEM编

AES加密 C++调用Crypto++加密库 例子

这阵子写了一些数据加密的小程序,对比了好几种算法后,选择了AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),听这名字就很厉害的样子 估计会搜索到这文章的,对AES算法已经有了些基本了解了吧,下面先简单介绍一下AES加密算法吧 (1)AES在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一. (2)AES加密数据块分组长度必须为128比特,密钥长度可以是128

nodeJS之crypto加密

前面的话 加密模块提供了 HTTP 或 HTTPS 连接过程中封装安全凭证的方法.也提供了 OpenSSL 的哈希,hmac, 加密(cipher), 解密(decipher), 签名(sign) 和 验证(verify) 方法的封装.本文将详细介绍加密crypto crypto [crypto.setEngine(engine[, flags])] 为某些/所有 OpenSSL 函数加载并设置引擎(根据参数 flags 来设置). engine 可能是 id,或者是指向引擎共享库的路径. fl

整理iOS9适配中出现的坑(图文)

本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级iOS9,也就逐渐的衍生出了一系列的问题,笔者也在赶忙为自己维护的App做适配,本文写的一些坑基本都是亲身体验了. 一.NSAppTransportSecurity iOS9让所有的HTTP默认使用了HTTPS,原来的HTTP协议传输都改成TLS1.2协议进行传输.直接造成的情况就是App发请求的时

bcrypt 加密的坑

const bcrypt = require('bcryptjs') //加密 //不存在,则存储 const newUser = new User({ name: ctx.request.body.name, email: ctx.request.body.email, password:  ctx.request.body.password }); //加密 await bcrypt.genSalt(10, (err, salt) => { bcrypt.hash(newUser.passw

crypto加密

/* hash.js */ var crypto = require('crypto'); module.exports = function(){ this.encode = function(){ var algorithm  = arguments[0] ? arguments[0] : '' , enstring   = arguments[1] ? arguments[1] : '' , returnType = arguments[2] ? arguments[2] : ''; if

2017最新整理移动Web开发遇到的坑

随着前端的热度不断升温,行业对前端的要求越来越高:精准无误的实现UI设计,已成为前端职业更加精细化的一种表现:随着移动互联网的发展.WebApp似乎一种不可逾越的鸿沟:越来越多的企业开始趋势于轻量级的设计,H5正在慢慢的发酵可以完成更多的原生体验:交互质量的提升,对前端更是一种质的飞越:前端作为门槛低,精深难的事实一直被论证,想成为真正大神,要经历痛苦的月球表面-满满的都是坑:只有爬过来的人,才有资格说:要改变.要革新.做架构~ 说了那么多,就是为了小伙伴们在前端的路上更加精细的学习:本文持续更

ruby的加密方法整理(des rsa加密 加签)

# coding:utf-8require 'openssl'require 'base64'#des加密并且base64编码def des_encrypt des_key, des_text des =OpenSSL::Cipher::Cipher.new("DES-ECB") des.encrypt des.key=des_key des_text="#{des_text}" result = des.update(des_text) result <&l

整理下react中常见的坑

其实有些也不能算是坑,有些是react的规定,或者是react的模式和平常的js处理的方式不同罢了 1.setState()是异步的this.setState()会调用render方法,但并不会立即改变state的值,state是在render方法中赋值的.所以执行this.setState()后立即获取state的值是不变的.同样的直接赋值state并不会出发更新,因为没有调用render函数. 2.组件的生命周期componentWillMount,componentDidMount 只有在