《Python密码算法例程》

《Python密码算法例程》

  • 一、哈希算法(以MD5为例,虽然MD5安全性存在缺陷,但常用于简单示例)
    • 1. 计算字符串的MD5哈希值
    • 2. 更安全的哈希算法 - SHA - 256
  • 二、对称加密算法(以AES为例)
    • 1. AES加密和解密简单示例(需要安装`pycryptodome`库)
    • 2. 示例用法
  • 三、非对称加密算法(以RSA为例)
    • 1. 生成RSA密钥对并进行加密解密(需要安装`cryptography`库)
    • 2. 生成密钥对

以下是一些常见的Python密码算法例程:

一、哈希算法(以MD5为例,虽然MD5安全性存在缺陷,但常用于简单示例)

1. 计算字符串的MD5哈希值

import hashlibdef md5_hash(string):m = hashlib.md5()m.update(string.encode('utf-8'))return m.hexdigest()string_to_hash = "password123"
print(md5_hash(string_to_hash))

这个函数将输入的字符串转换为字节串(因为update方法需要字节串参数),然后计算其MD5哈希值并以十六进制字符串的形式返回。

2. 更安全的哈希算法 - SHA - 256

import hashlibdef sha256_hash(string):sha256 = hashlib.sha256()sha256.update(string.encode('utf-8'))return sha256.hexdigest()input_str = "mysecret"
print(sha256_hash(input_str))

SHA - 256是一种广泛使用的安全哈希算法,用于密码存储等场景。它生成的哈希值长度为256位,相比MD5更难发生碰撞。

二、对称加密算法(以AES为例)

1. AES加密和解密简单示例(需要安装pycryptodome库)

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64def aes_encrypt(key, plaintext):cipher = AES.new(key, AES.MODE_CBC)padded_plaintext = pad(plaintext.encode('utf-8'), AES.block_size)ciphertext = cipher.encrypt(padded_plaintext)iv = cipher.ivreturn base64.b64encode(iv + ciphertext).decode('utf-8')def aes_decrypt(key, ciphertext):ciphertext_bytes = base64.b64decode(ciphertext)iv = ciphertext_bytes[:AES.block_size]cipher = AES.new(key, AES.MODE_CBC, iv)plaintext_padded = cipher.decrypt(ciphertext_bytes[AES.block_size:])plaintext = unpad(plaintext_padded, AES.block_size).decode('utf-8')return plaintext

2. 示例用法

encryption_key = b'mysecretkey123456'
text_to_encrypt = "This is a secret message"
encrypted_text = aes_encrypt(encryption_key, text_to_encrypt)
print("加密后的内容:", encrypted_text)
decrypted_text = aes_decrypt(encryption_key, encrypted_text)
print("解密后的内容:", decrypted_text)
  • 首先,aes_encrypt函数中,创建了一个AES加密对象,使用CBC(Cipher - Block Chaining)模式。将明文填充到块大小的整数倍(AES块大小一般为16字节),然后进行加密。初始向量(IV)与密文拼接后进行Base64编码返回。
  • aes_decrypt函数中,先对Base64编码的密文进行解码,提取出IV和真正的密文部分。然后使用相同的密钥和IV创建解密对象,对密文进行解密,最后去除填充并返回明文。

三、非对称加密算法(以RSA为例)

1. 生成RSA密钥对并进行加密解密(需要安装cryptography库)

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashesdef generate_rsa_key_pair():private_key = rsa.generate_private_key(public_exponent=65537,key_size=2048,backend=default_backend())public_key = private_key.public_key()private_pem = private_key.private_bytes(encoding=serialization.Encoding.PEM,format=serialization.PrivateFormat.PKCS8,encryption_algorithm=serialization.NoEncryption())public_pem = public_key.public_bytes(encoding=serialization.Encoding.PEM,format=serialization.PublicFormat.SubjectPublicKeyInfo)return private_pem, public_pemdef rsa_encrypt(public_key, plaintext):public_key_obj = serialization.load_pem_public_key(public_key,backend=default_backend())ciphertext = public_key_obj.encrypt(plaintext.encode('utf-8'),padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),algorithm=hashes.SHA256(),label=None))return ciphertextdef rsa_decrypt(private_key, ciphertext):private_key_obj = serialization.load_pem_private_key(private_key,password=None,backend=default_backend())plaintext = private_key_obj.decrypt(ciphertext,padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),algorithm=hashes.SHA256(),label=None))return plaintext.decode('utf-8')

