亚洲国产成人精品一区91_日韩欧美成人观看_国产情侣露脸在线对白_日本动漫欧美激情桃花_亚洲鸥美中文字幕_日韩在线中文字幕有码中文_麻豆va在线精品免费播放_五月天婷婷视频新地址_AV毛片在线免费观看_看欧美三级黄免费

上海動信微電子科技有限公司

技術(shù)資料

您的當(dāng)前位置:首頁 > 新聞中心 > 技術(shù)資料

DX8加密芯片應(yīng)用開發(fā)手冊(六)

發(fā)布時間:2017-09-05瀏覽次數(shù):載入中...來源:上海動信微電子科技有限公司


7.2.基于標(biāo)識數(shù)據(jù)加解密函數(shù)(DX82C04):


DX8加密芯片應(yīng)用開發(fā)手冊第六部分主要講解DX82C04物聯(lián)網(wǎng)安全加密芯片在基于標(biāo)識認(rèn)證實現(xiàn)數(shù)據(jù)加解密中函數(shù)的實現(xiàn)方法!


7.2.1. 基本原理

DX82C04物聯(lián)網(wǎng)加密芯片的基本原理圖

用戶執(zhí)行數(shù)據(jù)加密或者解密運算需要兩個步驟:

l? 產(chǎn)生加密密鑰或者產(chǎn)生解密密鑰

l? 加密明文或者解密密文

1.? 加密方DX82芯片首先根據(jù)輸入的標(biāo)識參數(shù)和內(nèi)部產(chǎn)生的真隨機數(shù),共同生成隨機動態(tài)的會話密鑰(真正的數(shù)據(jù)加解密密鑰,動態(tài)存儲在DX82芯片內(nèi)部,永遠(yuǎn)無法讀出),然后對明文數(shù)據(jù)進行加密。

2.? 加密方將動態(tài)的隨機數(shù)和密文傳給解密方。

3. 解密方收到數(shù)據(jù)后,首先利用動態(tài)的隨機數(shù)恢復(fù)會話密鑰,然后對密文數(shù)據(jù)進行解密。

說明1只有加密密鑰產(chǎn)生成功后才能執(zhí)行數(shù)據(jù)加密,同樣只有解密密鑰產(chǎn)生成功后才能執(zhí)行數(shù)據(jù)解密,任何錯誤都會使DX82芯片內(nèi)部密鑰產(chǎn)生標(biāo)志清除。

說明2會話密鑰只能由擁有加密方輸入的標(biāo)識參數(shù)的DX82芯片才能恢復(fù),因此加密方對誰進行加密,就只有誰能解密,即使第三方獲得了動態(tài)的隨機數(shù)和密文也無法恢復(fù)真正的會話密鑰。


7.2.2. 會話密鑰產(chǎn)生模式


DX82每次產(chǎn)生會話密鑰的輸入?yún)?shù)主要依賴:芯片內(nèi)部自動產(chǎn)生的真隨機數(shù)、群密鑰、可選的對方8個字節(jié)SN序列號、可選的對方7個字節(jié)UID號以及雙方可臨時約定的8個字節(jié)任意OT值共同運算產(chǎn)生。根據(jù)輸入可選的參數(shù)相,可以實現(xiàn)一對一私聊和一對多群聊。

關(guān)于群密鑰,DX82芯片內(nèi)置了一個固定的公共密鑰域和一個用戶可設(shè)的私有密鑰域(KEYB),DX82芯片之間可以選擇私有域內(nèi)加解密通信,也可選擇公共域內(nèi)實現(xiàn)跨群加解密通信,根據(jù)可選的輸入?yún)?shù)相可以有以下8種模式:

?

會話密鑰模式

群密鑰

選擇

可選項

備注

SN

UID

OT

PUBLIC

公共域

?

?

?

公共域群聊

PUBLIC_OT

?

?

Yes

公共域臨時群聊

PUBLIC_SN

Yes

?

?

公共域私聊

PUBLIC_SNOT

Yes

?

Yes

公共域臨時群私聊

PUBLIC_ID

?

Yes

?

公共域私聊

PUBLIC_IDOT

?

Yes

Yes

公共域臨時群私聊

PUBIC_IDSN

Yes

Yes

?

公共域私聊

PUBLIC_IDSNOT

Yes

Yes

Yes

公共域臨時群私聊

PRIVATE

私有域

KEYB

?

?

?

私有域群聊

PRIVATE_OT

?

?

Yes

私有域臨時群聊

PRIVATE_SN

Yes

?

?

私有域私聊

PRIVATE_SNOT

Yes

?

Yes

私有域臨時群私聊

PRIVATE_ID

?

Yes

?

私有域私聊

