聯系我們
13482583038DX8加密芯片應用開發手冊(六)
7.2.基于標識數據加解密函數(DX82C04):
DX8加密芯片應用開發手冊第六部分主要講解DX82C04物聯網安全加密芯片在基于標識認證實現數據加解密中函數的實現方法!
7.2.1. 基本原理
用戶執行數據加密或者解密運算需要兩個步驟:
l? 產生加密密鑰或者產生解密密鑰
l? 加密明文或者解密密文
1.? 加密方DX82芯片首先根據輸入的標識參數和內部產生的真隨機數,共同生成隨機動態的會話密鑰(真正的數據加解密密鑰,動態存儲在DX82芯片內部,永遠無法讀出),然后對明文數據進行加密。
2.? 加密方將動態的隨機數和密文傳給解密方。
3. 解密方收到數據后,首先利用動態的隨機數恢復會話密鑰,然后對密文數據進行解密。
說明1:只有加密密鑰產生成功后才能執行數據加密,同樣只有解密密鑰產生成功后才能執行數據解密,任何錯誤都會使DX82芯片內部密鑰產生標志清除。
說明2:會話密鑰只能由擁有加密方輸入的標識參數的DX82芯片才能恢復,因此加密方對誰進行加密,就只有誰能解密,即使第三方獲得了動態的隨機數和密文也無法恢復真正的會話密鑰。
7.2.2. 會話密鑰產生模式
DX82每次產生會話密鑰的輸入參數主要依賴:芯片內部自動產生的真隨機數、群密鑰、可選的對方8個字節SN序列號、可選的對方7個字節UID號以及雙方可臨時約定的8個字節任意OT值共同運算產生。根據輸入可選的參數相,可以實現一對一私聊和一對多群聊。
關于群密鑰,DX82芯片內置了一個固定的公共密鑰域和一個用戶可設的私有密鑰域(KEYB),DX82芯片之間可以選擇私有域內加解密通信,也可選擇公共域內實現跨群加解密通信,根據可選的輸入參數相可以有以下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 |
私有域臨時群私聊 |
?
說明1:SN是出廠后永遠物理唯一的,UID是用戶設定的邏輯唯一,UID可以是用戶自定義的編碼規則,也可以綁定現有的編碼規范,如手機號、QQ號等,便于記憶,SN和UID單獨參與會話密鑰產生均可實現私聊,但SN和UID一起參與唯一性會更強。
說明2:OT值可以理解為臨時的會議密鑰或者臨時的驗證碼,需要通過其他方式告知對方。
7.2.3. 數據結構定義
7.2.3.1.? CRYPTO_TYPE
? ? ? ? ? ? ?C語言:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Java語言:
? ? ? ? ? ?
7.2.3.2.? CRYPTO_MODE
? ? ? ? ? ? C語言:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???Java語言:
? ? ? ?
7.2.3.3.? CRYPTO_PARA
? ? ? ? ? ?C語言:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Java語言:
? ? ? ? ?
seed:DX82芯片產生會話密鑰時,在芯片內部自動產生動態的隨機數
slen:指定上述動態隨機數的長度
7.2.4. 直接初始化會話密鑰
u8_x DX8_InitSessionKey(u8_x *buf);
功能描述:直接初始化會話密鑰
參數:??? buf?? 輸入的16個字節會話密鑰
返回值:? 初始化成功返回0,否則返回錯誤代碼
說明: 該函數功能是直接初始化會話密鑰,適合于事先雙方直接約定會話密鑰場合,不需要動態產生會話密鑰,初始化成功后,接下來只能執行數據加密或者解密的命令,其他任何其他命令或者錯誤都將清除密鑰初始化標志。
示例代碼:
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. 根據標識產生會話密鑰
u8_x DX8_GenSessionKey( CRYPTO_TYPE type,
CRYPTO_MODE mode,
CRYPTO_PARA *para );
功能描述:根據CRYPTO_TYPE, CRYPTO_MODE, CRYPTO_PARA產生相應的會話密鑰
參數:??? type? 會話密鑰的類型,包括加密、解密、簽名、驗簽的會話密鑰
????????? mode? 會話密鑰的模式,請見前文會話密鑰產生模式
????????? para? 產生會話密鑰的參數,請見示例代碼描述
返回值:? 產生成功返回0,否則返回錯誤代碼
?
示例代碼1(加密方:產生加密會話密鑰):
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. 加密需要使用動態隨機數的長度,最大32個字節,如:
para.slen = 32;
//? 5. 產生加密的會話密鑰:
rv = DX8_ GenSessionKey (CRYPTO_ENC, PRIVATE_IDSNOT, ?);
if (rv) {
?? ???printf(“Generate Session Key failed, rv = 0x%.2x\n”, rv);
?? ???return rv;
}
說明1:加密方會話密鑰產生成功后,para.seed將存儲DX82芯片返回指定長度的動態隨機數,該隨機數需要和密文一起傳給解密方
說明2:加密方會話密鑰產生成功后,接著只能執行數據加密的操作,其他任何命令和錯誤都會清除芯片內部的會話密鑰產生標志
?
示例代碼2(解密方:產生解密會話密鑰):
u8_x rv;
CRYPTO_PARA para;
// 不管什么模式,產生解密會話密鑰時,使用的是芯片自身的SN和ID
//? 以PRIVATE_IDSNOT為例,需要對para.OT賦值,
//? 1. 請賦值加密方使用的OT值,如:
para.OT = 0xxxxxx;
//? 2. 請賦值加密方的產生的動態隨機數,如:
para.seed = 0xxxxxx;
//? 3. 請賦值加密方的產生的動態隨機數的長度,如:
para.slen = 32;
//? 4. 產生解密會話密鑰:
rv = DX8_ GenSessionKey (CRYPTO_DEC, PRIVATE_IDSNOT, ?);
if (rv) {
?? ???printf(“Generate Session Key failed, rv = 0x%.2x\n”, rv);
?? ???return rv;
}
說明1:加解密雙方必須使用相同會話密鑰模式,否則無法產生正確會話密鑰
說明2:解密會話密鑰產生成功后,接著只能執行數據解密的操作,其他任何命令和錯誤都會清除芯片內部的會話密鑰產生標志
示例代碼3(簽名方:產生簽名會話密鑰):
u8_x rv;
CRYPTO_PARA para;
// 不管什么模式,產生簽名會話密鑰時,使用芯片自身的SN和ID
//? 以PRIVATE_IDSNOT為例,只需對para.OT賦值
//? 1. 請賦值臨時OT值, 如:
para.OT = 0xxxxxx;
//? 2. 簽名需要使用動態隨機數的長度,如:
para.slen = 32;
//? 3. 產生簽名的會話密鑰
rv = DX8_ GenSessionKey (CRYPTO_SIG, PRIVATE_IDSNOT, ?);
if (rv) {
?? ???printf(“Generate Session Key failed, rv = 0x%.2x\n”, rv);
?? ???return rv;
}
說明1:簽名會話密鑰產生成功后,para.seed將存儲DX82芯片返回指定長度的動態隨機數,該隨機數需要和簽名值一起傳給驗簽方
說明2:簽名會話密鑰產生成功后,接著只能執行數據簽名的操作,其他任何命令和錯誤都會清除芯片內部的會話密鑰產生標志
?
示例代碼4(驗簽方:產生驗簽會話密鑰):
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. 請賦值簽名方產生的動態隨機數, 如:
para.seed = 0xxxxx;
//? 5. 上述動態隨機數的長度,如:
para.slen = 32;
//? 6. 產生驗簽會話密鑰:
rv = DX8_ GenSessionKey (CRYPTO_VSIG, PRIVATE_IDSNOT, ?);
if (rv) {
?? ???printf(“Generate Session Key failed, rv = 0x%.2x\n”, rv);
? ????return rv;
}
說明:簽名方和驗簽方必須使用相同會話密鑰模式,否則無法產生正確會話密鑰
7.2.6. Crypto計算
u8_x DX8_DoCrypto( CRYPTO_TYPE type,
u8_x ?*din,
u8_x ?*dout,
u16_x len );
功能描述:根據指定的CRYPTO_TYPE對輸入數據進行Crypto計算
參數:??? type?? crypto計算類型,包括加密、解密、簽名、驗簽
????????? din??? 輸入數據
????????? dout?? 輸出數據
????????? len??? 計算數據的長度
返回值:? 計算成功返回0,否則返回錯誤代碼
說明:在進行指定的crypto類型計算前,必須要先直接初始化會話密鑰或者產生相應的會話密鑰,否則返回操作權限錯誤,會話密鑰產生成功后,可連續多次執行相應的crypto計算,任何其他的命令都會清除DX82芯片內部的會話密鑰標志。
示例代碼:
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? 一次或者多次加載數據
l? 獲取計算結果
7.3.1. SHA1初始化
u8_x DX8_Sha1Init(u8_x flag);
功能描述:初始化DX82芯片硬件SHA1
參數:??? flag, 0: Lib庫軟件計算, 1:DX8芯片計算
返回值:? 初始化成功返回0,否則返回錯誤代碼
7.3.2. SHA1數據加載
u8_x DX8_Sha1Update(u8_x *message, u16_x len);
功能描述:SHA1消息數據的輸入,可以多次調用此函數進行數據加載
參數:??? message?? 消息輸入
????????? len???????? 消息長度
返回值:? 數據加載成功,否則返回錯誤代碼
7.3.3. 獲取SHA1計算結果
u8_x DX8_Sha1Final(u8_x *digest);
功能描述:獲取SHA1摘要計算結果
參數:??? digest?? 返回的結果數據,20個字節
返回值:? 執行成功返回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.軟件流加密函數
此部分庫函數全部上位機軟件計算,不訪問硬件DX8芯片,供嵌入式系統安全協議開發,用戶可采用此部分的函數對明文數據進行預先軟件加密變換,更加增強系統的安全性能。
7.4.1. 初始化流加密密鑰:
u8_x Lib_InitStreamKey(u8_x *buf, u8_x *seed, u8_x slen);
功能描述:初始化流加密密鑰
參數:??? buf?? 輸入16個字節的密鑰
????????? seed? 輸入的隨機種子
????????? slen? seed的字節長度,最大為32個字節
返回值:? 執行成功返回0,否則返回錯誤代碼
7.4.2. 流加密:
u8_x Lib_StreamEncryption(u8_x *din, u8_x *dout, u16_x len);
參數:??? din??? 輸入明文數據
????????? dout?? 輸出密文數據
????????? len??? 計算數據的長度
返回值: ?計算成功返回
【返回列表】上一個:上海動信微電子搬遷公告
下一個:DX8加密芯片應用開發手冊(五)
相關新聞
- DX8加密芯片應用開發手冊(五)2017-09-03
- DX8加密芯片應用開發手冊(四)2017-09-01
- DX8加密芯片應用開發手冊(三)2017-08-31
- DX8加密芯片應用開發手冊(二)2017-08-30
- DX8加密芯片應用開發手冊(一)2017-08-29