• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Jiang's C++ Space

            創作,也是一種學習的過程。

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::

            我們日常工作中經常要對一些東西進行加密,可選的加密方法當然很多了,Windows都自帶了加密庫,但密碼學方面的東西實在令我頭大,可能因為我從小學開始數學一直沒學好的緣故,而我仔細考慮之后發覺:我們對信息加密,不一定是出自于什么“top security”的原因,大多可能僅僅是不想讓用戶看到具體的文件的結構或保護一些個人隱私信息,也就是說對安全的要求一般,沒必要引入太過重量級的東西,最好是非常快捷、高效和輕量的。那本文提供了一種方法,能讓你的信息看起來被很好地加過密了,并且你根本不需要去研究什么密碼學,也不需要引入什么龐大的Lib,因為代碼就那么幾行。

            寫這個程序的時候其實我是想要這么一種加密方法:假如明文只有一個字節,那加密出來的密文應該也只有一個字節。而實際上別人實現好的AES算法加密出來的密文通常都要帶上一串隨機數,不太符合我的要求。

            沒有什么include,沒有什么LIB,更沒有什么DLL,代碼再簡單不過,但我保證它很有效,OK,不多說了,看代碼:

            #include "String.h"

            //加密和解密,其實這兩個函數完全相同的,簡單起見嘛,另外我居然允許密碼為空,也是簡單起見
            void JiangEncode(unsigned char *pBuff, int iBuffLen, char *pKey=NULL, int iKeyLen=0);
            void JiangDecode(unsigned char *pBuff, int iBuffLen, char *pKey=NULL, int iKeyLen=0);

            //這個main函數是用來測試的
            #define TEST_LEN 100
            int main(int argc, char* argv[])
            {
             unsigned 
            char totest[TEST_LEN];
             memcpy(totest, 
            "012345678901234567890123456789012345678901234567890123456789\
            0123456789012345678901234567890123456789", 100);

             JiangEncode(totest, TEST_LEN, 
            "J~xye"6);

             
            int i;
             
            for(i=0; i<TEST_LEN; i++)
             {
              
            if((i%10)==0)
               printf(
            "\n");
              printf(
            "%d ", totest[i]);
             }

             printf(
            "\n");

             JiangDecode(totest, TEST_LEN, 
            "J~xye"6);

             
            for(i=0; i<TEST_LEN; i++)
             {
              
            if((i%10)==0)
               printf(
            "\n");
              printf(
            "%d ", totest[i]);
             }

             
            return 0;
            }

            //交換兩個BYTE
            void Swap2Byte(unsigned char* v1, unsigned char* v2)
            {
             
            *v1 ^= *v2;
             
            *v2 ^= *v1;
             
            *v1 ^= *v2;
            }

            void GetMyCypher(const char* pKey, int iKeyLen, unsigned char* pMyCypher)
            {
             
            //原始加密索引
             const unsigned char cypherOrg[256=
             {
              
            1351517518525526461141501612481953
              
            95225567221611514916424726103034102170
              
            229529222855892353810619021711214417123049
              
            8324541220606820479209104184211110178205
              
            7621210316922459772159816624182440120136
              
            13115818520810718922012712915217920673219118154
              
            1811968724916488024011293910518721497163
              
            2542543125135146173236471131471742333296160
              
            251225878210109183194932315086250216365
              
            195942266171201641929123744116156191218117
              
            15918621310017223942126130157188223122142137128
              
            1551821938823235101175234371111772006719784
              
            25231339916524479274511915317620370202
              
            692077422212113913414516822762661988124314
              
            185490238411231411401431381331481672421323
              
            57752211241321511622532836108180199822461
             };

             memcpy(pMyCypher, cypherOrg, 
            256);

             
            //根據密碼調整加密索引
             int i, j;
             
            for(i=0; i<iKeyLen; i++)
             {
              
            for(j=0; j<256; j++)
              {
               
            int iSwitchIndex = (pMyCypher[j] * pKey[i])%255;
               
            if(iSwitchIndex!=j)
                Swap2Byte(
            &(pMyCypher[j]), &(pMyCypher[iSwitchIndex]));
              }
             }
            }

            void JiangCode(unsigned char* pBuff, int iBuffLen, char* pKey, int iKeyLen)
            {
             unsigned 
            char cypher[256];
             GetMyCypher(pKey, iKeyLen, cypher);
             
            int iIndex=0;
             
            while (iIndex<iBuffLen)
             {
              
            //其實……也就一個異或操作,所以加密和解密的過程完全一樣
              pBuff[iIndex] ^= cypher[iIndex%256];
              
            ++iIndex;
             }
            }

            void JiangEncode(unsigned char* pBuff, int iBuffLen, char* pKey, int iKeyLen)
            {
             JiangCode(pBuff, iBuffLen, pKey, iKeyLen);
            }

            void JiangDecode(unsigned char* pBuff, int iBuffLen, char* pKey, int iKeyLen)
            {
             JiangCode(pBuff, iBuffLen, pKey, iKeyLen);
            }

            寫完了,運行結果是如下:

            241 206 235 249 4 160 190 73 253 196
            160 238 105 243 18 190 10 97 26 66
            182 218 99 73 40 204 208 123 196 46
            76 208 117 159 38 66 234 117 142 52
            66 63 135 193 60 49 228 15 12 58
            131 252 1 171 96 72 254 198 171 201
            110 242 27 189 199 108 136 12 177 215
            88 66 156 183 221 142 27 45 61 221
            122 158 39 174 123 112 156 241 77 227
            112 148 57 67 225 30 47 49 83 94

            48 49 50 51 52 53 54 55 56 57
            48 49 50 51 52 53 54 55 56 57
            48 49 50 51 52 53 54 55 56 57
            48 49 50 51 52 53 54 55 56 57
            48 49 50 51 52 53 54 55 56 57
            48 49 50 51 52 53 54 55 56 57
            48 49 50 51 52 53 54 55 56 57
            48 49 50 51 52 53 54 55 56 57
            48 49 50 51 52 53 54 55 56 57
            48 49 50 51 52 53 54 55 56 57 Press any key to continue

            上面這段是密文,看起來是不是完全沒有原文的樣子了?你試試看把TEST_LEN改為1,只加密一個字節看,這也是允許的,代碼純C,移植性很好,拿去別處用也方便。但對安全性要求高的應用可能不能使用這種方法了,至于怎么樣才算安全,我也不知道,密碼學方面的東西我最害怕了。

            posted on 2009-09-29 10:34 Jiang Guogang 閱讀(1478) 評論(0)  編輯 收藏 引用 所屬分類: Windows Programming
            久久久www免费人成精品| 日本久久中文字幕| 久久国产精品成人影院| 久久综合给合久久狠狠狠97色69| 精品国产乱码久久久久久人妻| 精品国产青草久久久久福利| 久久这里只有精品18| 成人午夜精品久久久久久久小说| 久久久久久久综合综合狠狠| 中文字幕久久精品| 久久久久女人精品毛片| 久久国产高清一区二区三区| 国内精品人妻无码久久久影院导航| 久久精品国产亚洲AV嫖农村妇女| 亚洲国产精品一区二区久久| 久久亚洲精品国产精品婷婷| 国产麻豆精品久久一二三| 久久久久久国产a免费观看黄色大片 | 久久强奷乱码老熟女网站| 久久国产高潮流白浆免费观看| 青青草原综合久久大伊人导航 | 久久国产成人精品国产成人亚洲| 人妻少妇久久中文字幕一区二区 | 久久99精品久久只有精品| 国产精品中文久久久久久久| 中文字幕亚洲综合久久| 国产亚洲精久久久久久无码| 狠狠色丁香久久婷婷综合_中| 精品久久久久久无码人妻蜜桃| 99久久精品国产高清一区二区 | 精品乱码久久久久久久| 久久精品人人做人人爽电影| 中文字幕无码久久人妻| 久久一区二区三区免费| 久久se精品一区精品二区国产 | 国产精品岛国久久久久| 中文字幕久久久久人妻| 亚洲女久久久噜噜噜熟女| 亚洲人成伊人成综合网久久久| 久久99九九国产免费看小说| 精品无码久久久久国产动漫3d|