数据的加解密_cryptography

混合加密系统(最优组合)

 步骤:
 1. 使用  AES  加密代码文件
 2. 使用 RSA 公钥加密 AES 密钥
 3. 附加 HMAC-SHA3 验证密文完整性	 
HMAC是通过哈希函数和共享密钥确保数据一致性和真实性的加密技术。
    与基于数字签名和非对称算法的加密认证方法不同
	通信相关方来说,确保数据的一致性非常重要。HTTPS、FTPS、SFTP等传输协议会使用HMAC

功能

丰富的加密、解密、哈希、数字签名等功能
   Python标准库中的 hashlib 模块提供了多种工业标准的哈希算法,如MD5、SHA系列等。这些算法可用于数据完整性校验、消息摘要生成以及密码散列
      MD5(Message-Digest Algorithm 5)
	  SHA(Secure Hash Algorithm)家族是一组更为安全的哈希函数,
	  加盐(salt)加盐是在原始密码上附加一个随机字符串后再进行哈希运算,使得即使两个用户使用了相同的密码,经过加盐哈希后的结果也会不同
PKI(Public Key Infrastructure)即公钥基础设施

Python加解密

 PyCryptodome 和cryptography 都是Python 的加密库,但它们有不同的定位和侧重点。
     PyCryptodome 主要用于提供低级密码学原语,
     cryptography 库则更侧重于提供高级的、易于使用的接口来执行常见的加密操作
	    cryptography depends on the OpenSSL C library for all cryptographic operation
 
  – crypto   是与我们需求风马牛不相及的GPG加解密库,该库已于2016年停更,且python-gnupg库才是最主流的GPG加解密库。
  – PyCrypto 是Python『前』主流加解密库,但已停更。
  – PyCryptodome 是当前最主流的Python加解密库,如果遇到代码中有import Crypto等字样,就需要安装这个库

