Python之加密算法
·
Base64编码
特点:
- 明文数据不会发生变化,加密结果也不会发生变化。
- 可逆:明文数据通过编码变成不认识的加密字符,对应编码解码之后可以得到编码前的明文数据。
- https://base64.us/
- 浏览器中的base64编码:window.atob() 和 window.btoa()
代码示例:
// Buffer 是js内置对象
// 编码
// from 从
// 123456 明文数据
// utf-8 当前的编码格式
// toString('base64') 将utf-8格式数据转换为base64编码格式的字符串
const data = Buffer.from('123456', 'utf-8').toString('base64')
console.log(data)
// 解码 将base64格式数据转换为utf-8编码格式的字符串
const result = Buffer.from('MTIzNDU2', 'base64').toString('utf-8')
console.log(result)
MD5加密算法
特点:
- 明文数据不会发生变化,加密的结果也不会发生变化;
- 长度固定是32位,结果不可逆;
- 常用使用场景:请求头参数,载荷参数,签名认证,服务器身份验证;
代码示例:
// nodejs内置模块,导入
const Crypto = require('crypto');
// 创建md5 hash对象
const obj = Crypto.createHash('md5')
// md5加密
obj.update('123456')
// 加密结果转为(固定为)字符串
// hex: 16进制
// digest:返回的结果长度固定为32位
let md5_str = obj.digest('hex')
console.log(md5_str)
链式结构书写方式:
const Crypto = require('crypto')
// 创建md5加密,update是加密的方式,加密为16进制格式
function create_md5(data) {
return Crypto.createHash('md5').update(data).digest('hex')
}
对称加密算法
特点:
- AES的密钥一般是16 24 32 个字节,偏移量是固定16个字节;
- DES密钥和偏移量都是固定的8个字节;
- 可逆;
- AES(Advanced Encryption Standard)加密:这是当前广泛使用的对称加密算法之一。AES 可以使用128位、192位或256位密钥,并且在安全性和性能方面都表现出色。它被广泛用于保护敏感数据,如银行交易、电子邮件传输等。
注:128位密钥→10轮192位密钥 →12轮256位密钥→14轮 - DES(Data Encryption Standard)加密:DES 是最早的对称加密标准之一,使用56位密钥+8位校验。由于DES 的密钥长度较短,因此在安全性方面已经不再被认为是最佳选择,因此逐渐被 AES 所取代。
- DES(Triple DES):为了加强 DES 的安全性,3DES 使用了类似于三次的 DES 加密过程。它使用了两个密钥或者三个密钥,可以提供较高的安全性,但相对于AES 而言,性能较低。
固定加密和解密方法:
- 加密方法:encrypt()
- 解密方法:decrypt()
对称加密需要安装第三方包:
npm install crypto-js
AES加密 (更安全,常用)
- AES加密密钥是字节,所以需要把字符串转为字节。
- 网站中请求头参数,载荷参数都会加密。
- 三大关联:密钥,偏移量,配置选项。
- 明文数据不变,密文会发生变化(根据偏移量变化)。
示例代码:
const CryptoJS = require('crypto-js')
// 密钥的长度一般是 16 24 32 字节
let key = CryptoJS.enc.Utf8.parse('1234567890abcdef')
// 偏移量
const iv = CryptoJS.enc.Utf8.parse('1234567890abcdef')
// 配置选项
const config = {
mode: CryptoJS.mode.CBC, // 模式 CBC使用偏移量;ECB不使用偏移量
padding: CryptoJS.pad.Pkcs7, // 填充
iv: iv // 偏移量
}
// AES加密
let result = CryptoJS.AES.encrypt('123456', key, config)
console.log(result.toString())
// AES解密
let result2 = CryptoJS.AES.decrypt(result, key, config)
console.log(result2.toString(CryptoJS.enc.Utf8))
DES加密
直接上代码:
const CryptoJS = require('crypto-js')
// 密钥 8个字节
const key = CryptoJS.enc.Utf8.parse('12345678')
// 偏移量
const iv = CryptoJS.enc.Utf8.parse('abcdefgh')
// 配置项
const config = {
mode: CryptoJS.mode.CBC, // 模式 CBC使用偏移量;ECB不使用偏移量
padding:CryptoJS.pad.Pkcs7, // 填充
iv: iv // 偏移量
}
// DES加密
let result = CryptoJS.DES.encrypt('12345678', key, config)
console.log(result.toString())
// DES解密
let result2 = CryptoJS.DES.decrypt(result, key, config)
console.log(result2.toString(CryptoJS.enc.Utf8))
非对称加密算法
特点:
- 明文数据不变,密文数据改变(即每次生成的密码不一样);
- 需要公钥和私钥;
- 公钥用来加密,私钥用来解密;
- 公钥是对外公开的,外界通信很容易可以获取到,而私钥是不公开的;
- rsa加密;
- 生成公钥和私钥的网址:https://www.bchrt.com/tools/rsa/
- 密文数据的长度根据公钥长度(512位 1024位 2048位 3072位 4096位)不同,密文长度不同;
- 可逆;
固定加密和解密方法
- 加密方法:encrypt()
- 解密方法:decrypt()
非对称加密需要安装第三方模块:
npm install jsencrypt
示例代码:
// 导包
const JSEncrypt = require('jsencrypt')
// 实例化对象
const jse = new JSEncrypt()
// RSA加密
// 加密需要用公钥
const public_key =
'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMdbt+VBSO7lWHvxmuQYvLM093EfxxUr\n' +
'MilvJZjySQOkUenDm+mUfPePZHxBcL0ZJO6tq4KbUQzJQ+DI32mBeAMCAwEAAQ=='
// 设置公钥
jse.setPublicKey(public_key)
// 加密
let result = jse.encrypt('123456')
console.log(result)
// RSA 解密
// 解密需要私钥
const private_key =
'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAx1u35UFI7uVYe/Ga\n' +
'5Bi8szT3cR/HFSsyKW8lmPJJA6RR6cOb6ZR8949kfEFwvRkk7q2rgptRDMlD4Mjf\n' +
'aYF4AwIDAQABAkBEdug50GjmulbgAgJqsWAkv1z3Oa2aRIJunmAwHY0btXjJeS5B\n' +
'tH40m1kNOha6HUwFHlh5V4QqG+HPKv/AZX5BAiEA5OevcNLff407CNVXbxZ0HnGq\n' +
'tl6N23LFWaZn3mbD4eMCIQDe9LP6vPSp9h++oq5n7QFh9IoN1n3jUmE66pRWONVr\n' +
'YQIgaXXcvIxK8EcvNaik+cdMhGI2FoOFs98y0VT7cdnC0aUCIDNthHpozZLKyAXE\n' +
'JrCoNbJvosyQVldyMCVT6MV+tJPhAiEA3/gB1ISfWqyYx9KILvc4RP5mCJWwR489\n' +
'qca//QYlhp0='
// 设置私钥
jse.setPrivateKey(private_key)
// 解密
let result2 = jse.decrypt(result)
console.log(result2)
相关资料
python加密是js代码加密,因为是在浏览器中抓包,所以需要在python代码中执行js代码。
在python文件中运行js代码,需要安装第三方包:
pip install PyExecJs
在python文件中需要执行的js代码:
function func1(a, b) {
return a + b
}
function func2(a, b) {
return a - b
}
python代码,执行js:
import execjs
with open('./js函数.js', 'r', encoding="utf-8") as f:
data = f.read()
# python不能直接执行就是代码,需要先编译
js_code = execjs.compile(data)
# 参数1是函数名,后面的是传入的参数,多个参数依次往后写
result = js_code.call('func1', 1, 2)
更多推荐
所有评论(0)