色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

極簡加解密庫--使數據傳輸更加安全

Rice嵌入式開發技術分享 ? 來源:Rice 嵌入式開發技術分享 ? 作者:Rice 嵌入式開發技 ? 2023-02-22 16:31 ? 次閱讀

概述

  • 互聯網時代,安全成為了一個沉重的話題。文件傳輸、電子郵件等的安全性尤為重要。我們為了保證安全性,必須對其內容加密,
  • 加密的作用就是防止有用或私有化信息在傳輸鏈路上被攔截和竊取。提高數據傳輸的可靠性。
  • 嵌入式開發中,我們會涉及到數據的傳輸,文件的傳輸。很多人都沒有考慮其數據的安全性問題,往往都是明文的方式傳輸,最多增加CRC進行數據的完整性校驗。這明顯沒有考慮數據的安全性問題。
  • 最近項目遇到安全性問題,所以也開始折磨一下加密相關知識,發現RT-THREAD有個比較好軟件包--tinycrypt(一個簡小并且可配置的加解密軟件包,包含算法:aes,base64,md5,sha1,sha2)。其中:AES剛好符合我的項目需求。

AES加密算法

AES加密標準又稱為高級加密標準Rijndael加密法,是美國國家標準技術研究所NIST旨在取代DES的21世紀的加密標準。AES的基本要求是,采用對稱分組密碼體制,密鑰長度可以為128、192或256位,分組長度128位。AES算法是最為常見的額對稱加密算法之一。

AES加密流程說明:

AES的加解密流程圖如下:ca511a26-b13a-11ed-a826-dac502259ad0.png

加解密流程圖部件說明:

  • 明文P:沒有經過加密的數據或文件。
  • 密鑰K:用來加密明文P的密鑰,在對稱加密算法中,加密與解密的密鑰是相同的。密鑰為接收方與發送方協商產生,但不可以直接在網絡上傳輸,否則會導致密鑰泄漏,通常是通過非對稱加密算法加密密鑰,然后再通過網絡傳輸給對方,或者直接面對面商量密鑰。密鑰是絕對不可以泄漏的,否則會被攻擊者還原密文,竊取機密數據。
  • AES加密函數:設AES加密函數為E,則 C = E(K + P),其中P為明文,K為密鑰,C為密文。也就是說,把明文P和密鑰K作為加密函數的參數輸入,則加密函數E會輸出密文C。
  • 密文C:通過密鑰對明文進行加密處理后的數據或文件。
  • AES解密函數:設AES解密函數為D,則 P = D(K + C),其中C為密文,K為密鑰,P為明文。也就是說,把密文C和密鑰K作為解密函數的參數輸入,則解密函數會輸出明文P。

AES加密方法:

  1. AES為分組加密,分組加密也就是把明文分成一組一組的,每組的長度相等,每次加密一組數據,直到加密完整個明文。
AES 密鑰長度(32bit) 分組長度(32bit) 加密輪數
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14
  1. 在AES標準規范中,分組長度只能是128位,也就是說,每個分組為16個字節,每個字節8位,密鑰的長度可以使用128位、192位或者258位。密鑰的長度不同,推薦加密輪數也不同,比如AES-128也就是密鑰的長度為128位,加密輪數為10輪,AES-192為12輪,AES-256為14輪。以AES-128為例,加密中一輪的4個操作:
  • 字節代換:AES的字符代換其實就是一個簡單的查表操作,AES定義了一個S盒和一個逆S盒。
  • 行位移:就是一個簡單的左循環移位操作。
  • 列混合:是通過矩陣相乘來實現的,經過移位后的狀態矩陣與固定的矩陣相乘,得到混淆后的狀態矩陣。
  • 輪密鑰加:是將128位輪密鑰Ki同狀態矩陣中的數據進行逐位異或操作。
ca623e64-b13a-11ed-a826-dac502259ad0.png
  1. 加密:加密第1輪到第9輪的輪函數一樣,最后一輪迭代不執行列混合,另外,在第一輪迭代之前,先將明文和原始密鑰進行一次異或加密操作。
  2. 解密:解密過程仍為10輪,每一輪的操作是加密操作的逆操作。由于AES的4個輪操作都是可逆的,因此,解密操作的一輪就是順序執行逆行移位、逆字節代換、輪密鑰加和逆列混合。同加密操作類似,最后一輪不執行逆列混合,在第1輪解密之前,要執行1次密鑰加操作。

