前言
别整那么多虚的,直接上怎么使用,哈哈
一、md5,base64,AES,RES使用步骤##先看MD5概要算法:
MD5
from hashlib import md5
obj = md5()
obj.update("hellohello".encode("utf-8"))
bs = obj.hexdigest()
print(bs)
提示:使用md5 加密时需要把 加密数据转成byte 不然会报错,按如上代码写就可以了
需要先下载安装crypto-js(npm install crypto-js) ,npm是node.js的命令,如果没有使用npm需要先安装nodeJS.
var CryptoJS = require('crypto-js');
// 原始数据
var data = '123456789';
// 生成MD5摘要
var md5Digest = CryptoJS.MD5(data).toString();
console.log(md5Digest);
base64 编码:
python 实例:
编码
data = "hello".encode("utf-8")
print(data)
# 把字节转化成b64
bs = base64.b64encode(data).decode()
print(bs)
解码
s = "eW91eQ=="
ret = base64.b64decode(s)
print(ret)
s = "eW91eQ" ---这个解释byte长度不足4的倍数
#填充为4的倍数
s += ("=" * (4 - len(s) % 4))
print("填充后", s)
ret = base64.b64decode(s).decode()
print(ret)
提示: base64 解密有个注意事项,如果秘钥长度不足4的倍数 需要填充 == 就行,补全代码如下:
以下数据长度不够的 示例:
s = "eW91eQ"
#填充为4的倍数
s += ("=" * (4 - len(s) % 4))
print("填充后", s)
ret = base64.b64decode(s).decode()
print(ret)
AES加密:
使用AES.new(key,mode,iv)中的参数说明:
- key为AES算法的工作密钥;(key 的长度只有三种:16个字节,24个字节,32个字节)
- data为要被加密或被解密的数据;
- Mode为AES的工作模式。最常用的模式就是 CBC 模式和 ECB模式
- ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
- CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或后再加密,这样做的目的是增强破解难度。
- iv:参数中的iv主要用于CBC模式,确保即使加密相同的明文,每次产生的密文也不相同,增强加密的安全性。iv通常是一个16字节的随机字符串。这个字符串在解密时也需要用到,因此需要妥善保存。
如下是使用python 示例:
使用python 加密前需要先安装 pycryptodome;安装命令:pip install pycryptodome
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
key = '0123456789abcdef'.encode() # 秘钥: 必须16字节
iv = b'abcdabcdabcdabcd' # 偏移量:16位/字节(字节类型)
text = '涵哥哥' # 加密内容
#设置加密内容的长度填充(位数为16的整数倍)
text = pad(text.encode(), 16)
#创建加密对象
aes = AES.new(key, AES.MODE_CBC, iv) # 创建一个aes对象
en_text = aes.encrypt(text) # 加密明文
print("aes加密数据:::", en_text) #返回二进制类型数据
#二进制密文转换成字符串格式
dd= base64.b64encode(en_text).decode() # 将返回的字节型数据转进行base64编码
print(f"base64转码后的数据::{dd}")
python 解密:
from Crypto.Cipher import AES
import base64
from Crypto.Util.Padding import unpad
key = '0123456789abcdef'.encode()
iv = b'abcdabcdabcdabcd'
aes = AES.new(key, AES.MODE_CBC, iv)
#需要解密的文本
text = '7lzb36wp/hdLfd+yTZXdbw=='.encode()
#将密文数据转换为二进制类型
ecrypted_base64 = base64.b64decode(text)
source = aes.decrypt(ecrypted_base64) # 解密
#未填充数据
print("aes解密数据:::", source.decode())
#取消填充数据
print("aes解密数据:::", unpad(source, 16).decode())
提示:此AES 加解密中的案例使用了 CBC 模式, 没用ECB模式,因为这个模式用法几乎一模一样,只是CBC 模式有个偏移量需要设置, iv 就是代表的偏移量,ECB new实例:AES.new(key, AES.MODE_EBC)
如下是使用js 示例:
提示:需要先下载安装crypto-js(npm install crypto-js) ,npm是node.js的命令,如果没有使用npm需要先安装nodeJS.
加密案例
const CryptoJS = require("crypto-js")
// 密钥(128位,16字节)
var key = CryptoJS.enc.Utf8.parse('0123456789abcdef');
// 初始化向量(IV)(128位,16字节)
var iv = CryptoJS.enc.Utf8.parse('1234567890abcdef');
// 待加密的数据
var plaintext = '涵哥哥';
// 进行AES-128加密,使用CBC模式和PKCS7填充
var encrypted = CryptoJS.AES.encrypt(plaintext, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// 获取加密后的密文
var ciphertext = encrypted.toString();
console.log(ciphertext);
解密案例:
const CryptoJS = require("crypto-js")
// 密钥(128位,16字节)
var key = CryptoJS.enc.Utf8.parse('0123456789abcdef');
// 初始化向量(IV)(128位,16字节)
var iv = CryptoJS.enc.Utf8.parse('1234567890abcdef');
// 密文数据
var encrypText = 'iB0EjuAeL59NlUFVVnyk+Q==';
// 进行解密,使用CBC模式和PKCS7填充
var decrypted = CryptoJS.AES.decrypt(encrypText, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// 解密
var plaintext = decrypted.toString(CryptoJS.enc.Utf8);
console.log(plaintext);
RSA加密
- RSA加密:
- RSA加密算法是一种非对称加密算法。
- 非对称加密算法:
- 非对称加密算法需要两个密钥:
- 公开密钥(publickey:简称公钥)
- 私有密钥(privatekey:简称私钥)
- 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
- 非对称加密算法需要两个密钥:
公钥私钥生成方式:
- 公私匙可以在线生成
- http://web.chacuo.net/netrsakeypair
Python代码示例:
创建公钥私钥
from Crypto.PublicKey import RSA
# 通过相关算法生成唯一秘钥
rsakey = RSA.generate(1024)
#将秘钥保存到文件中
with open("rsa.public.pem", mode="wb") as f:
f.write(rsakey.publickey().exportKey())
with open("rsa.private.pem", mode="wb") as f:
f.write(rsakey.exportKey())
加密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
# 加密
data = "涵哥哥"
with open("rsa.public.pem", mode="r") as f:
pk = f.read()
rsa_pk = RSA.importKey(pk)
#基于公钥创建加密对象
rsa = PKCS1_v1_5.new(rsa_pk)
result = rsa.encrypt(data.encode("utf-8"))
# 处理成b64方便传输
b64_result = base64.b64encode(result).decode("utf-8")
print(b64_result)
解密:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
data = 'quyJ02ngabxFLnlvIqSKeH18IS6IzNtuevMwdHMo6b1SRT5ojHIemmOIG7p0xH6NAKol1Wm9LAlKStKsSiW6nxE895sXSOT/r/fYpEstmoVHniJlZDHBpQIDQUqVofBpadZ1BIMRTLGvbosCL9kgIVE7Fg7u9uPm8/CVTq5eAzU='
# 解密
with open("rsa.private.pem", mode="r") as f:
prikey = f.read()
rsa_pk = RSA.importKey(prikey)
#创建解密对象
rsa = PKCS1_v1_5.new(rsa_pk)
result = rsa.decrypt(base64.b64decode(data), None)
print("rsa解密数据:::", result.decode("utf-8"))
js代码示例:
提示:需要先安装 jsencrypt 库 命令:npm install jsencrypt
window = globalThis;
const JSEncrypt = require('jsencrypt');
var PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALyBJ6kZ/VFJYTV3vOC07jqWIqgyvHulv6us/8wzlSBqQ2+eOTX7s5zKfXY40yZWDoCaIGk+tP/sc0D6dQzjaxECAwEAAQ==-----END PUBLIC KEY-----';
//私钥
var PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvIEnqRn9UUlhNXe84LTuOpYiqDK8e6W/q6z/zDOVIGpDb545NfuznMp9djjTJlYOgJogaT60/+xzQPp1DONrEQIDAQABAkEAu7DFsqQEDDnKJpiwYfUE9ySiIWNTNLJWZDN/Bu2dYIV4DO2A5aHZfMe48rga5BkoWq2LALlY3tqsOFTe3M6yoQIhAOSfSAU3H6jIOnlEiZabUrVGqiFLCb5Ut3Jz9NN+5p59AiEA0xQDMrxWBBJ9BYq6RRY4pXwa/MthX/8Hy+3GnvNw/yUCIG/3Ee578KVYakq5pih8KSVeVjO37C2qj60d3Ok3XPqBAiEAqGPvxTsAuBDz0kcBIPqASGzArumljkrLsoHHkakOfU0CIDuhxKQwHlXFDO79ppYAPcVO3bph672qGD84YUaHF+pQ-----END PRIVATE KEY-----';
//使用公钥加密
var encrypt = new JSEncrypt();//实例化加密对象
encrypt.setPublicKey(PUBLIC_KEY);//设置公钥
var encrypted = encrypt.encrypt('涵哥哥');//对指定数据进行加密
console.log(encrypted);//使用私钥解密
//使用私钥解密
var decrypt = new JSEncrypt();
decrypt.setPrivateKey(PRIVATE_KEY);//设置私钥
var uncrypted = decrypt.decrypt(encrypted);//解密
console.log(uncrypted);
特别提示:对数据进行加解密前 必须要将数据数据转成二进制,有两种方式 如下:
方式一:
data = b'123456789'
方式二:
data = '123456789'.encode()