加解密演算法是保證資料安全的基礎技術,無論是在資料傳輸、儲存,還是使用者身份驗證中,都起著至關重要的作用.隨著網際網路的發展和資訊保安威脅的增加,瞭解並掌握常用的加解密演算法已經成為開發者和安全從業者的必修課.
常見的15種加密解密演算法分別是:
雜湊雜湊[MD5、SHA1、CRC32],對稱[DES,3DES(TDEA、TripleDES),AES,Blowfish,RC4、RC5,IDEA],Base64、Rabbit、Escape。
三種分類:
1.1 對稱加密
對稱加密是指加密和解密使用同一個金鑰的加密方法.由於加密和解密過程中的金鑰相同,因此需要在通訊雙方之間安全地共享金鑰.對稱加密的速度較快,適合用於大量資料的加密.
1.2 Hash演算法
這是一種不可逆的演算法,它常用於驗證資料的完整性。
1.3 非對稱加密
非對稱加密演算法採用一對金鑰:公鑰和私鑰.公鑰用於加密,私鑰用於解密.由於加密和解密使用不同的金鑰,非對稱加密演算法解決了金鑰分發的問題,是當前加密系統中安全性最高的加密技術之一.
本文章透過Air780的核心板燒錄LuatOS示例程式碼,來演示有關加解密的各種API的功能。
三、硬體準備
3.1 Air780E核心板
使用Air780E核心板,如下圖所示:
Air780E產品手冊中的《開發板Core_Air780E使用說明VX.X.X.pdf》,寫這篇文章時最新版本的使用說明為:《開發板Core_Air780E使用說明V1.0.5.pdf》;核心板使用過程中遇到任何問題,可以直接參考這份使用說明pdf文件。
3.2 SIM卡
中國大陸環境下,可以上網的sim卡,一般來說,使用移動,電信,聯通的物聯網路卡或者手機卡都行。
3.3 資料通訊線
帶TYPE-C口的USB資料線。
3.4 PC電腦
WINDOWS系統。
4.1 Luatools工具
要想燒錄LuatOS到4G模組中,需要用到合宙的強大的除錯工具:Luatools
詳細使用說明參考:
Luatools工具使用說明
https://docs.openluat.com/Luatools/
Luatools工具集具備以下幾大核心功能:
-
一鍵獲取最新韌體:自動連線合宙伺服器,輕鬆下載最新的合宙模組韌體.
-
韌體與指令碼燒錄:便捷地將韌體及指令碼檔案燒錄至目標模組中.
-
串列埠日誌管理:實時檢視模組透過串列埠輸出的日誌資訊,並支援儲存功能.
-
串列埠除錯助手:提供簡潔的串列埠除錯介面,滿足基本的串列埠通訊測試需求.
Luatools下載之後,新建一個命名為"Luatools"的資料夾,將下載的Luatools_v3.exe複製或移動到新建的Luatools資料夾內,點選Luatools_v3.exe即可執行。
4.2 準備需要燒錄的程式碼
首先要說明一點:指令碼程式碼,要和韌體的soc檔案一起燒錄。
4.2.1 燒錄的底層韌體檔案
底層core下載地址:
LuatOS韌體版本下載地址
https://docs.openluat.com/air780e/luatos/firmware/
Air780E的底層韌體在Luatools解壓後目錄的:
LuatOS-SoC_V1112_EC618_FULL.soc
4.2.2 燒錄的指令碼程式碼
首先要下載Air780的LuatOS示例程式碼到一個合適的專案目錄,示例程式碼網站:
https://gitee.com/openLuat/LuatOS-Air780E
下載流程參考下圖:
下載的檔案解壓,找到
LuatOS-Air780E-master\demo\crypto\main.lua,如圖:
5.1 crypto.md5(str)
計算md5值
引數
傳入值型別 | 解釋 |
string |
需要計算的字串 |
返回值
返回值型別 | 解釋 |
string |
計算得出的md5值的hex字串 |
例子
5.2 crypto.hmac_md5(str,key)
計算hmac_md5值
引數
傳入值型別 | 解釋 |
string |
需要計算的字串 |
string |
金鑰 |
返回值
返回值型別 | 解釋 |
string |
計算得出的hmac_md5值的hex字串 |
例子
5.3 crypto.sha1(str)
計算sha1值
引數
傳入值型別 | 解釋 |
string |
需要計算的字串 |
返回值
返回值型別 | 解釋 |
string |
計算得出的sha1值的hex字串 |
例子
5.4 crypto.hmac_sha1(str,key)
計算hmac_sha1值
引數
傳入值型別 | 解釋 |
string |
需要計算的字串 |
string |
金鑰 |
返回值
返回值型別 | 解釋 |
string |
計算得出的hmac_sha1值的hex字串 |
例子
5.5 crypto.sha256(str)
計算sha256值
引數
傳入值型別 | 解釋 |
string |
需要計算的字串 |
返回值
返回值型別 | 解釋 |
string |
計算得出的sha256值的hex字串 |
例子
5.6 crypto.hmac_sha256(str,key)
計算hmac_sha256值
引數
傳入值型別 | 解釋 |
string |
需要計算的字串 |
string |
金鑰 |
返回值
返回值型別 | 解釋 |
string |
計算得出的hmac_sha256值的hex字串 |
例子
5.7 crypto.sha512(str)
計算sha512值
引數
傳入值型別 | 解釋 |
string |
需要計算的字串 |
返回值
返回值型別 | 解釋 |
string |
計算得出的sha512值的hex字串 |
例子
5.8 crypto.hmac_sha512(str,key)
計算hmac_sha512值
引數
傳入值型別 | 解釋 |
string |
需要計算的字串 |
string |
金鑰 |
返回值
返回值型別 | 解釋 |
string |
計算得出的hmac_sha512值的hex字串 |
例子
5.9 crypto.base64_encode(data)
將資料進行base64編碼
引數
傳入值型別 | 解釋 |
string |
待編碼的資料 |
返回值
返回值型別 | 解釋 |
string |
編碼後的資料 |
例子
5.10 crypto.base64_decode(data)
將資料進行base64解碼
引數
傳入值型別 | 解釋 |
string |
待解碼的資料 |
返回值
返回值型別 | 解釋 |
string |
解碼後的資料 |
例子
5.11 crypto.cipher_list()
獲取當前韌體支援的cipher列表
引數
無
返回值
返回值型別 | 解釋 |
table |
本韌體支援的cipher列表,字串陣列 |
例子
5.12 crypto.cipher_suites()
獲取當前韌體支援的ciphersuites列表
引數
無
返回值
返回值型別 | 解釋 |
table |
本韌體支援的ciphersuites列表,字串陣列 |
例子
5.13 crypto.cipher_encrypt(type,padding,str,key,iv)
對稱加密
引數
傳入值型別 | 解釋 |
string |
演算法名稱,例如AES-128-ECB/AES-128-CBC, |
string |
對齊方式, |
string |
需要加密的資料 |
string |
金鑰,需要對應演算法的金鑰長度 |
string |
IV值,非ECB演算法需要 |
返回值
返回值型別 | 解釋 |
string |
加密後的字串 |
例子
5.14 crypto.cipher_decrypt(type,padding,str,key,iv)
對稱解密
引數
傳入值型別 | 解釋 |
string |
演算法名稱,例如AES-128-ECB/AES-128-CBC,可查閱crypto.cipher_list() |
string |
對齊方式,支援PKCS7/ZERO/ONE_AND_ZEROS/ZEROS_AND_LEN/NONE |
string |
需要解密的資料 |
string |
金鑰,需要對應演算法的金鑰長度 |
string |
IV值,非ECB演算法需要 |
返回值
返回值型別 | 解釋 |
string |
解密後的字串 |
例子
5.15 crypto.crc16
(method,data,poly,initial,finally,inReversemoutReverse)
計算CRC16
引數
傳入值型別 | 解釋 |
string |
CRC16模式(”IBM”,”MAXIM”,”USB”,”MODBUS”,”CCITT”,”CCITT-FALSE”,”X25”,”XMODEM”,”DNP”,”USER-DEFINED”) |
string |
字串 |
int |
poly值 |
int |
initial值 |
int |
finally值 |
int |
輸入反轉,1反轉,預設0不反轉 |
int |
輸入反轉,1反轉,預設0不反轉 |
返回值
返回值型別 | 解釋 |
int |
對應的CRC16值 |
例子
5.16 crypto.crc16_modbus(data,start)
直接計算modbus的crc16值
引數
傳入值型別 | 解釋 |
string |
資料 |
int |
初始化值,預設0xFFFF |
返回值
返回值型別 | 解釋 |
int |
對應的CRC16值 |
例子
5.17 crypto.crc32(data)
計算crc32值
引數
傳入值型別 | 解釋 |
string |
資料 |
返回值
返回值型別 | 解釋 |
int |
對應的CRC32值 |
例子
5.18 crypto.crc8(data,poly,start,revert)
計算crc8值
引數
傳入值型別 | 解釋 |
string |
資料 |
int |
crc多項式,可選,如果不寫,將忽略除了資料外所有引數 |
int |
crc初始值,可選,預設0 |
boolean |
是否需要逆序處理,預設否 |
返回值
返回值型別 | 解釋 |
int |
對應的CRC8值 |
例子
5.19 crypto.crc7(data,poly,start)
計算crc7值
引數
傳入值型別 | 解釋 |
string |
資料 |
int |
crc多項式,可選,預設0xE5 |
int |
crc初始值,可選,預設0x00 |
返回值
返回值型別 | 解釋 |
int |
對應的CRC7值 |
例子
5.20 crypto.checksum(data,mode)
計算checksum校驗和
引數
傳入值型別 | 解釋 |
string |
待計算的資料,必選 |
int |
模式,累加模式,0-異或,1-累加,預設為0 |
返回值
返回值型別 | 解釋 |
int |
checksum值,校驗和 |
例子
5.21 crypto.trng(len)
生成真隨機數
引數
傳入值型別 | 解釋 |
int |
資料長度 |
返回值
返回值型別 | 解釋 |
string |
指定隨機數字符串 |
例子
5.22 crypto.totp(secret,time)
計算TOTP動態密碼的結果
引數
傳入值型別 | 解釋 |
string |
網站提供的金鑰(就是BASE32編碼後的結果) |
int |
可選,時間戳,預設當前時間 |
返回值
返回值型別 | 解釋 |
int |
計算得出的六位數結果計算失敗返回nil |
例子
5.23 crypto.md_file(tp,path,hmac)
計算檔案的hash值(md5/sha1/sha256及hmac形式)
引數
傳入值型別 | 解釋 |
string |
hash型別,大小字母,例如“MD5”“SHA1”“SHA256” |
string |
檔案路徑,例如/luadb/logo.jpg |
string |
hmac值,可選 |
返回值
返回值型別 | 解釋 |
string |
HEX過的hash值,若失敗會無返回值 |
例子
5.24 crypto.md(tp,data,hmac)
計算資料的hash值(md5/sha1/sha256及hmac形式)
引數
傳入值型別 | 解釋 |
string |
hash型別,大小字母,例如“MD5”“SHA1”“SHA256” |
string |
待處理的資料 |
string |
hmac值,可選 |
返回值
返回值型別 | 解釋 |
string |
HEX過的hash值,若失敗會無返回值 |
例子
5.25 crypto.hash_init(tp)
建立流式hash用的stream
引數
傳入值型別 | 解釋 |
string |
hash型別,大寫字母,例如“MD5”“SHA1”“SHA256” |
string |
hmac值,可選 |
返回值
返回值型別 | 解釋 |
userdata |
成功返回一個資料結構,否則返回nil |
例子
5.26 crypto.hash_update(stream,data)
流式hash更新資料
引數
傳入值型別 | 解釋 |
userdata |
crypto.hash_init()建立的stream,必選 |
string |
待計算的資料,必選 |
return |
無 |
返回值
無
例子
5.27 crypto.hash_finish(stream)
獲取流式hash校驗值並釋放建立的stream
引數
傳入值型別 | 解釋 |
userdata |
crypto.hash_init()建立的stream,必選 |
返回值
返回值型別 | 解釋 |
string |
成功返回計算得出的流式hash值的hex字串,失敗無返回 |
例子
6.1 燒錄韌體
6.1.1 正確連線電腦和4G模組電路板
使用帶有資料通訊功能的資料線,不要使用僅有充電功能的資料線.
6.1.2 識別4G模組的boot引腳
在下載之前,要用模組的boot引腳觸發下載,也就是說,要把4G模組的boot引腳拉到1.8v,或者直接把boot引腳和VDD_EXT引腳相連.我們要在按下BOOT按鍵時讓模組開機,就可以進入下載模式了.
具體到Air780E開發板:
1、當我們模組沒開機時,按著BOOT鍵然後長按POW開機.
2、當我們模組開機時,按著BOOT鍵然後點按重啟鍵即可.
6.1.3 識別電腦的正確埠
判斷是否進入BOOT模式:模組上電,此時在電腦的裝置管理器中,檢視串列埠裝置,會出現一個埠表示進入了boot下載模式,如下圖所示:
6.1.4 用Luatools工具燒錄
-
新建專案
首先,確保你的Luatools的版本,大於等於3.0.6版本的.
在Luatools的左上角上有版本顯示的,如圖所示:
Luatools版本沒問題的話,就點選Luatools右上角的“專案管理測試”按鈕,如下圖所示:
這時會彈出專案管理和燒錄管理的對話方塊,可以新建一個專案,如下圖:
-
開始燒錄
選擇780E板子對應的底層core和剛改的main.lua指令碼檔案.下載到板子中.
點選下載後,我們需要進入boot模式才能正常下載.
如果沒進入boot模式會出現下圖情況:
進入boot模式下載,如圖:
6.2 例程
本庫有專屬demo,點此連結檢視crypto的demo例子
6.3 對應log
七、總結
透過本章內容的學習,你可以學習到有關加解密演算法的函式,例如:crypto.md5(str)、crypto.hmac_md5(str,key)、crypto.hmac_sha1(str,key)等等函式。