tinycrypt的AES使用

  1. tinycrypt這個軟件包精簡使用起來很方便,其包含了源碼和測試用例(AES和MD5),tinycrypt軟件包的目錄結構如下:
.
├──include
│├──tiny_aes.h//aes頭文件
│├──tiny_base64.h//base64頭文件
│├──tinycrypt_config.h//tinycrypt配置頭文件
│├──tinycrypt.h//tinycrypt頭文件
│├──tiny_md5.h//md5頭文件
│├──tiny_sha1.h//sha1頭文件
│└──tiny_sha2.h//sha2頭文件
├──LICENSE
├──README.md
├──samples
│├──aes_sample.c//aes測試用例頭文件
│└──md5_sample.c//md5測試用例頭文件
└──src
├──tiny_aes.c//aes源文件
├──tiny_base64.c//base64源文件
├──tiny_md5.c//md5頭文件
├──tiny_sha1.c//sha1頭文件
└──tiny_sha2.c//sha2頭文件
  1. 在Ubuntu環境下,搭建tinycrypt的環境,測試加解密文件,目錄結構如下:
.
├──main.c
├──makefile
└──tinycrypt
├──include
│├──tiny_aes.h
│├──tiny_base64.h
│├──tinycrypt_config.h
│├──tinycrypt.h
│├──tiny_md5.h
│├──tiny_sha1.h
│└──tiny_sha2.h
├──LICENSE
├──README.md
├──samples
│├──aes_sample.c
│└──md5_sample.c
└──src
├──tiny_aes.c
├──tiny_base64.c
├──tiny_md5.c
├──tiny_sha1.c
└──tiny_sha2.c
  • 在目錄中增加makefile文件和main.c,其中makefile用于構建工程,main.c用于編寫我們的測試代碼,其中:

  • makefile文件內容:

VERSION=1.0.0#版本號