PRIVATE_IDOT

?

Yes

Yes

私有域臨時群私聊

PRIVATE_IDSN

Yes

Yes

?

私有域私聊

PRIVATE_IDSNOT

Yes

Yes

Yes

私有域臨時群私聊

?

說明1SN是出廠后永遠(yuǎn)物理唯一的,UID是用戶設(shè)定的邏輯唯一,UID可以是用戶自定義的編碼規(guī)則,也可以綁定現(xiàn)有的編碼規(guī)范,如手機號、QQ號等,便于記憶,SNUID單獨參與會話密鑰產(chǎn)生均可實現(xiàn)私聊,但SNUID一起參與唯一性會更強。

說明2OT值可以理解為臨時的會議密鑰或者臨時的驗證碼,需要通過其他方式告知對方。


7.2.3. 數(shù)據(jù)結(jié)構(gòu)定義


7.2.3.1.? CRYPTO_TYPE

? ? ? ? ? ? ?C語言:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Java語言:

DX82的C語言CRYPTO_TYPE? ? ? ? ? ?DX82的Java語言CRYTO_TYPE



7.2.3.2.? CRYPTO_MODE

? ? ? ? ? ? C語言:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???Java語言:

DX82的C語言的CRYPTO_MODE? ? ? ?DX82的Java語言的CRYPTO_MODE



7.2.3.3.? CRYPTO_PARA

? ? ? ? ? ?C語言:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Java語言:

DX82的C語言的CRYPTO_PARA? ? ? ? ?DX82的Java語言的CRYPTO_PARA



seedDX82芯片產(chǎn)生會話密鑰時,在芯片內(nèi)部自動產(chǎn)生動態(tài)的隨機數(shù)

slen指定上述動態(tài)隨機數(shù)的長度


7.2.4. 直接初始化會話密鑰


u8_x DX8_InitSessionKey(u8_x *buf);

功能描述:直接初始化會話密鑰

參數(shù):??? buf?? 輸入的16個字節(jié)會話密鑰

返回值:? 初始化成功返回0,否則返回錯誤代碼

說明: 該函數(shù)功能是直接初始化會話密鑰,適合于事先雙方直接約定會話密鑰場合,不需要動態(tài)產(chǎn)生會話密鑰,初始化成功后,接下來只能執(zhí)行數(shù)據(jù)加密或者解密的命令,其他任何其他命令或者錯誤都將清除密鑰初始化標(biāo)志。

示例代碼:

u8_x rv;

u8_x buf[16];

rv = DX8_ InitSessionKey (buf);

if (rv) {

?? printf(“Initial Session Key failed, rv = 0x%.2x\n”, rv);

?? return rv;

}


7.2.5. 根據(jù)標(biāo)識產(chǎn)生會話密鑰


u8_x DX8_GenSessionKey( CRYPTO_TYPE type,

CRYPTO_MODE mode,

CRYPTO_PARA *para );

功能描述:根據(jù)CRYPTO_TYPE, CRYPTO_MODE, CRYPTO_PARA產(chǎn)生相應(yīng)的會話密鑰

參數(shù):??? type? 會話密鑰的類型,包括加密、解密、簽名、驗簽的會話密鑰

????????? mode? 會話密鑰的模式,請見前文會話密鑰產(chǎn)生模式

????????? para? 產(chǎn)生會話密鑰的參數(shù),請見示例代碼描述

返回值:? 產(chǎn)生成功返回0,否則返回錯誤代碼

?

示例代碼1(加密方:產(chǎn)生加密會話密鑰):

u8_x rv;

CRYPTO_PARA para;

//? PRIVATE_IDSNOT模式為例,需要對para.ID, para.SN, para.OT賦值

//? 1. 請賦值解密方ID, 如:

para.ID = 0xxxxxxx;

//? 2. 請賦值解密方SN, 如:

para.SN = 0xxxxxxx;

//? 3. 請賦值臨時OT, 如:

para.OT = 0xxxxxxx;

//? 4. 加密需要使用動態(tài)隨機數(shù)的長度,最大32個字節(jié),如:

para.slen = 32;

//? 5. 產(chǎn)生加密的會話密鑰:

rv = DX8_ GenSessionKey (CRYPTO_ENC, PRIVATE_IDSNOT, ?);

if (rv) {

?? ???printf(“Generate Session Key failed, rv = 0x%.2x\n”, rv);

?? ???return rv;

}

說明1加密方會話密鑰產(chǎn)生成功后,para.seed將存儲DX82芯片返回指定長度的動態(tài)隨機數(shù),該隨機數(shù)需要和密文一起傳給解密方