2. 生成密钥对

private_key_pem, public_key_pem = generate_rsa_key_pair()
message = "这是一个秘密消息"
encrypted_message = rsa_encrypt(public_key_pem, message)
print("加密后的消息:", encrypted_message)
decrypted_message = rsa_decrypt(private_key_pem, encrypted_message)
print("解密后的消息:", decrypted_message)
  • generate_rsa_key_pair函数用于生成RSA密钥对,其中私钥格式为PKCS8,公钥格式为SubjectPublicKeyInfo,都采用PEM编码。
  • rsa_encrypt函数使用公钥对明文进行加密,采用OAEP(Optimal Asymmetric Encryption Padding)填充方式,结合SHA - 256哈希算法,以增强安全性。
  • rsa_decrypt函数使用私钥对密文进行解密,同样采用OAEP填充方式和SHA - 256哈希算法,最后将解密后的字节串转换为字符串返回。

这些只是密码算法在Python中的基本示例,在实际应用中,还需要考虑密钥管理、安全存储、性能优化等诸多因素。同时,密码学是一个复杂且敏感的领域,正确使用密码算法对于保障信息安全至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java时间处理SimpleDateFormat详解

文章目录 常用构造函数日期格式模式常见用法1. 格式化日期2. 解析日期字符串 注意事项示例扩展:指定区域和时区 SimpleDateFormat 是 Java 中用于日期和时间格式化的类,属于 java.text 包。它允许开发者将日期对象格式化为字符串,或者将字符…

夜莺运维指南之故障自愈

注意: 夜莺v7版本已内置故障自愈, 只需要更给n9e下的config.yaml 文件有关ibex配置即可 所谓的告警自愈,典型手段是在告警触发时自动回调某个 webhook 地址,在这个 webhook 里写告警自愈的逻辑,夜莺默认支持这种方式。另外,夜莺还…

【oracle】大数据删除插入

文章目录 引言本文目标 Oracle大数据插入操作插入操作的场景和需求使用并行查询进行数据插入示例代码:创建新表并插入数据解释代码中的关键点 性能优化建议 Oracle大数据删除操作删除操作的场景和需求使用游标和批量处理进行数据删除示例代码:批量删除数…

深入浅出:序列化与反序列化的全面解析

文章目录 1. 引言2. 什么是序列化?2.1 为什么需要序列化? 3. 什么是反序列化?3.1 反序列化的重要性 4. 序列化与反序列化的实现4.1 JSON (JavaScript Object Notation)4.2 XML (eXtensible Markup Language)4.3 Protocol Buffers (Protobuf)4…

Windows命令行使用技巧(持续更新)

删除指定目录下指定后缀的文件 重要的事情说在前面:不能恢复,谨慎操作 今天大意了,导出sql文件的时候没指定目录,默认放到桌面上了,看着桌面上密密麻麻的sql文件,我人傻了,一个一个删不是办法…

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代,音频设备的兼容性和性能成为了用户关注的重点。LDR6500,作为乐得瑞科技精心研发的USB Power Delivery(PD)协议芯片,凭借其卓越的性能和广泛的应用兼容性,为音频设备领域带来了新…

python rstrip 的迷惑行为

在项目中,我需要把字符串末尾的一部分去掉,类似截断,我用ide的随笔提示,发现了rstrip这个方法,然后我试了下,满足我的需求,但在测试过程中,我发现了rstrip的一些行为很让我迷惑。 开…

计算机网络编程(Linux):I/O多路转接之 select,poll

