md5,base64,AES,RES基本使用

前言

别整那么多虚的,直接上怎么使用,哈哈

一、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()
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值