說明2加密方會話密鑰產(chǎn)生成功后,接著只能執(zhí)行數(shù)據(jù)加密的操作,其他任何命令和錯誤都會清除芯片內(nèi)部的會話密鑰產(chǎn)生標(biāo)志

?

示例代碼2(解密方:產(chǎn)生解密會話密鑰):

u8_x rv;

CRYPTO_PARA para;

// 不管什么模式,產(chǎn)生解密會話密鑰時,使用的是芯片自身的SNID

//? PRIVATE_IDSNOT為例,需要對para.OT賦值,

//? 1. 請賦值加密方使用的OT值,如:

para.OT = 0xxxxxx

//? 2. 請賦值加密方的產(chǎn)生的動態(tài)隨機數(shù),如:

para.seed = 0xxxxxx

//? 3. 請賦值加密方的產(chǎn)生的動態(tài)隨機數(shù)的長度,如:

para.slen = 32;

//? 4. 產(chǎn)生解密會話密鑰:

rv = DX8_ GenSessionKey (CRYPTO_DEC, PRIVATE_IDSNOT, ?);

if (rv) {

?? ???printf(“Generate Session Key failed, rv = 0x%.2x\n”, rv);

?? ???return rv;

}

說明1加解密雙方必須使用相同會話密鑰模式,否則無法產(chǎn)生正確會話密鑰

說明2解密會話密鑰產(chǎn)生成功后,接著只能執(zhí)行數(shù)據(jù)解密的操作,其他任何命令和錯誤都會清除芯片內(nèi)部的會話密鑰產(chǎn)生標(biāo)志

示例代碼3(簽名方:產(chǎn)生簽名會話密鑰):

u8_x rv;

CRYPTO_PARA para;

// 不管什么模式,產(chǎn)生簽名會話密鑰時,使用芯片自身的SNID

//? PRIVATE_IDSNOT為例,只需對para.OT賦值

//? 1. 請賦值臨時OT, 如:

para.OT = 0xxxxxx;

//? 2. 簽名需要使用動態(tài)隨機數(shù)的長度,如:

para.slen = 32;

//? 3. 產(chǎn)生簽名的會話密鑰

rv = DX8_ GenSessionKey (CRYPTO_SIG, PRIVATE_IDSNOT, ?);

if (rv) {

?? ???printf(“Generate Session Key failed, rv = 0x%.2x\n”, rv);

?? ???return rv;

}

說明1簽名會話密鑰產(chǎn)生成功后,para.seed將存儲DX82芯片返回指定長度的動態(tài)隨機數(shù),該隨機數(shù)需要和簽名值一起傳給驗簽方

說明2簽名會話密鑰產(chǎn)生成功后,接著只能執(zhí)行數(shù)據(jù)簽名的操作,其他任何命令和錯誤都會清除芯片內(nèi)部的會話密鑰產(chǎn)生標(biāo)志

?

示例代碼4(驗簽方:產(chǎn)生驗簽會話密鑰):

u8_x rv;

CRYPTO_PARA para;

//? PRIVATE_IDSNOT為例,需要對para.ID, para.SN, para.OT賦值

//? 1. 請賦值簽名方ID, 如:

para.ID = 0xxxxx

//? 2. 請賦值簽名方SN, 如:

para.SN = 0xxxxx;

//? 3. 請賦值簽名方使用的OT, 如:

para.OT = 0xxxx

//? 4. 請賦值簽名方產(chǎn)生的動態(tài)隨機數(shù), 如:

para.seed = 0xxxxx;

//? 5. 上述動態(tài)隨機數(shù)的長度,如:

para.slen = 32;

//? 6. 產(chǎn)生驗簽會話密鑰:

rv = DX8_ GenSessionKey (CRYPTO_VSIG, PRIVATE_IDSNOT, ?);

if (rv) {

?? ???printf(“Generate Session Key failed, rv = 0x%.2x\n”, rv);

? ????return rv;

}

說明:簽名方和驗簽方必須使用相同會話密鑰模式,否則無法產(chǎn)生正確會話密鑰


7.2.6. Crypto計算


u8_x DX8_DoCrypto( CRYPTO_TYPE type,

u8_x ?*din,

u8_x ?*dout,

u16_x len );

功能描述:根據(jù)指定的CRYPTO_TYPE對輸入數(shù)據(jù)進行Crypto計算

參數(shù):??? type?? crypto計算類型,包括加密、解密、簽名、驗簽

????????? din??? 輸入數(shù)據(jù)

????????? dout?? 輸出數(shù)據(jù)

????????? len??? 計算數(shù)據(jù)的長度

返回值:? 計算成功返回0,否則返回錯誤代碼

