1. 程式人生 > 其它 >實驗一-密碼引擎-加密API實現與測試

實驗一-密碼引擎-加密API實現與測試

GMT 0018-2012

本標準的目標是為公鑰密碼基礎設施應用體系框架下的服務類密碼裝置制定統一的應用介面標準,通過該介面呼叫密碼裝置,向上層提供基礎密碼服務。為該類密碼裝置的開發、使用及檢測提供標準依據和指導,有利於提高該類密碼裝置的產品化、標準化和系列化水平。
範圍:本標準規定了公鑰密碼基礎設施應用技術體系下服務類密碼裝置的應用介面標準,適用於服務類密碼裝置的研製、使用,以及基於該類密碼裝置的應用開發,也可用於指導該類密碼裝置的檢測。
密碼裝置應用介面在公鑰密碼基礎設施應用技術體系框架中的位置:在公鑰密碼基礎設施應用技術體系框架中,密碼裝置服務層由密碼機、密碼卡、智慧密碼終瑞等裝置組成,通過本標準規定的密碼裝置應用介面向通用密碼服務層提供基礎密碼服務。如下圖:

基礎密碼服務包括金鑰生成、單一的密碼運算、檔案管理等服務。
本標準採用C語言描述介面函式,無特別說明時,函式中引數的長度單位均為位元組數。
裝置管理類函式:
開啟裝置:SDF_OpenDevice
關閉裝置:SDF_CloseDevice
建立會話:SDF_OpenSession
關閉會話:SDF_CloseSession
獲取裝置資訊:SDF_GetDeviceInfo
產生隨機數:SDF_GenerateRandom
獲取私鑰使用許可權:SDF_GetPrivateKeyAccessRight
釋放私鑰使用許可權:SDF_ReleasePrivateKeyAccessRight
金鑰管理類函式:
匯出 RSA 簽名公鑰:SDF_ExportSignPublicKey_RSA
匯出 RSA 加密公鑰:SDF_ExportEncPublicKey_RSA
產生RSA非對稱金鑰對並輸出:SDF_GenerateKeyPair_RSA
生成會話金鑰並用內部RSA公鑰加密輸出:SDF_GenerateKeyWithIPK_RSA
生成會話金鑰並用外部RSA公鑰加密輸出:SDF_GenerateKeyWithEPK_RSA - 導人會話金鑰並用內部RSA私鑰解密:SDF_ImportKeyWithISK_RSA
基於 RSA 演算法的數宇倍封轉換:SDF_ExchangeDigitEnvelopeBaseOnRSA
匯出 ECC 簽名公鑰:SDF_ExportSignPublicKey_ECC
匯出 ECC 加密公鑰:SDF_ExportEncPublicKey_ECC
產生ECC非對稱金鑰對並輸出:SDF_GenerateKeyPair_ECC
生成會話金鑰並用內部ECC公鑰加密輸岀:SDF_GenerateKeyWithIPK_ECC - 生成會話金鑰並用外部ECC公鑰加密輸出:SDF_GenerateKeyWithEPK_ECC
匯入會話金鑰並用內部ECC私鑰解密:SDFJmportKeyWithlSKJECC
生成金鑰協商引數並輸出:SDF_GenerateAgreementDataWithECC
計算會話金鑰:SDF_GenerateKey WithECC
產生協商資料並計算會話金鑰:SDF—GenerateAgreementDataAndKeyWithECC
基於 ECC演算法的數字信封轉換:SDF_ExchangeDigitEnvelopeBaseOnECC
生成會話金鑰並用金鑰加密金鑰加密輸出: SDF_GenerateKeyWithKEK
匯入會話金鑰並用金鑰加密金鑰解密:SDF_ImportKeyWithKEK
銷燬會話金鑰:SDF_DestroyKey
非對稱演算法運算類函式
部公鑰 RSA 運算:SDF_ExternalPublicKeyOperation_RSA
內部公鑰 RSA 運算:SDF_InternalPublicKeyOperation_RSA
內部私鑰 RSA 運算:SDF_InternalPrivateKeyOperation_RSA
外部金鑰 ECC 驗證:SDF_ExternalVerify_ECC
內部金鑰 ECC 簽名:SDF_InternalSign_ECC
內部金鑰 ECC 驗證:SDF_InternalVerify_ECC
外部金鑰 ECC 加密:SDF_ExternalEncrypt_ECC
對稱演算法運算類函式
對稱加密:SDF_Encrypt
對稱解密:SDF_Decrypt
計算MAC:SDF_CalculateMAC
雜湊運算類函式
雜湊運算初始化:SDF_HashInit
多包雜湊運算:SDF_HashUpdate
雜湊運算結束:SDF_HashFinal
安全要求
(1)基於本標準設計、開發的密碼裝置在金鑰管理方面,應滿足以下要求:
裝置金鑰的使用不對應用系統開放;
金鑰必須用安全的方法產生並存儲;
在任何時間、任何情況下,除公鑰外的金鑰均不能以明文形式出現在密碼裝置外;
密碼裝置內部儲存的金鑰應具備有效的金鑰保護機制,防止解剖、探測和非法讀取;
密碼裝置內部儲存的金鑰應具備許可權控制機制,防止非法使用和匯出。
(2)密碼服務要求:
使用的密碼演算法應得到國家密碼主管部門的批准;
使用國家密碼主管部門認可的密碼演算法晶片;
本標準所列的所有介面函式均應能被應用系統任意呼叫。
(3)裝置狀態要求:
密碼裝置應具有初始和就緒兩個狀態;
未安裝裝置金鑰的密碼裝置應處於初始狀態,已安裝裝置金鑰的密碼裝置應處於就緒狀態;
在初始狀態下,除可讀取裝置資訊、裝置金鑰的生成或恢復操作外,不能執行任何操作,生成或恢復裝置金鑰後,密碼裝置處於就緒狀態;
在就緒狀態下,除裝置金鑰的生成或恢復操作外,應能執行任何操作;
在就緒狀態下進行的金鑰操作,裝置操作員應經過密碼裝置的認證。
(4)其他要求:
密碼裝置應有安全機制和措施,保證金鑰在生成、安裝、匯入、儲存、備份.恢復及銷燬整個生存期間的安全,此安全機制可由裝置廠商自行設計實現。
回到頂部
二、實現GMT 0018-2012密碼裝置應用介面規範的介面函式,至少實現:
1)裝置管理中的開啟裝置,關閉裝置,獲取裝置資訊,產生隨機數(4分)

    2)金鑰管理匯出 ECC 簽名公鑰;SDF_ExportSignPublicKey_ECC I.匯出 ECC加密公鑰∶SDF_ExportEncPublicKey_ECC J. 產生 ECC非對稱金鑰對並輸出∶SDF_GenerateKeyPair_ECC