标准

 公钥加密标准(Public Key Cryptography Standards, PKCS)
    PrivateKeyTypes, PublicKeyTypes
	pem格式的私钥

 `backend`:可选参数,默认值为 `None`,这个参数用于指定加密库的后端实现。如果不提供后端参数,默认情况下将使用适当的后端
    通常可选择对称加密或非对称加密方案,具体实现方式取决于加密需求和密钥管理策略。
	default_backend  cryptographic.hazmat.backends.openssl.backend
	    backends.openssl (aead ciphers cmac dh dds  ec  ed448.rsa 
		OAEP PKCS1v15  PSS MGF1
		from cryptography.hazmat.primitives.asymmetric import padding
   签名(sign)

对称性加密

高级加密标准(Advanced Encryption Standard: AES 
   ECB 模式。 
   CBC 模式(密码分组链接:Cipher-block chaining) 因为 CBC 模式要求提供一个 IV  加密方式 IV(初始化向量)  
   CFB 模式(密文反馈:Cipher feedback)
AES-256-CBC 是一种对称加密算法,使用 256位密钥 和 CBC(Cipher Block Chaining)模式
  密钥长度(128、192、256位)、模式(如CBC、ECB)和填充方式
  填充方式: padding.PKCS7
  数据填充函数
  数据去填充函数
  
AES加密的数据块大小固定为128位(即16字节)。如果待加密数据的长度不是16字节的倍数,就需要进行填充  PKCS#7标准  
  例如AES的ECB,CBC,PCBC模式加密时,如果明文分块没有对齐,则需要填充,填充有很多种方式
 对称加密常用的是PKCS#5和PKCS#7 Padding;
而非对称的填充算法常用的是 PKCS#1_v1.5以及OAEP(PKCS#1_v2)  

非对称加密

原始的数据-加密的文件
 
 RSA算法也是一个块加密算法( block cipher algorithm),总是在一个固定长度的块上进行操作。
    但跟AES等不同的是,block length是跟key length有关的 
  OAEP填充方案(Optimal Asymmetric Encryption Padding)		
 RSA有如下三种填充方式:
    填充方式	输入	输出
    RSA_PKCS1_PADDING	必须比RSA秘钥短至少11个字节,也就是RSA_size(rsa) – 11	和秘钥一样长
    RSA_PKCS1_OAEP_PADDING	RSA_size(rsa) – 41	和秘钥一样长  最优非对称填充(OAEP)
    RSA_NO_PADDING	可以和RSA秘钥一样长,如果输入的明文过长,必须切割,然后填充	和秘钥一样长
 RSA_PKCS1_OAEP_PADDING 引入了类似HMAC消息验证码的算法(可见4.2小节),原理就是填充了一些与原文相关的哈希值,解密后可以进行验证
     RSA_PKCS1_OAEP_PADDING (or simply OAEP)


mgf=padding.MGF1(algorithm=hashes.SHA256()): 这是设置 OAEP 中的 MGF (Mask Generation Function),使用SHA-256哈希算法生成掩码。
algorithm=hashes.SHA256(): 这是设置 OAEP 中的哈希算法,使用SHA-256。
label=None: 这是设置 OAEP 的标签,通常设为 None。

  openSSL中OAEP填充方式默认哈希算法是 SHA1 openssl库没有直接提供接口能够选择sha256方式的填充

OpenSSL中的RSA_PKCS1_OAEP_PADDING。此模式需要设置两个摘要(md和mgf1_md)
  mgf	掩码生成算法,目前仅支持MGF1。
   md	摘要算法。

     SHA-256是一种基于Merkle-Damgard结构的散列函数,其输入为任意长度的消息,输出为256位的散列值
	 SHA-1 是SHA-2家族中的一员,是SHA-256的前身。它的输入和输出长度分别为512位和160位  SHA1
ECC(椭圆曲线加密)及其他非对称加密
DH(Diffie-Hellman)密钥交换协议

注意事项

 1.加密的文件是作为解密的统一,注意文件完整性检查,以及先简单的文件按,再复杂的文件的步骤进行处理
     二进制文件大小端--加密的方式(对称加密+模式)+填充的方式
 2.注意密钥的安全性

其他

 base64.b64encode函数是用来将二进制数据编码为Base64格式的字符串。
   Base64是一种用64个字符表示任意二进制数据的方法,常用于在不适合使用二进制数据的场合(如纯文本传输协议)中传输二进制数据	  
 PKCS7Padding 与 PKCS5Padding 与ZeroPadding填充规则	

哈希函数与消息摘要
    哈希函数则更像是指纹提取机,它将任意长度的数据压缩成固定长度的唯一标识,称为消息摘要或哈希值


ssl  sudo apt install openssh-server  sudo systemctl start sshd  sudo service ssh start
  SSL(Secure Sockets Layer)是一种用于保护网络通信安全的协议,它通过使用加密和认证的方式
   sudo systemctl status ssh
   sudo  vi /etc/ssh/sshd_config
    ssl genkey 
	ssl selfsign 
 ssh-keygen -t rsa -C"your_email@youremail.com" 
     ssh-keygen -t rsa 命令生成了一个密钥(私钥)和一个公钥
 
backend
   unsupported ssl backend 'openssl'. 
      supported ssl backends: gnutls

gnutls和openssl都是用于实现安全通信的握手协议库,提供了加密、解密、身份验证和安全通信的功能。 
    gnutls:gnutls是一个开源的TLS/SSL协议库,用于实现安全的通信。
       它提供了加密、解密、身份验证和安全通信的功能。gnutls支持多种加密算法和密钥交换协议,包括RSA、DSA、Diffie-Hellman、ECDH等。
	   gnutls-cli 是 gnutls 提供的命令行工具,用于测试和调试 SSL/TLS 服务器
    openssl:openssl是一个开源的加密工具包,提供了SSL/TLS协议的实现。
      它支持多种加密算法和密钥交换协议,包括RSA、DSA、Diffie-Hellman、ECDH等。openssl提供了一系列命令行工具和API  
	  生成证书请求:openssl req 
二一添作五——对半平分。
三下五除二	  
 RSA
    标准的密钥长度是1024位、2048位或4096位   
    
 AES加密算法 支持三种密钥长度:

‌ AES-128 ‌:128位(16字节)
‌ AES-192 ‌:192位(24字节)
‌ AES-256 ‌:256位(32字节)

 明文长度 = 实际明文长度+填充值		  

参考

https://cryptography.io/en/latest/
https://docs.python.org/3/library/struct.html
https://docs.openssl.org/master/man3/
【Python进阶】Python中的加密与解密:数据安全与加密技术 https://zhuanlan.zhihu.com/p/690976784
posted @ 2025-07-28 17:47  辰令  阅读(41)  评论(0)    收藏  举报