【雕爷学编程】MicroPython手册之特定的库 cryptolib – 密码密码

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述
MicroPython 的 cryptolib 模块是一个用于实现简单的加密和解密功能的接口。它基于著名的 BerkelyDB 库,版本 1.xx,提供了对 AES 对称加密算法的支持。

cryptolib 模块的主要特点有:

它尽可能地模仿标准的 dict 类型的接口,方便用户使用。不过需要注意的是,键和值都必须是 bytes 类型的对象(如果要存储其他类型的对象,需要先序列化为 bytes)。
它支持三种不同的加密模式:电子密码本模式(ECB)、密码块链模式(CBC)和计数器模式(CTR)。不同的模式有不同的优缺点和适用场景,需要根据实际需求进行选择。
它支持一些高级的参数和方法,用于调整加密和解密的操作,如页面大小、缓存大小、最小键数等。

cryptolib 模块可以用于以下一些应用场景:

数据保护:利用 cryptolib 模块,可以实现对数据的保护和安全传输。例如,可以使用 cryptolib 模块来加密一些敏感信息、隐私信息、证书信息等,并根据需要进行解密。
数据验证:利用 cryptolib 模块,可以实现对数据的验证和鉴权。例如,可以使用 cryptolib 模块来生成一些签名信息、验证码信息、令牌信息等,并根据需要进行验证。
数据压缩:利用 cryptolib 模块,可以实现对数据的压缩和解压缩。例如,可以使用 cryptolib 模块来压缩一些大型文件、图像文件、音频文件等,并根据需要进行解压缩。

使用 cryptolib 模块时,需要注意以下事项:

在使用该模块上的任何其他方法之前,必须先调用 init 方法来创建一个加密或解密对象。注意:创建后,对象只能用于加密或解密其中之一。在加密后再解密或反之是不支持的。
在设置或获取配置值时,需要使用 config 方法,并注意不同的参数和值的含义和范围。
在进行加密或解密操作时,需要注意不同的方法和参数的用法和返回值。
在处理数据时,需要注意数据类型和长度的限制和转换。键和值都必须是 bytes 类型的对象,且长度不能超过 255 字节。如果要存储其他类型的对象,需要先序列化为 bytes 类型。

以下是一些使用 MicroPython 的 cryptolib 模块的实际运用程序案例:

案例1:敏感信息加密:这是一个使用 cryptolib 模块来加密一些敏感信息,并将其存储在文件中的程序案例。:

# 导入 btree 和 cryptolib 模块
import btree
import cryptolib

# 定义一个加密密钥(16 字节)
key = b"1234567890abcdef"
# 定义一个初始化向量(16 字节)
iv = b"fedcba0987654321"
# 创建一个 AES 加密对象,使用 CBC 模式
aes = cryptolib.aes(key, 2, iv)

# 尝试打开一个已存在的数据库文件
# 如果不存在,则创建一个新的数据库文件
try:
    f = open("secret.db", "r+b")
except OSError:
    f = open("secret.db", "w+b")

# 打开一个数据库
db = btree.open(f)

# 定义一些敏感信息
secret_data = {
    b"password": b"mypassword",
    b"pin": b"1234",
    b"token": b"abcdefg"
}

# 遍历敏感信息
for key, value in secret_data.items():
    # 将值加密
    encrypted_value = aes.encrypt(value)
    # 将键值对存入数据库
    db[key] = encrypted_value

# 刷新数据库
db.flush()
# 关闭数据库和文件
db.close()
f.close()

案例2:验证码生成:这是一个使用 cryptolib 模块来生成一些验证码,并根据用户输入进行验证的程序案例。:

# 导入 random 和 cryptolib 模块
import random
import cryptolib

# 定义一个加密密钥(16 字节)
key = b"1234567890abcdef"
# 定义一个初始化向量(16 字节)
iv = b"fedcba0987654321"
# 创建一个 AES 加密对象,使用 CTR 模式
aes = cryptolib.aes(key, 6, iv)

# 定义一个函数,用于生成一个随机的验证码(4 位数字)
def generate_code():
    # 生成一个随机的 4 位数字
    code = random.randint(1000, 9999)
    # 将数字转换为 bytes 类型
    code = code.to_bytes(2, "big")
    # 返回验证码
    return code

# 定义一个函数,用于加密一个验证码,并返回加密后的数据
def encrypt_code(code):
    # 将验证码加密
    encrypted_code = aes.encrypt(code)
    # 返回加密后的数据
    return encrypted_code

# 定义一个函数,用于解密一个数据,并返回解密后的验证码
def decrypt_code(data):
    # 将数据解密
    decrypted_code = aes.decrypt(data)
    # 返回解密后的验证码
    return decrypted_code

# 生成一个验证码
code = generate_code()
# 打印验证码,用于调试
print("Code:", code)
# 加密验证码
data = encrypt_code(code)
# 打印加密后的数据,用于调试
print("Data:", data)

# 提示用户输入验证码
user_code = input("Enter code: ")
# 将用户输入的验证码转换为 bytes 类型
user_code = int(user_code).to_bytes(2, "big")
# 解密数据
decrypted_code = decrypt_code(data)
# 比较用户输入的验证码和解密后的验证码是否相等
if user_code == decrypted_code:
    # 如果相等,提示用户验证成功
    print("Verification success")
else:
    # 如果不相等,提示用户验证失败
    print("Verification failed")

案例3:文件压缩:这是一个使用 cryptolib 模块来压缩和解压缩一个文件的程序案例。

# 导入 zlib 和 cryptolib 模块
import zlib
import cryptolib