I/O多路复用(I/O Multiplexing)是一种高效的网络编程技术,允许一个线程同时监控多个文件描述符的状态,当某个文件描述符就绪时进行相应处理。这种技术在高并发服务器中广泛使用。本文将介绍I/O多路复用的核心概念及在Linux中的实现…

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见,在我们的网站上。鼠标滑入放大图片,滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】,里面有大量的css3动画效果制作原生知识分析&…

Spring Boot助力,一键解锁招聘全流程信息精细化管理

2系统相关技术 2.1 Java语言介绍 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的优势和广阔的前景&#…

深入理解 NumPy 广播机制:从基础到应用

目录 什么是广播机制?广播机制的规则广播机制示例1. 一维数组与标量运算2. 二维数组与一维数组运算3. 维度不同的数组运算4. 广播失败的情况 广播机制的实际应用场景1. 数据归一化2. 批量计算欧氏距离 总结广播机制的核心要点: 在使用 NumPy 进行数组操作…

Day28两个数组的交集

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 class Solution{public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> set new HashSet<>();for (int i :…

VRRP的知识点总结及实验

1、VRRP VRRP(Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议)既能够实现网关的备份&#xff0c;又能解决多个网关之间互相冲突的问题&#xff0c;从而提高网络可靠性。 2、VRRP技术概述&#xff1a; 通过把几台路由设备联合组成一台虚拟的“路由设备”…

DP协议:概括

来了来了&#xff01;&#xff01;&#xff01; 开始之前扯点概念&#xff0c;知道DP好在哪里&#xff0c;以及看到它的发展趋势&#xff0c;才知道我们为什么有学习的必要。 DP的优势 DisplayPort&#xff08;DP&#xff09;协议作为一种专为数字音频和视频传输设计的高速串行…

Ant Design Vue 中 Tree 组件复选框修改样式

一、问题 最近需要实现一个业务需求&#xff0c;要修改勾选框中的颜色&#xff0c;默认勾选框的颜色是蓝色&#xff0c;现在需要变成绿色。 1、官网示例&#xff1a; 2、业务需求&#xff1a; 3、具体实现&#xff1a; HTML 部分代码 <template><div class"s…

【JavaWeb后端学习笔记】登录校验(JWT令牌技术、Interceptor拦截器、Filter过滤器)

登录校验 1、JWT令牌技术1.1 JWT令牌介绍1.2 Java代码生成与校验JWT令牌 2、Filter过滤器2.1 Filter过滤器的简单实现2.2 配置拦截路径2.3 Filter接口中的三个方法&#xff1a;2.4 Filter过滤器登录校验2.5 过滤器链 3、Interceptor拦截器3.1 拦截器(Interceptor)的简单实现3.2…

SpringBoot的Bean类三种注入方式(附带LomBok注入)

SpringBoot的Bean类三种注入方式&#xff08;附带LomBok注入&#xff09; 在 Spring Boot 中&#xff0c;Bean 的注入方式主要包括构造函数注入&#xff08;Constructor Injection&#xff09;、字段注入&#xff08;Field Injection&#xff09;以及 Setter 方法注入&#xf…

Linux系统下常用资源查看

一、查看CPU使用率 top 命令 top命令可以看到总体的系统运行状态和cpu的使用率 。 %us&#xff1a;表示用户空间程序的cpu使用率&#xff08;没有通过nice调度&#xff09; %sy&#xff1a;表示系统空间的cpu使用率&#xff0c;主要是内核程序。 %ni&#xff1a;表示用户空间且…

Flutter提示错误:无效的源发行版17

错误描述 Flutter从3.10.1 升级到3.19.4&#xff0c;在3.10.1的时候一切运行正常&#xff0c;但是当我将Flutter版本升级到3.19.4后&#xff0c;出现了下方的错误 FAILURE: Build failed with an exception.* What went wrong: Execution failed for task :device_info_plus:…

java+ssm+mysql学生信息管理系统

项目介绍&#xff1a; 使用javassmmysql开发的学生信息管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、教师、学生角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff08;可以新增管理员&#xff09;&#xff1b;专业管理&…