c代码命名规范
芯片AES加密密钥生成工具
前言:
嵌入式单片机开发,为了防止别人将芯片内的代码读取出来通过反编译手段拿到源码,常用的手段是对芯片和烧录文件进行加密。大部分的芯片厂商都会提供一个加密烧录和配置文件的工具。这个工具一般需要你填写一定长度的密钥,如果密钥填写得太有规律比如:123456,或项目名+版本号等,这样的密钥对公司来说极度不安全,如果被对手知道别人很可能直接破解出你的源码,然后抄一下你的板就和你一模一样出货了,别人省去了开发成本何乐不为呢?所以本文介绍一种通过AES加密算法将明文转换为密文的工具制作。AES加密算法目前没有破解办法,据我所知微信小程序就用到了这种加密算法。
1 模块构成
制作这样的工具只需要三个模块即可完成,AES加密算法模块、芯片加密模块、GUI模块。本文使用Pathon3语言开发。
2 AES模块
AES加密是一种常见的对称加密算法,具有较高的安全性。之所以选择用Python3来做这个工具,就是因为其丰富的现成模块支持,没必要重复造轮子,Windows下我们直接导入pycryptodome模块。由于是对称加密其基本形式是明文+密钥=密文
,密文+密钥=明文
虽然AES算法不用我们实现,但是其原理和参数需要有一定的了解。实现一次AES运算需要输入密钥、明文、模式、偏移量、字符集类型、数据块、填充内容。输出即是密文。
2.1 输入参数:
- 密钥:因为是对称加密算法,所以加密和解密都需要使用这个密钥参与运算。
- 明文:需要被加密的字符串,建议限制用ASCII字符。
- 模式:AES有很多种加密模式,最常用的是ECB和CBC,如果是ECB模式则不需要设置偏移量,如果是CBC模式则需要设置偏移量。
- 偏移量:偏移量会被带入到加密运算过程中影响加密结果,具体看下算法理论部分就明白了。
- 字符集类型:输入输出都是文本,需要指明文本类型。
- 数据块:算法运算原理要求输入的明文和密钥需要是128、192、256Bits的整数倍,也即16、24、32字节的整数倍。
- 填充内容:上面提到了数据块要求明文和密钥是三种字节的整数倍,如果不是则需要填充一些字符使其成为整数倍这样才能进行AES算法的运算。所以这个参数即是定义填充的字符。
2.2 模块内函数:
- _init_(self, Key, Model, IV, Encode, DataBlockLen, SupplementChar) 构造函数,输入AES的参数。
- DataBlock(self, OriginalKey, DataBlockLen, SupplementChar) 对数据(指明文和密钥)进行块化,填充使其为16、24、32字节的整数倍。
- AESEncrypt(self, OriginalText) 加密函数,将明文转换为密文。
- AESDecrypt(self, DecryptedText) 解密函数,将密文转换为明文。我们的工具用于加密,所以这个函数实际没被调用,但我还是将其写出了。
1 | ''' |
HDSCCrypt模块
对特定芯片和固件进行加密时设定AES参数。
- 输入参数:
- 明文:需要被加密的字符串。
- 其他参数:其他参数就是上面提到的AES加密需要的参数。
- 模块内函数:
- init(self) 构造函数,输入AES加密相关的参数。
- HDSCEncrypt(self, Plaintext) 针对特定厂商芯片的加密函数,将明文转换为密文。
- CheckPlaintext(self, Plaintext) 对明问进行格式检查,当含有非ASCII字符或空白时抛出错误码。
1 | ''' |
CryptGUI模块
在Windows下构造GUI。这个GUI界面非常简洁,两个编辑框和两个按键,相应的有两个按键的回调函数。
1 | ''' |
最后是入口函数模块
模块封装好后调用就非常简单了。
1 | ''' |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 OnlyCalm's Blog!
评论
ValineGitalk