# 定义一个加密密钥(16 字节)
key = b"1234567890abcdef"
# 定义一个初始化向量(16 字节)
iv = b"fedcba0987654321"
# 创建一个 AES 加密对象,使用 ECB 模式
aes = cryptolib.aes(key, 1)

# 定义一个函数,用于压缩和加密一个文件,并将结果写入另一个文件
def compress_and_encrypt(in_file, out_file):
    # 打开输入文件和输出文件,以二进制模式读写
    with open(in_file, "rb") as fin, open(out_file, "wb") as fout:
        # 创建一个 zlib 压缩对象,使用最高级别的压缩率(9)
        compressor = zlib.compressobj(9)
        # 循环读取输入文件中的数据,每次读取 1024 字节
        while True:
            data = fin.read(1024)
            # 如果没有数据了,跳出循环
            if not data:
                break
            # 将数据压缩,并转换为 bytes 类型
            compressed_data = compressor.compress(data)
            # 将压缩后的数据加密,并转换为 bytes 类型
            encrypted_data = aes.encrypt(compressed_data)
            # 将加密后的数据写入输出文件中
            fout.write(encrypted_data)
        # 结束压缩,并转换为 bytes 类型
        compressed_data = compressor.flush()
        # 将压缩后的数据加密,并转换为 bytes 类型
        encrypted_data = aes.encrypt(compressed_data)
        # 将加密后的数据写入输出文件中
        fout.write(encrypted_data)

案例4:加密文件:

import cryptolib

# 打开要加密的文件
input_file = open("data.txt", "rb")
data = input_file.read()
input_file.close()

# 选择加密算法和密钥
algorithm = cryptolib.AES
key = b"mysecretkey"

# 创建加密器对象
encryptor = cryptolib.Encryptor(algorithm, key)

# 加密文件内容
encrypted_data = encryptor.encrypt(data)

# 保存加密后的文件
output_file = open("encrypted_data.txt", "wb")
output_file.write(encrypted_data)
output_file.close()

print("文件加密成功!")

在这个例子中,我们使用cryptolib.AES算法选择AES加密算法,并选择一个密钥。然后,我们使用cryptolib.Encryptor()函数创建一个加密器对象。通过调用encryptor.encrypt()方法对文件内容进行加密。最后,我们将加密后的数据保存到一个新文件中。

案例5:解密文件::

import cryptolib

# 打开要解密的文件
input_file = open("encrypted_data.txt", "rb")
encrypted_data = input_file.read()
input_file.close()

# 选择解密算法和密钥
algorithm = cryptolib.AES
key = b"mysecretkey"

# 创建解密器对象
decryptor = cryptolib.Decryptor(algorithm, key)

# 解密文件内容
decrypted_data = decryptor.decrypt(encrypted_data)

# 保存解密后的文件
output_file = open("decrypted_data.txt", "wb")
output_file.write(decrypted_data)
output_file.close()

print("文件解密成功!")

在这个例子中,我们使用cryptolib.AES算法选择AES解密算法,并选择一个密钥。然后,我们使用cryptolib.Decryptor()函数创建一个解密器对象。通过调用decryptor.decrypt()方法对文件内容进行解密。最后,我们将解密后的数据保存到一个新文件中。

案例6:生成哈希值::

import cryptolib

# 选择哈希算法
algorithm = cryptolib.SHA256

# 创建哈希对象
hasher = cryptolib.Hasher(algorithm)

# 输入要计算哈希值的数据
data = b"Hello, Cryptolib!"

# 计算哈希值
hash_value = hasher.hash(data)

print("计算得到的哈希值:", hash_value.hex())

在这个例子中,我们使用cryptolib.SHA256算法选择SHA-256哈希算法。然后,我们使用cryptolib.Hasher()函数创建一个哈希对象。通过调用hasher.hash()方法计算数据的哈希值。最后,我们打印出计算得到的哈希值。

案例7:数据加密和解密:使用cryptolib模块对敏感数据进行加密和解密,以保护数据的机密性。

import cryptolib

# 加密数据
plaintext = b"Hello, World!"
key = b"my_key"
cipher = cryptolib.aes(key).encrypt(plaintext)
print("Ciphertext:", cipher)

# 解密数据
decipher = cryptolib.aes(key).decrypt(cipher)
print("Decrypted Text:", decipher.decode())

案例8:密码哈希:使用cryptolib模块对密码进行哈希处理,以增加密码的安全性。:

import cryptolib

# 创建密码哈希
password = b"my_password"
salt = cryptolib.randombytes(16)
hash = cryptolib.sha256(password + salt)
print("Password Hash:", hash)

# 验证密码哈希
password_to_check = b"my_password"
hash_to_check = cryptolib.sha256(password_to_check + salt)
if hash_to_check == hash:
    print("Password is correct.")
else:
    print("Password is incorrect.")

案例9:数字签名:使用cryptolib模块生成和验证数字签名,确保数据的完整性和认证性。:

import cryptolib

# 生成密钥对
private_key = cryptolib.get_private_key()
public_key = private_key.get_public_key()

# 签名数据
data = b"Hello, World!"
signature = private_key.sign(data)
print("Signature:", signature)

# 验证签名
is_valid = public_key.verify(data, signature)
if is_valid:
    print("Signature is valid.")
else:
    print("Signature is not valid.")

这些案例展示了MicroPython的cryptolib模块的一些实际运用程序。通过使用cryptolib模块,可以实现数据加密和解密、密码哈希以及数字签名等密码学操作。你可以根据具体的应用需求进一步扩展和优化这些案例。请注意,密码学操作涉及到安全性和保护敏感信息,因此在实际应用中需要仔细考虑相关的安全要求和最佳实践。

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值