SOURCE=main.c#源文件
SOURCE+=$(wildcard./tinycrypt/src/*.c)#通過wildcard函數獲取tinycrypt源文件
OBJECT=$(patsubst%.c,%.o,$(SOURCE))#通過patsubst函數替換源文件為目標文件

INCLUDE=-I./tinycrypt/include#包含頭文件路徑

TARGET=tinycrypt#目標文件名字
CC=gcc#工具鏈
CFLAGS=-Wall-g#編譯選項

OUTPUT=output#輸出目錄

$(TARGET):$(OBJECT)#構建執行命令
@mkdir-p$(OUTPUT)#創建輸出目錄
$(CC)$^$(CFLAGS)-o$(OUTPUT)/$(TARGET)_$(VERSION)#編譯

%.o:%.c#將源文件編譯成目標文件
$(CC)$(INCLUDE)$(CFLAGS)-c$
  • main.c文件內容,測試歷程說明:將一個文件(index.js)通過AES加密,然后生成加密文件(encrypt_index.js),再將加密文件(encrypt_index.js)通過AES解密,生成解密文件(decrypt_index.js)。
#include
#include
#include
#include

#include
#include

#include
#include

#include"tiny_aes.h"

#defineENCRYPT_TEST_FILE"./index.js"
#defineENCRYPT_TEST_ENCRYPT_FILE"./encrypt_index.js"
#defineENCRYPT_TEST_DECRYPT_FILE"./decrypt_index.js"

#defineENCRYPT_SINGLE_SIZE1024//加密單包長度

#defineENCRYPT_AES_IV_LEN16//AES向量長度
#defineENCRYPT_AES_KEY_LEN256//AES密鑰長度
#defineENCRYPT_AES_IV"0123456789ABCDEF"//AES向量
#defineENCRYPT_AES_KEY"0123456789ABCDEF0123456789ABCDEF"//AES密鑰
//AES參數結構體定義
typedefstruct
{
uint8_taesIv[ENCRYPT_AES_IV_LEN];
uint8_taesKey[ENCRYPT_AES_KEY_LEN];
tiny_aes_contextaes_ctx;
}EncryptInfo;

staticEncryptInfog_info={0};
//aes參數初始化
voidaes_init(constchar*iv,constchar*key)
{
memset(g_info.aesIv,0,ENCRYPT_AES_IV_LEN);
memset(g_info.aesKey,0,ENCRYPT_AES_KEY_LEN);
if(iv==NULL){
memcpy(g_info.aesIv,ENCRYPT_AES_IV,strlen(ENCRYPT_AES_IV));
}
else{
memcpy(g_info.aesIv,iv,strlen(iv));
}
if(key==NULL){
memcpy(g_info.aesKey,ENCRYPT_AES_KEY,strlen(ENCRYPT_AES_KEY));
}
else{
memcpy(g_info.aesKey,key,strlen(key));
}
}
//aes加密函數的封裝
voidaes_encrypt(uint8_t*dest_buff,constuint8_t*src_buff,uint32_tlen)
{
tiny_aes_crypt_cbc(&g_info.aes_ctx,AES_ENCRYPT,len,g_info.aesIv,(uint8_t*)src_buff,dest_buff);
}
//aes解密函數的封裝
voidaes_decrypt(uint8_t*dest_buff,constuint8_t*src_buff,uint32_tlen)
{
tiny_aes_crypt_cbc(&g_info.aes_ctx,AES_DECRYPT,len,g_info.aesIv,(uint8_t*)src_buff,dest_buff);
}

intmain(intargc,char*argv[])
{
intraw_size=0;
intsrc_fd=-1;
intencrypt_fd=-1;
intdecrypt_fd=-1;
intsrc_file_size=0;
intsrv_file_offset=0;
uint8_tsrc_buff[ENCRYPT_SINGLE_SIZE];
uint8_tencrypt_buff[ENCRYPT_SINGLE_SIZE];
uint8_tdecrypt_buff[ENCRYPT_SINGLE_SIZE];

//加密文件,將明文文件(index.js)通過AES加密為加密文件(encrypt_index.js)
{
aes_init(NULL,NULL);//aes初始化
tiny_aes_setkey_enc(&g_info.aes_ctx,(uint8_t*)g_info.aesKey,ENCRYPT_AES_KEY_LEN);//設置密鑰
src_fd=open(ENCRYPT_TEST_FILE,O_RDONLY,0777);//打開明文文件
if(src_fd==-1){
printf("%d-ERR:openfile(%s)failedrn",__LINE__,ENCRYPT_TEST_FILE);
return-1;
}

encrypt_fd=open(ENCRYPT_TEST_ENCRYPT_FILE,O_RDWR|O_CREAT|O_TRUNC,0777);//打開加密文件
if(encrypt_fd==-1){
printf("%d-ERR:openfile(%s)failedrn",__LINE__,ENCRYPT_TEST_ENCRYPT_FILE);
return-1;
}

raw_size=lseek(src_fd,0,SEEK_END);//獲取明文文件的大小
srv_file_offset=0;
lseek(src_fd,0,SEEK_SET);
printf("%d-INFO:sourcefilesize:%drn",__LINE__,raw_size);

while(srv_file_offsetmemset(src_buff,0,ENCRYPT_SINGLE_SIZE);
memset(encrypt_buff,0,ENCRYPT_SINGLE_SIZE);
read(src_fd,src_buff,ENCRYPT_SINGLE_SIZE);//讀取明文文件內容
aes_encrypt(encrypt_buff,src_buff,ENCRYPT_SINGLE_SIZE);//明文文件內容加密
write(encrypt_fd,encrypt_buff,ENCRYPT_SINGLE_SIZE);//將加密內容寫入加密文件中
srv_file_offset+=ENCRYPT_SINGLE_SIZE;
}
close(src_fd);
src_fd=-1;
close(encrypt_fd);
encrypt_fd=-1;
}

//解密文件,將加密文件(encrypt_index.js)通過AES解密為解密文件(decrypt_index.js)
{
aes_init(NULL,NULL);//aes初始化
tiny_aes_setkey_dec(&g_info.aes_ctx,(uint8_t*)g_info.aesKey,ENCRYPT_AES_KEY_LEN);//設置密鑰
src_fd=open(ENCRYPT_TEST_ENCRYPT_FILE,O_RDONLY,0777);//打開密文文件
if(src_fd==-1){
printf("%d-ERR:openfile(%s)failedrn",__LINE__,ENCRYPT_TEST_ENCRYPT_FILE);
return-1;
}

decrypt_fd=open(ENCRYPT_TEST_DECRYPT_FILE,O_RDWR|O_CREAT|O_TRUNC,0777);//打開解密文件
if(decrypt_fd==-1){
printf("%d-ERR:openfile(%s)failedrn",__LINE__,ENCRYPT_TEST_DECRYPT_FILE);
return-1;
}

src_file_size=raw_size;//設置明文文件的大小
srv_file_offset=0;
lseek(src_fd,0,SEEK_SET);
printf("%d-INFO:encryptfilesize:%drn",__LINE__,src_file_size);

while(srv_file_offsetmemset(src_buff,0,ENCRYPT_SINGLE_SIZE);
memset(decrypt_buff,0,ENCRYPT_SINGLE_SIZE);
if((srv_file_offset+ENCRYPT_SINGLE_SIZE)//讀取密文文件內容
aes_decrypt(decrypt_buff,src_buff,ENCRYPT_SINGLE_SIZE);//密文文件解密
write(decrypt_fd,decrypt_buff,ENCRYPT_SINGLE_SIZE);//將解密內容寫入解密文件中
srv_file_offset+=ENCRYPT_SINGLE_SIZE;
}
else
{
read(src_fd,src_buff,ENCRYPT_SINGLE_SIZE);//讀取最后一包密文文件內容
aes_decrypt(decrypt_buff,src_buff,(ENCRYPT_SINGLE_SIZE));//密文文件解密
write(decrypt_fd,decrypt_buff,(src_file_size-srv_file_offset));//將最后一包解密內容寫入解密文件中
break;
}
}
close(src_fd);
src_fd=-1;
close(decrypt_fd);
decrypt_fd=-1;
}

return0;
}
  1. 驗證時發現一個問題,加密內容的長度需要16字節的整數倍,所以加密完的文件大小也為16字節的整數倍。值得注意的是,解密的最后一包要根據明文文件的大小算出來的,然后寫進解密文件中,因為加密文件是16字節對齊的,所以要去除16字節對齊。

  2. 編譯及運行:

rice@rice:~/project/encrypt$make
gcc-I./tinycrypt/include-Wall-g-cmain.c-omain.o
gcc-I./tinycrypt/include-Wall-g-ctinycrypt/src/tiny_sha1.c-otinycrypt/src/tiny_sha1.o
gcc-I./tinycrypt/include-Wall-g-ctinycrypt/src/tiny_aes.c-otinycrypt/src/tiny_aes.o
gcc-I./tinycrypt/include-Wall-g-ctinycrypt/src/tiny_md5.c-otinycrypt/src/tiny_md5.o
gcc-I./tinycrypt/include-Wall-g-ctinycrypt/src/tiny_sha2.c-otinycrypt/src/tiny_sha2.o
gcc-I./tinycrypt/include-Wall-g-ctinycrypt/src/tiny_base64.c-otinycrypt/src/tiny_base64.o
gccmain.otinycrypt/src/tiny_sha1.otinycrypt/src/tiny_aes.otinycrypt/src/tiny_md5.otinycrypt/src/tiny_sha2.otinycrypt/src/tiny_base64.o-Wall-g-ooutput/tinycrypt_1.0.0
rice@rice:~/ohos/project/encrypt$./output/tinycrypt_1.0.0
136-INFO:sourcefilesize:445
171-INFO:encryptfilesize:445
rice@rice:~/ohos/project/encrypt$
  1. 演示結果:
ca7fbeb2-b13a-11ed-a826-dac502259ad0.png

結論:

  1. 通過加密方式,提高數據的安全性,避免了數據的泄露
  2. AES加密方式,加密內容的長度需要16字節的整數倍,加密之后長度比實際明文可能要長。所以明文的長度需要告知解密方。
  3. AES是對稱加密,所以加密方和解密方的密鑰需要一直。

審核編輯黃宇


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據傳輸
    +關注

    關注

    9

    文章

    1919

    瀏覽量

    64676
  • 加密
    +關注

    關注

    0

    文章

    304

    瀏覽量

    23943
收藏 人收藏

    評論

    相關推薦

    請問NFC數據傳輸如何保證數據安全

    NFC數據傳輸如何保證數據安全
    發表于 04-07 06:18

    無線數據傳輸模塊的實際應用

    使設備廠商可以遠程隨時隨地對設備進行監控、升級和維護等操作,無線數據傳輸模塊又將這些監測的數據傳輸給處理系統,是用戶可以了解產品的使用狀況,完成產品全生命周期的信息收集,指導產品設計和售后服務
    發表于 06-18 04:21

    如何利用MEMS和FPGA設計移動硬盤數據加解密系統?

    來源:維電子隨著信息量的急劇增長,信息安全日益受到人們重視。一個完整的數據加解密系統應該 具備安全可靠的密碼認證機制和
    發表于 07-31 07:40

    mbedtls開源在單片機的數據加解密中有何作用

    單片機常用的數據加解密是什么?mbedtls開源有哪些移植注意事項呢?
    發表于 01-20 07:06

    硬件加解密主要優點及引擎種類

    IoT聯網裝置日漸普及,大家在享受聯網裝置所帶來便利性的同時,也必須同時承擔聯網裝置的風險,即數據傳輸過程可能遭竊取、偽造,因此數據傳輸過程的安全性,對于IoT聯網裝置是基本的要求,
    發表于 08-28 07:29

    STM32加解密技術

    沒有加解密技術是萬萬不能的? 通訊安全? 平臺安全? *例外:STM32 RDP保護知識產權? 加解密技術不是萬能的? 只是工具? 無法代替其它STM32
    發表于 09-08 08:18

    數據傳輸

    通信工程叢書--數據傳輸 這資料還是不錯的,可供參考學習哦!
    發表于 03-25 00:53 ?29次下載

    數據傳輸介質

    2.5  數據傳輸介質      傳輸介質是通信網絡中連接計算機的具體物理設備和數據傳輸物理通路。傳輸介質的特性包括物理描述
    發表于 06-27 21:47 ?0次下載

    基于MEMS和FPGA的移動硬盤數據加解密系統

    基于MEMS和FPGA的移動硬盤數據加解密系統 隨著信息量的急劇增長,信息安全日益受到人們重視。一個完整的數據加解密系統應該 具備
    發表于 11-05 08:57 ?776次閱讀
    基于MEMS和FPGA的移動硬盤<b class='flag-5'>數據</b><b class='flag-5'>加解密</b>系統

    IDE數據傳輸模式

    IDE數據傳輸模式 隨著技術的發展,產品對數據傳輸速度要求的提高,IDE接口硬盤的數
    發表于 12-25 14:58 ?410次閱讀

    Modem數據傳輸標準

     Modem數據傳輸標準 數據傳輸標準是指MODEM的
    發表于 12-28 13:29 ?1022次閱讀

    數據傳輸,數據傳輸的工作方式有哪些?

    數據傳輸,數據傳輸的工作方式有哪些? 將數據從一個地方傳輸到另一個地方的方法多得令人難以置信。 數
    發表于 03-18 14:41 ?6017次閱讀

    數據傳輸速率是什么意思

    數據傳輸速率是什么意思 數據傳輸速率是通過信道每秒可傳輸的數字信息量的量度。數據傳輸速率也稱為吞吐率。數據傳輸速率由很
    發表于 03-18 14:45 ?4994次閱讀

    網絡高效安全數據傳輸方法設計

      網絡數據傳輸安全的核心是通過對數據發送、網絡傳輸數據接收各個環節中的數據進行加密處理,以達
    發表于 12-25 09:42 ?1964次閱讀
    網絡高效<b class='flag-5'>安全數據傳輸</b>方法設計

    銅墻鐵壁的最佳安全保護-硬件加解密MCU

    銅墻鐵壁的最佳安全保護-硬件加解密MCU
    的頭像 發表于 08-11 14:44 ?455次閱讀
    主站蜘蛛池模板: 无套内射在线观看THEPORN| 人人艹人人| 欧美亚洲综合另类无码| 亚洲精品久久YY5099| 吃胸亲吻吃奶摸下面免费视频| 美女脱精光让男生桶下面| 在线观看日韩一区| 欧美性爱-第1页| 精品欧美一区二区三区四区| 亚洲 欧美 国产 综合五月天| 久久久久999| 国产成人a一在线观看| 影音先锋色小姐| 考试考90就可以晚上和老师C| 高清大胆欧美videossexo| 一本色道久久综合亚洲精品加 | 午夜福利08550| 欧美高清vivoesosexo18| 好看的电影网站亚洲一区| 国产 亚洲 另类 欧美 在线| 99精品免费在线观看| 欧美一区二区三区久久综| 久久成人国产精品一区二区| 国产九色在线| 777精品久无码人妻蜜桃| 亚洲伦理精品久久| 男人桶女人j的视频在线观看| 精品视频在线播放| 国产真实露脸乱子伦| 国产成人精品精品欧美| 超碰在线公开视频| jizz非洲| 亚洲欧美一区二区三区蜜芽| 啪啪漫画无遮挡全彩h同人| 乱h好大噗嗤噗嗤烂了| 囯产精品久久久久免费蜜桃| WWW夜片内射视频在观看视频| 97精品少妇偷拍蜜桃AV| 99久久精品国产自免费| 99久久久国产精品免费蜜臀| 99久久国内精品成人免费|