• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > USB安全鑰功能擴(kuò)展與優(yōu)化設(shè)計(jì)

    USB安全鑰功能擴(kuò)展與優(yōu)化設(shè)計(jì)

    作者: 時(shí)間:2009-04-09 來源:網(wǎng)絡(luò) 收藏

    Server端的加密算法采用DES。加密和解密是整個(gè)鑰身份認(rèn)證的核心。在鑰的初期產(chǎn)品中,已經(jīng)實(shí)現(xiàn)了DES算法下的加密。但是,作為產(chǎn)品,其性是第一位的。而且,對(duì)于要將加密算法嵌入自己系統(tǒng)的用戶來說,提供給他們大量的加密算法的源代碼是不合適的。要對(duì)DES算法進(jìn)行修改,將其從Server端的源程序中提出,改掉原來復(fù)雜的調(diào)用機(jī)制,改為提供給用戶三個(gè)簡(jiǎn)單的接口函數(shù):產(chǎn)生隨機(jī)數(shù)、加密和解密函數(shù)、實(shí)現(xiàn)DES加密算法的DLL。

    動(dòng)態(tài)鏈接庫(DLL)是一個(gè)包含了若干個(gè)函數(shù)的可執(zhí)行模塊,Windows應(yīng)用程序可以調(diào)用這些函數(shù)來完成實(shí)際任務(wù)。對(duì)于調(diào)用DLL的用戶來說,利用的資源僅僅是應(yīng)用函數(shù)接口和一個(gè)后綴為.dll的文件,實(shí)現(xiàn)加密算法的模塊化。

    在建立了一個(gè)VC工程之后,需要建立主程序頭文件KeyDll.h,加入如下代碼。這些代碼中定義了導(dǎo)出的四個(gè)函數(shù)。

    class _declspec(dllexport) CKeyDllApp

    {public:

    BOOL GetChallenge();

    int* Challenge();//導(dǎo)出函數(shù)

    int* DecryptData(BYTE []);//導(dǎo)出函數(shù),需要解密的隨機(jī)數(shù),可存儲(chǔ)在數(shù)組InputNum[8]中。此函數(shù)輸出值即為加密后的數(shù)據(jù),輸出格式為數(shù)組DESDeData[8]

    int* EncryptData(BYTE []);//導(dǎo)出函數(shù),需要加密的隨機(jī)數(shù),可存儲(chǔ)在數(shù)組InputNum[8]中。此函數(shù)輸出值即為加密后的數(shù)據(jù),輸出格式為數(shù)組DESEnData[8]

    BOOL cha_gen;

    void DESDecrypt ();//BYTE *Data, BYTE *Key); //解密函數(shù)定義

    void DESEncrypt ();//BYTE *Data, BYTE *Key); //加密函數(shù)定義

    BOOL Init();

    protected:

    BYTE DESKey[8]; //密鑰

    BYTE IniDeData[8]; //外部輸入的需要解密的數(shù)據(jù)

    BYTE IniEnData[8]; //外部輸入的加密前的隨機(jī)數(shù)

    BYTE DESDeData[8]; //解密后的數(shù)據(jù)

    BYTE DESEnData[8]; //加密后的數(shù)據(jù)

    WORD subkey[16][48]; //子密鑰

    BYTE challenge[8];

    ......}

    然后,在主文件KeyDll.cpp中實(shí)現(xiàn)各函數(shù)的具體,主要是算法的實(shí)現(xiàn)。

    BOOL CKeyDllApp::GetChallenge()//這是產(chǎn)生隨機(jī)數(shù)的函數(shù),它調(diào)用API的函數(shù)srand(),最終產(chǎn)生的8位隨機(jī)數(shù)存在數(shù)組challenge[8]中

    {

    int i;

    srand((unsigned)time(NULL));

    if(!cha_gen){

    for(i = 0; i 8; i++){

    do{challenge[i] = (rand()/256);}

    while((challenge[i]=='t') || (challenge[i] == 0) || (challenge[i]==255) || (challenge[i]== 256- 't'));}

    challenge[8] = 0;

    cha_gen = TRUE;

    return TRUE;}

    return FALSE;}

    void CKeyDllApp::DESDecrypt ()//解密函數(shù),完成對(duì)已加密的8位隨機(jī)數(shù)的解密功能

    {

    WORD TempInput[64],TempOutput[64],TempKey[64];

    stringtobit (IniDeData, TempInput);

    stringtobit (DESKey, TempKey);

    decry (TempInput, TempKey, TempOutput);

    bittostring (TempOutput, DESDeData);}

    void CKeyDllApp::DESEncrypt() //加密函數(shù),可完成

    對(duì)8位隨機(jī)數(shù)的加密功能,然后可與原隨機(jī)數(shù)比較,看是否相等

    {

    WORD TempInput[64], TempOutput[64],TempKey[64];

    stringtobit (IniEnData, TempInput);

    stringtobit (DESKey, TempKey);

    encry (TempInput, TempKey, TempOutput);

    bittostring (TempOutput, DESEnData);}

    int* CKeyDllApp::DecryptData(BYTE InputDeNum[8])//導(dǎo)出的獲取解密數(shù)據(jù)的函數(shù)。此函數(shù)需要賦值――已加密了的8位隨機(jī)數(shù),并進(jìn)行解密,最終函數(shù)值為解密后的



    評(píng)論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 临颍县| 尼玛县| 阿坝| 抚州市| 滦南县| 阿拉善盟| 彭阳县| 滕州市| 堆龙德庆县| 林甸县| 措美县| 利津县| 社旗县| 长沙市| 隆昌县| 纳雍县| 清水县| 瑞安市| 澄城县| 无极县| 嘉祥县| 沁水县| 辽阳县| 肇东市| 婺源县| 石泉县| 廉江市| 田林县| 苏尼特右旗| 抚宁县| 邯郸县| 福贡县| 冕宁县| 寿宁县| 伊通| 托克逊县| 荥经县| 搜索| 达拉特旗| 黄梅县| 湖南省|