說明:在進行指定的crypto類型計算前,必須要先直接初始化會話密鑰或者產(chǎn)生相應(yīng)的會話密鑰,否則返回操作權(quán)限錯誤,會話密鑰產(chǎn)生成功后,可連續(xù)多次執(zhí)行相應(yīng)的crypto計算,任何其他的命令都會清除DX82芯片內(nèi)部的會話密鑰標(biāo)志。

示例代碼:

u8_x rv;

u8_x din[1024];

u8_x dout[1024];

// 加密運算

rv = DX8_ GenSessionKey (CRYPTO_ENC, PRIVATE_IDSNOT, ?);

rv = DX8_DoCrypto(CRYPTO_ENC, din, dout, 1024);

// 解密運算

rv = DX8_ GenSessionKey (CRYPTO_DEC, PRIVATE_IDSNOT, ?);

rv = DX8_DoCrypto(CRYPTO_DEC, din, dout, 1024);

// 簽名運算

rv = DX8_ GenSessionKey (CRYPTO_SIG, PRIVATE_IDSNOT, ?);

rv = DX8_DoCrypto(CRYPTO_SIG, din, dout, 1024);

// 驗簽運算

rv = DX8_ GenSessionKey (CRYPTO_VSIG, PRIVATE_IDSNOT, ?);

rv = DX8_DoCrypto(CRYPTO_VSIG, din, dout, 1024);


7.3.用戶SHA1計算(DX82


DX82芯片為用戶提供了硬件SHA1模塊,可方便主機的進行摘要計算,減輕主機計算能力,一次完整SHA1計算分為三個步驟:

l? 初始化

l? 一次或者多次加載數(shù)據(jù)

l? 獲取計算結(jié)果


7.3.1. SHA1初始化


u8_x DX8_Sha1Init(u8_x flag);

功能描述:初始化DX82芯片硬件SHA1

參數(shù):??? flag, 0: Lib庫軟件計算, 1DX8芯片計算

返回值:? 初始化成功返回0,否則返回錯誤代碼


7.3.2. SHA1數(shù)據(jù)加載


u8_x DX8_Sha1Update(u8_x *message, u16_x len);

功能描述:SHA1消息數(shù)據(jù)的輸入,可以多次調(diào)用此函數(shù)進行數(shù)據(jù)加載

參數(shù):??? message?? 消息輸入

????????? len???????? 消息長度

返回值:? 數(shù)據(jù)加載成功,否則返回錯誤代碼


7.3.3. 獲取SHA1計算結(jié)果


u8_x DX8_Sha1Final(u8_x *digest);

功能描述:獲取SHA1摘要計算結(jié)果

參數(shù):??? digest?? 返回的結(jié)果數(shù)據(jù),20個字節(jié)

返回值:? 執(zhí)行成功返回0,否則返回錯誤代碼

SHA1示例代碼:

u8_x rv; u8_x message[1024]; u8_x digest[20];

rv = DX8_Sha1Init();

rv = DX8_Sha1Update (message,1024); // 一次或者多次加載

rv = DX8_Sha1Final(digest);

?

7.4.軟件流加密函數(shù)


此部分庫函數(shù)全部上位機軟件計算,不訪問硬件DX8芯片,供嵌入式系統(tǒng)安全協(xié)議開發(fā),用戶可采用此部分的函數(shù)對明文數(shù)據(jù)進行預(yù)先軟件加密變換,更加增強系統(tǒng)的安全性能。


7.4.1. 初始化流加密密鑰:


u8_x Lib_InitStreamKey(u8_x *buf, u8_x *seed, u8_x slen);

功能描述:初始化流加密密鑰

參數(shù):??? buf?? 輸入16個字節(jié)的密鑰

????????? seed? 輸入的隨機種子

????????? slen? seed的字節(jié)長度,最大為32個字節(jié)

返回值:? 執(zhí)行成功返回0,否則返回錯誤代碼


7.4.2. 流加密:


u8_x Lib_StreamEncryption(u8_x *din, u8_x *dout, u16_x len);

參數(shù):??? din??? 輸入明文數(shù)據(jù)

????????? dout?? 輸出密文數(shù)據(jù)

????????? len??? 計算數(shù)據(jù)的長度

返回值: ?計算成功返回

【返回列表】
fNRNtaNTlmBd6K5Low6uIGqB9B021S0k/7klxhvNqJETaYa3acD+HB8U0DTqxLa6O1Atzf61lsaKuagicZSOETLL0ZRx3V1zsxXJKglY+9MAi7rSTq3GIM9W0xB8XKO/KfCywedWs93qNy7ER/O7E3UHte/fgdh/CVbX0EvlJwdKUm4GCDcIoIQtJtcK331E4rgnnVrEqNP2SLLq1Gq4PQ==