K. (6分)





    3)非對稱演算法(至少支援SM2):外部金鑰 ECC驗證∶SDF_ExternalVerify_ECC ,內部金鑰 ECC簽名;SDF_InternalSign_ECC ,內部金鑰 ECC驗證∶SDF_InternalVerify_ECC 外部金鑰 ECC加密∶SDF_ExternalEncrypt_ECC
(8分)

    4)對稱演算法(至少支援SM4)∶SDF_Encrypt 對稱解密∶SDF_Dccrypt 計算 MAC∶SDF_CalculateMAC(6分)

    5)雜湊演算法(至少支援SM3):· 雜湊運算初始化∶SDF_HashInit· 多包雜湊運算∶SDF_HashUpdate· 雜湊運算結束∶SDF_HashFinal(6分)

三、部分程式碼實現

typedef struct DeviceInfo_st{
unsigned char IssuerName[40];
unsigned char DeviceName[16];
unsigned char DeviceSerial[16];
unsigned int DeviceVersion;
unsigned int StandardVersion;
unsigned int AsymAlgAbility[2];
unsigned int SymAlgAbility;
unsigned int HashAlgAbility;
unsigned int BufferSize;
}DEVICEINFO;
GB/T 0018-2012
**# define RSAref_MAX_BIT S2048
**# define RSAref_MAX_LEN
((RSAref_MAX_BITS+7)/8)
**# define RSAref_MAX_PBITS
((RSAref_MAX_BITS+1)/2)
**#define RSAref_MAX_PLEN
((RSAref_MAX_PBITS+7)/8)
typedef struct RSArefPublicKey_st
unsigned int bits;
unsigned char m[RSAref_MAX_LEN];
unsigned char e[RSAref_MAX_LEN];
}RSArefPublicKey;
typedef struct RSArefPrivateKey_st
{
unsigned int bits;
unsigned char m[RSAref_MAX_LEN];
unsigned char e[RSAref_MAX_LEN];
unsigned char d[RSAref_MAX_LEN];
unsigned char prime[2][RSAref_MAX_PLEN]; unsigned char pexp[2][RSAref_MAX_PLEN]; unsigned char coef RSArefMAX_PLEN];
}RSArefPrivateKey;`

ECC加密如下:

# define ECCrcf_MAX_BITS 512# define ECCref_MAX_LEN ((ECCref_MAX_BITS+7)/8)typedef struct ECCrefPublicKey_st
unsigned int bits;
unsigned char x[ECCref_MAX_LEN];
unsigned char y[ECCref_MAX_LEN];
ECCrefPublicKey;
typedef struct ECCrefPrivateKey_st
unsigned int bits;
unsigned char K[ECCref_MAX_LEN];
ECCrefPrivateKey;

裝置管理:

//******************************************
//裝置管理
//******************************************
/*
功能:開啟密碼裝置,返回裝置控制代碼。
引數:
返回值:0(SDR OK) 成功
非0 失敗,返回錯誤程式碼
/
int SDF_OpenDevice(void* phDeviceHandle);
/*
功能:關閉密碼裝置,並釋放相關資源。
引數:hDeviceHandle[in] 已開啟的裝置控制代碼
返回值:0(SDR OK) 成功
非0 失敗,返回錯誤程式碼
/
int SDF_CloseDevice(void hDeviceHandle);
/*
功能: 建立與密碼裝置的會話。
已開啟的裝置控制代碼
hDeviceHandlein]引數:h
phessionHiandle[out]
返回與密碼裝置建立的新會話控制代碼成功
返回值:0(SDR OK) 成功
非0 失敗,返回錯誤程式碼
/
int SDF_OpenSession(void hDeviceHandle, void** phSessionHandle);

/*
功能:關閉與密碼裝置已建立的會話,並釋放相關資源。
引數:hSessionHandle[in] 與密碼裝置已建立的會話控制代碼
返回值:0(SDR OK) 成功
非0 失敗,返回錯誤程式碼
/
int SDF_CloseSesson(void hSessionHandle);

/*
功能:獲取密碼裝置能力描述。
引數:hSessionHandle[in] 與裝置建立的會話控制代碼
pstDevicelnfo[our] 裝置能力描述資訊,內容及格式見裝置資訊定義成功
返回值:0(SDR OK) 成功
非0 失敗,返回錯誤程式碼
/
int SDF_GetDeviceInfo(
void hSessionHandle,
DEVICEINFO* pstDeviceInfo);

/*
功能:獲取指定長度的隨機數。
引數:
hSessonHandle[in] 與裝置建立的會話控制代碼
uiLegth[in] 欲獲取的隨機數長度
pucRandom[out] 緩衝區指標,用於存放獲取的隨機數
返回值:0(SDR OK) 成功
非0 失敗,返回錯誤程式碼
/
int SDF_GenerateRandom(
void hSessionHandle,
unsigned int uiLength,
unsigned char* pucRandom);

/*
功能:獲取密碼裝置內部儲存的指定索引私鑰的使用權。
引數:
hSessionHandle[in] 與裝置建立的會話控制代碼
uiKeyIndex[in] 密碼裝置儲存私鑰的索引值
pucPassword[in] 使用私鑰許可權的標識碼
uiPwdLength[in] 私鑰訪問控制碼長度,不少於8 位元組
返回值:0(SDR OK) 成功
非0 失敗,返回錯誤程式碼
/
int SDF_GetPrivateKeyAccessRight(
void hSessionHandle,
unsigned int uiKeyIndex,
unsigned char* pucPassword,
unsigned int uiPwdLength);

/*
功能:釋放密碼裝置儲存的指定索引私鑰的使用授權。
引數:
hSessonHandle[in] 與裝置建立的會話控制代碼
uiKeyIndex[in] 密碼裝置儲存私鑰索引值成功
返回值∶0(SDR OK) 成功
非0 失敗,返回錯誤程式碼
/
int SDF_ReleasePrivateKeyAccessRight(
void hSessionHandle,
unsigned int uiKeyIndex);

截圖如下