• 彩神彩票

    身份認證技術的產業發展

            在使用硬件加密時,加密的強度主要依靠兩個方麵:一是加密鎖本身的設計結構,二是開發商使用加密鎖的技巧。在使用同一種加密鎖時,軟件的加密強度可能有很大的差別,因為很多開發商不是很熟悉加密鎖的使用方式,沒有充分利用加密鎖提供的加密方式,給破解者留下了漏洞。在應用加密鎖開發時加密的強度可以從兩個途徑提高:一是增加破解的工作量,二是增加加密點的複雜度。

            一、增加工作量的基本技巧:

            1、增加加密點的數量,在程序的多個位置,多次檢驗加密鎖的存在,存取數據,破解者必須識別並修改每個加密點,隻要有漏掉的加密點,程序就不能正常執行。

            2、增加複雜的循環或死循環等耗時操作,讓破解者難以跟蹤程序的執行。例如:

    例1.1

    RetCode = RY2_Find();
    //加入多條語句,可以是與操作狗有關的,或者其他複雜的語
    //句結構。
    //後麵的例子如無特別說明,此標記都代表這個意思
    //如果沒有找到鎖,則進入死循環
    while(RetCode<=0){
        int j = abs(random()/10);
        RetCode = RecCode-j;
    }

            3、提高效驗和讀寫加密鎖的隨機性,使破解者難以理解程序的結構和執行規律。隨機性是加密的重要思想,合理應用應用隨機性還可以增加程序的複雜度,有效對抗分析軟件和加密鎖模擬器。例如

    例1.2

    int j = abs(random()/100);
    if(j%17==0){
        RetCode = RY2_Find();
        if(RetCode==0){
            //未找到鎖,出錯處理
        }else{
            RetCode = RY2_Open(...);//打開指定UID的加密鎖
            if(RetCode==0){} //打開失敗,出錯處理
        }
    }

            二、增加加密點的複雜度的基本方法是增加迷惑語句,並根據加密鎖本身的特點使用一些編程技巧,迷惑就是增加破解者找到加密點的難度,使程序難於理解。常見的有一下幾種方式:

            1、不顯示出錯提示信息:這個技巧很重要,盡可能少地給用戶提示信息,因為這些蛛絲馬跡都可能導致解密者直接深入到保護的核心。比如,當檢測到破解企圖之後,不要立即給用戶提示信息,而是在係統的某個地方做一個記號,隨機地過一段時間後使軟件停止工作,或者裝作正常工作但實際上卻在所處理的數據中加入了一些垃圾。例如可以改寫上麵的示例中 if(RetCode==0){} //未找到鎖,出錯處理 這句:

    例2.1

    int flag = 1;
    //此部分同例1.2
    if(RetCode==0) {//未找到鎖,出錯處理
        Flag--
    }
    //此部分同例1.2
    if(flag==0){
        //這裏可以采用三種處理方法
        1.普通的:未找到加密鎖,退出程序
        2.迷惑性處理:啟動定時器,過一定的時間後結束程序
        3.迷惑性處理:破壞掉鎖內的數據,繼續運行程序。
    }

            2、加入複雜的循環和死循環,讓破解者難以跟蹤,發現加密點。這個方法與例1.1類似:

    例2.2

    for ( ;; ){
        int j = random() %1000;
        if(j%917==0){
            RetCode = RY2_Find();
            if(RetCode == 0){
            }else{ }
        }}

            3、隨機的讀寫和效驗加密鎖,在隨機的位置讀寫。這條技巧前麵已經多次應用,下麵舉例說說隨機位置的讀和寫:

    例2.2

    int i = abs(random()/5);
    char buffer[512];
    retcode = RY2_Write(handle, 0, buffer);//隨機寫人到某一塊
    retcode = RY2_Read(handle,0, buffer);//讀出剛才寫入的那一塊

            4、把操作加密鎖和最終判斷程序執行是否合法的語句分開。這個技巧前麵的例子裏麵都用到了,就是不要在得到操作加密鎖的狀態後立即判斷狀態是否正常,而是在操作和判斷之間加入一定的代碼。

            5、加入無用的讀寫,效驗鎖的語句或其他無效代碼。

            6、在加密鎖內寫入讀出無效數據。當然不要應用真的應用這些數據。2.4、2.5、2.6常結合使用。

            三、下麵結合rockey2的特點說說綜合的編程技巧。

            1、使用加密鎖傳遞變量,把加密鎖內的存儲區當作臨時變量,變量需要賦值時,向鎖內寫入數據,需要應用變量的值時讀取加密鎖。

            a.傳遞局部或全局變量舉例

    例3.1

    void func(){
        int i;//這個變量的值將被寫入加密鎖,
        //鎖內值的更改和使用代替了變量i本身
        char buffer[512];
        memcpy(buffer,&i,sizeof(i))
        retcode = RY2_Write(handle, 0, buffer);
        while(...){
            if(...){
                int j
                retcode = RY2_Read(handle, 0, buffer);
                memcpy(&j,buffer,sizeof(i));//原來需要用變量i的現在改用臨時變量j,
                //j的值是從加密鎖內讀出來的
                retcode = RY2_Write(handle, 0, buffer);
                //原來把變量j的當前值寫入加密鎖,
                //相當於變量i的值發生了變化
            }
        }
    }

            b. 傳遞函數的參數:

    例3.2

    普通的編程思路:
    Func1(int i){}
    Func2(){
        int j;
        Func1(j)
    }
    改寫為應用加密鎖的方式:
    Func1(){
        int j;
        retcode = RY2_Read(handle, 0, buffer);
        memcpy(&j,buffer,sizeof(int));//這個過程相當於參數傳遞
    }
    Func2(){
        char buffer[512];
        int i;//這個是要傳遞的參數,
        memcpy(buffer,&i,sizeof(i))
        retcode = RY2_Write(handle, 0, buffer);
        Func1();}

            2、把需要保存在磁盤上的數據全部或部分保存到加密鎖內.Rockey2提供了多達2560字節的存儲空間,可以把本來需要保存在磁盤上的重要的數據保存在加密鎖內,比如程序的配置信息,上次運行時得到的下次需要應用的數據等等

            3、 使用多線程技術。利用多線程調試的複雜性可以有效迷惑破解者和破解軟件。可在一個線程中尋找加密鎖,隨機讀寫數據,在另外的線程中應用這些信息。多線程技術也是加密鎖應用的重要技巧。

    彩神彩票