
什么是 CanMV K230?
CanMV K230是一款高性价比的RISC-V边缘AI平台,凭借低功耗、强视觉处理能力和开放的开发生态,成为嵌入式AI开发的理想选择,尤其适合需要快速部署视觉与AI功能的创客、中小企业及教育场景。CanMV 是一套 AI 视觉开发平台,K230 是其核心芯片。该模块结合了图像采集、AI推理、边缘计算等能力,适合嵌入式视觉应用开发。
CanMV:类似 OpenMV 的图像处理框架,支持 Python 编程,简化视觉识别开发流程。
K230 芯片:嘉楠科技推出的 AIoT SoC,采用 RISC-V 架构,内置第三代 KPU(AI加速单元),算力高达 6 TOPS,性能是 K210 的 13.7 倍。


知识点
AES 是目前全球公认的最安全、应用最广泛的对称加密算法,全称为高级加密标准(Advanced Encryption Standard)。
它的核心是使用同一把密钥对数据进行加密和解密,加密和解密过程可逆,且密钥的安全性直接决定了数据的安全性。
AES 的核心特性
对称密钥:加密和解密使用完全相同的密钥,这意味着发送方和接收方必须提前安全地共享密钥。
固定分组长度:无论输入数据多长,都会将其分成固定大小的 “分组”(128 位)进行加密处理。
密钥长度可选:支持 128 位、192 位、256 位三种密钥长度,其中 AES-256 安全性最高,是金融、政府等领域的常用标准。
安全性高:自 2001 年被美国国家标准与技术研究院(NIST)确定为标准以来,至今未被发现有效的破解方法,能抵御绝大多数已知的攻击。
AES 的工作模式
ECB (Electronic Codebook):最简单的模式,直接对每个数据块独立加密
CBC (Cipher Block Chaining):每个明文块先与前一个密文块进行异或,再加密
CTR (Counter):利用计数器生成密钥流,与明文进行异或
GCM (Galois/Counter Mode):结合 CTR 模式并提供认证功能
AES 的主要应用场景
数据存储加密:手机、电脑硬盘的加密(如苹果的 FileVault)、数据库敏感字段加密(如用户身份证号、银行卡号)。
通信加密:HTTPS 协议、VPN 连接、即时通讯软件(如微信、Signal)的消息传输加密,保障数据在网络中传输时不被窃取。
设备与服务加密:智能家居设备的指令传输、云服务的数据加密存储,防止数据被未授权访问。




