设为首页 加入收藏

TOP

Python加密库 Crypto.Cipher包中 ChaCha20 介绍(一)
2023-07-23 13:45:32 】 浏览:63
Tags:Python 加密库 Crypto.Cipher 包中 ChaCha20 介绍

该软件包包含用于保护机密性的算法 的数据。Crypto.Cipher

有三种类型的加密算法:

  1. 对称密码:所有各方都使用相同的密钥 解密和加密数据。 对称密码通常非常快,可以处理 非常大量的数据。
  2. 非对称密码:发送方和接收方使用不同的密钥。 发送方使用公钥(非机密)加密,而接收方 使用私钥(机密)解密。 非对称密码通常非常慢,可以处理 只有非常小的有效载荷。示例:PKCS#1 OAEP (RSA)。
  3. 混合密码:上述两种类型的密码可以组合使用 在继承两者优点的结构中。 非对称密码用于保护短期 对称键, 和对称密码(在该密钥下)加密 实际消息。

对称密码

有两种类型的对称密码:

  • 流密码:最自然的密码类型: 它们一次加密一个字节的数据。 参见ChaCha20和XChaCha20和Salsa20

  • 分组密码:只能以固定数量操作的密码 的数据。最重要的分组密码是AES,它具有 块大小为 128 位(16 字节)。

    通常,分组密码通常仅与 一种操作模式,允许加密 可变数量的数据。某些模式(如点击率)可以有效地转动 将分组密码转换为流密码。

广泛的共识是,密码提供 只有机密性,没有任何形式的身份验证,是不可取的。 相反,基元已被定义为集成对称加密和 身份验证 (MAC)。例如:

ChaCha20 和 XChaCha20

ChaCha20是由Daniel J. Bernstein设计的流密码。 密钥长度为 256 位(32 字节)。 密码需要随机数,不得重复使用 跨使用同一密钥执行的加密。

有三种变体,由随机数的长度定义:

随机数长度 描述 最大数据 如果随机随机数和相同的键
8 字节(默认) 由伯恩斯坦设计的原始ChaCha20。 无限制 最多 200 000 条消息
12 字节 RFC7539 中定义的 TLS ChaCha20。 256 千兆字节 最多 130 亿条消息
24 字节 XChaCha20,仍处于草稿阶段 256 千兆字节 无限制
这是ChaCha20(Bernstein的版本)如何加密数据的一个例子:

import json
from base64 import b64encode
from Crypto.Cipher import ChaCha20
from Crypto.Random import get_random_bytes

plaintext = b'Attack at dawn'
key = get_random_bytes(32)
cipher = ChaCha20.new(key=key)
ciphertext = cipher.encrypt(plaintext)

nonce = b64encode(cipher.nonce).decode('utf-8')
ct = b64encode(ciphertext).decode('utf-8')
result = json.dumps({'nonce':nonce, 'ciphertext':ct})
print(result)
{"nonce": "IZScZh28fDo=", "ciphertext": "ZatgU1f30WDHriaN8ts="}
这就是您解密它的方式:

import json
from base64 import b64decode
from Crypto.Cipher import ChaCha20

# We assume that the key was somehow securely shared
try:
    b64 = json.loads(json_input)
    nonce = b64decode(b64['nonce'])
    ciphertext = b64decode(b64['ciphertext'])
    cipher = ChaCha20.new(key=key, nonce=nonce)
    plaintext = cipher.decrypt(ciphertext)
   print("The message was " + plaintext)
except (ValueError, KeyError):
    print("Incorrect decryption")
为了拥有符合 RFC7539 标准的 ChaCha20 密码, 您需要显式生成 96 位(12 字节)参数并将其传递给:noncenew()

nonce_rfc7539 = get_random_bytes(12)
cipher = ChaCha20.new(key=key, nonce=nonce_rfc7539)

 

警告

ChaCha20不保证您解密的数据的真实性! 换句话说,攻击者可能会操纵传输中的数据。 为了防止这种情况,您还必须使用消息身份验证 用于验证密文的代码(如 HMAC) (加密然后 Mac)。或者,您可以使用ChaCha20_Poly1305

.class Crypto.Cipher.ChaCha20. ChaCha20Cipher (随机数)

ChaCha20(或XChaCha20)密码对象。 不要直接创建它。请改用 new()。

变量: 随机数 (字节)– 长度为 8、12 或 24 字节的随机数
decrypt (密文输出=无)

解密一段数据。

参数: 密文 (字节/字节数组/内存视图)– 要解密的数据,任何大小。
关键字参数:
  输出 (字节/字节数组/内存视图)– 明文的位置 被写到。如果为 ,则返回明文。None
返回: 如果是,则明文返回为 。 否则。outputNonebytesNone
encrypt (纯文本输出 = 无)

加密一段数据。

参数: 明文 (字节/字节数组/内存视图)– 要加密的数据,任何大小。
关键字参数:
  输出 (字节/字节数组/内存视图)– 密文的位置 被写到。如果为 ,则返回密文。None
返回: 如果是,则密文返回为 。 否则。outputNonebytesNone
seek (位置)

查找密钥流中的某个位置。

参数: 位置 (整数)– 密钥流中的绝对位置,以字节为单位。
Crypto.Cipher.ChaCha20. new (**夸格斯)

创建新的 ChaCha20 或 XChaCha20 密码

关键字参数:
 
  • key (bytes/bytearray/memoryview) – 要使用的密钥。 它必须为 32 字节长。
  • nonce(bytes/bytearray/memoryview) –

    强制值 不得重用于任何其他加密 使用此密钥完成。

    对于 ChaCha20,它必须为 8 或 12 个字节。

    对于 XChaCha20,它必须为 24 字节长。

    如果未提供,将随机生成 8 个字节 (

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python的基本认识 下一篇Python从零到壹丨详解图像平滑的..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目