【花雕动手做】CanMV K230 AI视觉识别模块之使用AES加密
项目测试实验代码
#【花雕动手做】CanMV K230 AI视觉识别模块之使用AES加密
# 导入加密模块 ucryptolib
# (Import the ucryptolib encryption module)
import ucryptolib
def test_aes():
# 打印测试 AES 加密/解密的信息
# (Print information about testing AES encryption/decryption)
print("Testing AES encryption/decryption...")
# 定义 AES-128 ECB 模式的测试
# (Define the test for AES-128 ECB mode)
key = b'1234567890abcdef' # 16 字节的密钥
# (16-byte key)
plaintext = b'This is 16 bytes' # 16 字节的明文
# (16-byte plaintext)
print("\nTest 1: AES-128 ECB")
# 创建 AES-128 ECB 模式的加密实例
# (Create an AES-128 ECB mode encryption instance)
cipher = ucryptolib.aes(key, ucryptolib.MODE_ECB)
encrypted = cipher.encrypt(plaintext)
# 创建新的 AES-128 ECB 模式的解密实例
# (Create a new AES-128 ECB mode decryption instance)
cipher = ucryptolib.aes(key, ucryptolib.MODE_ECB)
decrypted = cipher.decrypt(encrypted)
# 断言解密后的明文与原始明文相同
# (Assert that the decrypted plaintext is the same as the original plaintext)
assert decrypted == plaintext, "AES-128 ECB failed"
print("Passed")
# 测试密钥长度不合法的情况
# (Test the case of an invalid key length)
print("\nTest 2: Invalid key length")
try:
# 尝试使用短密钥创建 AES 实例,应该引发 ValueError 异常
# (Try to create an AES instance with a short key, which should raise a ValueError)
ucryptolib.aes(b'short_key', ucryptolib.MODE_ECB)
assert False, "Invalid key not detected"
except ValueError:
print("Passed")
# 测试数据长度不对齐的情况
# (Test the case of unaligned data length)
print("\nTest 3: Unaligned data length")
cipher = ucryptolib.aes(key, ucryptolib.MODE_ECB)
try:
# 尝试加密长度不是 16 字节的数据,应该引发 ValueError 异常
# (Try to encrypt data with a length that is not 16 bytes, which should raise a ValueError)
cipher.encrypt(b'short')
assert False, "Unaligned data not detected"
except ValueError:
print("Passed")
# 打印所有 AES 测试都通过的信息
# (Print the information that all AES tests passed successfully)
print("\nAll AES tests passed successfully!")
# 执行 AES 测试函数
# (Execute the AES test function)
test_aes()AES加密核心概念
AES密钥长度:
• AES-128:16字节密钥(如代码中使用)
• AES-192:24字节密钥
• AES-256:32字节密钥
ECB模式特点:
• 电子密码本模式:最简单的加密模式
• 相同明文产生相同密文
• 不需要初始化向量(IV)
• 数据必须按块对齐(AES为16字节)
代码解析
这里来分析示例代码,代码使用了 MicroPython 中的 ucryptolib 模块演示 AES 加密:
1. 导入模块
import ucryptolib
这里导入了 MicroPython 中的加密库 ucryptolib,它是专为资源受限设备设计的轻量级加密库。
2. AES-128 ECB 模式测试
key = b'1234567890abcdef' # 16 字节的密钥
plaintext = b'This is 16 bytes' # 16 字节的明文
这里定义了:
• 密钥 (key):长度为 16 字节,对应 AES-128
• 明文 (plaintext):要加密的数据,正好是 16 字节
cipher = ucryptolib.aes(key, ucryptolib.MODE_ECB)
encrypted = cipher.encrypt(plaintext)
这两行代码:
1. 创建一个 AES 加密器对象,使用 ECB 模式
2. 对明文进行加密,得到密文
cipher = ucryptolib.aes(key, ucryptolib.MODE_ECB)
decrypted = cipher.decrypt(encrypted)
这两行代码:
1. 创建一个新的 AES 对象(用于解密)
2. 对密文进行解密,得到解密后的数据
assert decrypted == plaintext, "AES-128 ECB failed"
这行代码验证解密后的数据与原始明文是否相同,如果不同则报错。
3. 无效密钥长度测试
try:
ucryptolib.aes(b'short_key', ucryptolib.MODE_ECB) assert False, "Invalid key not detected"except ValueError: print("Passed")
这段代码测试了使用不正确长度密钥的情况。AES 要求密钥长度必须是 16、24 或 32 字节,这里使用了一个较短的密钥,预期会抛出 ValueError 异常。
4. 数据长度不对齐测试
cipher = ucryptolib.aes(key, ucryptolib.MODE_ECB)
try: cipher.encrypt(b'short') assert False, "Unaligned data not detected"except ValueError: print("Passed")
这段代码测试了数据长度不是 16 字节倍数的情况。在 ECB 模式下,数据长度必须是 16 字节的倍数,这里使用了一个只有 5 字节的数据,预期会抛出 ValueError 异常。
AES 的重要概念解释
1. 密钥长度
• AES-128:使用 16 字节(128 位)密钥
• AES-192:使用 24 字节(192 位)密钥
• AES-256:使用 32 字节(256 位)密钥
密钥越长,安全性越高,但性能可能略有下降。
2. ECB 模式的局限性
示例代码使用了 ECB 模式,这是最简单但也是最不安全的 AES 模式:
• 相同的明文块会产生相同的密文块
• 不能隐藏数据模式,可能泄露信息
• 没有使用初始化向量 (IV)
对于实际应用,推荐使用 CBC、CTR 或 GCM 等更安全的模式。
3. 填充问题
AES 要求数据长度是 16 字节的倍数。当数据长度不满足要求时,需要进行填充:
• PKCS#7 填充:用缺少的字节数填充(最常用)
• 零填充:用 0 填充
• ANSI X.923:最后一个字节表示填充的字节数,其余填充 0
示例代码没有处理填充,而是直接使用了长度刚好是 16 字节的数据。
实验串口返回情况

实验场景图


返回首页
回到顶部

评论