Wayne
          井底的蛙--一直仰望著天空
          posts - 16,comments - 6,trackbacks - 0

          互聯網的軟件設計一定少不了加密算法,并且大量使用的都會是對稱加密,比較常見的對稱加密有:DES、3DES、RC4、AES等等;

          加密算法都有幾個共同的要點:

          1. 密鑰長度;(關系到密鑰的強度)
          2. 加密模式;(ecb、cbc等等)
          3. 塊加密算法里的填充方式區分;

          對于加密模式,很多同學還不清楚,比如DES,也會有ECB、CBC等不同的區分,它們都是標準的;

                Windows加密庫中,默認則是CBC模式,也可以手工設置;

                 Openssl庫要更明顯一點,它的函數名里面就寫明了,比如:DES_ncbc_encrypt,一看就知道是cbc模式;

                 JAVA里面也比較清楚:Cipher c = Cipher.getInstance(”DES/CBC/PKCS5Padding”); 也可以看到是CBC模式

          各種加密模式有什么不同呢:(為了方便,這里的加密key都取64位)

          電子密碼本模式ECB:

          最古老,最簡單的模式,將加密的數據分成若干組,每組的大小跟加密密鑰長度相同

          然后每組都用相同的密鑰加密, 比如DES算法, 如果最后一個分組長度不夠64位,要補齊64位;

          定義:

                    Enc(X,Y)是加密函數

                    Dec(X,Y)是解密函數

                    Key是加密密鑰;

                    Pi ( i = 0,1…n)是明文塊,大小為64bit;

                    Ci ( i = 0,1…n)是密文塊,大小為64bit;

          ECB加密算法可表示為:

                     Ci = Enc(Key, Pi)

          ECB解密算法可以表示為:

                    Pi = Dec(Key,Ci)

               算法 特點:

          • 每次Key、明文、密文的長度都必須是64位;
          • 數據塊重復排序不需要檢測;
          • 相同的明文塊(使用相同的密鑰)產生相同的密文塊,容易遭受字典攻擊
          • 一個錯誤僅僅會對一個密文塊產生影響;

          加密塊鏈模式CBC:

               與ECB模式最大的不同是加入了初始向量

               定義:

                     Enc(X,Y)是加密函數

                     Dec(X,Y)是解密函數

                     Key是加密密鑰;

                     Pi ( i = 0,1…n)是明文塊,大小為64bit;

                     Ci ( i = 0,1…n)是密文塊,大小為64bit;

                     XOR(X,Y)是異或運算;

                     IV是初始向量(一般為64位);

              ECB加密算法可表示為:

                    C0 = Enc(Key, XOR(IV, P0)

                      Ci = Enc(Key, XOR(Ci-1, Pi)

              ECB解密算法可以表示為:

                     P0 = XOR(IV, Dec(Key, C0))

                      Pi = XOR(Ci-1, Dec(Key,Ci))

          算法特點:

          • 每次加密的密文長度為64位(8個字節);
          • 當相同的明文使用相同的密鑰和初始向量的時候CBC模式總是產生相同的密文;
          • 密文塊要依賴以前的操作結果,所以,密文塊不能進行重新排列;
          • 可以使用不同的初始化向量來避免相同的明文產生相同的密文,一定程度上抵抗字典攻擊;
          • 一個錯誤發生以后,當前和以后的密文都會被影響;

          加密反饋模式CFB:

          加密反饋模式克服了需要等待8個字節才能加密的缺點,它采用了分組密碼作為流密碼的密鑰流生成器;

               定義:

                     Enc(X,Y)是加密函數

                     Dec(X,Y)是解密函數

                    Key是加密密鑰;

                     Pi ( i = 0,1…n)是明文塊,大小為64bit;

                     Ci ( i = 0,1…n)是密文塊,大小為64bit;

                      Si ( i = 0,1…n),大小為8bit,n個連續的Si組成加密位移寄存器,一般n=8;

                     Oi = Enc(Key, Si);

                     Lef(x) 為取數據x的最左8個bit位;

                     A(x,y)為合并x左移8位,空位用y填充

               CFB加密算法可表示為:

                     S0 = IV;

                     Oi = Enc(Key, Si);

                      Ci = XOR( Ci, Lef(Oi));

                     Si = A(Si-1, Ci);

               CFB解密算法可表示為:

                     S0 = IV;

                     Oi = Enc(Key, Si);

                     Ci = XOR( Ci, Lef(Oi));

                     Si = A(Si-1, Ci);

               圖示:

                  

              特點:

          • 每次加密的Pi和Ci不大于64位;
          • 加密算法和解密算法相同,不能適用于公鑰算法;
          • 使用相同的密鑰和初始向量的時候,相同明文使用CFB模式加密輸出相同的密文;
          • 可以使用不同的初始化變量使相同的明文產生不同的密文,防止字典攻擊;
          • 加密強度依賴于密鑰長度;
          • 加密塊長度過小時,會增加循環的數量,導致開銷增加;
          • 加密塊長度應時8位的整數倍(即字節為單位);
          • 一旦某位數據出錯,會影響目前和其后8個塊的數據;

          輸出反饋模式OFB:

          與CFB模式不同之處在于, 加密位移寄存器與密文無關了,僅與加密key和加密算法有關;

          做法是不再把密文輸入到加密移位寄存器,而是把輸出的分組密文(Oi)輸入到一位寄存器;

               定義:

                     Enc(X,Y)是加密函數

                     Dec(X,Y)是解密函數

                     Key是加密密鑰;

                     Pi ( i = 0,1…n)是明文塊,大小為64bit;

                     Ci ( i = 0,1…n)是密文塊,大小為64bit;

                     Si ( i = 0,1…n),大小為8bit,n個連續的Si組成加密位移寄存器,一般n=8;

                     Oi = Enc(Key, Si);

                     Lef(x) 為取數據x的最左8個bit位;

                     A(x,y)為合并x左移8位,空位用y填充

              CFB加密算法可表示為:

                     S0 = IV;

                     Oi = Enc(Key, Si);

                     Ci = XOR( Ci, Lef(Oi));

                     Si = A(Si-1, Oi);          注意這里與CFB模式的不同

              CFB解密算法可表示為:

                     S0 = IV;

                     Oi = Enc(Key, Si);

                     Ci = XOR( Ci, Lef(Oi));

                     Si = A(Si-1, Oi);

              特點:

          • 與CFB類似,以下都是不同之處;
          • 因為密文沒有參與鏈操作,所以使得OFB模式更容易受到攻擊
          • 不會進行錯誤傳播,某位密文發生錯誤,只會影響該位對應的明文,而不會影響別的位;
          • 不是自同步的,如果加密和解密兩個操作失去同步,那么系統需要重新初始化;
          • 每次重新同步時,應使用不同的初始向量。可以避免產生相同的比特流,避免”已知明文”攻擊 ;

          Windows API進行加密參數設置:

               CryptGetKeyParam可以對HCRYPTKEY對象的各種參數進行查詢,包括加密模式、padding方式等;但這個函數不能用于查詢加密key的明文;

               但如果需要看到真正加密的key是什么,則需要另外的API:CryptExportKey,選擇PLAINTEXTKEYBLOB方式進行導出可以得到key的明文;

          使用加密要注意的地方:

              當兩個封裝好的加密算法對8byte數據進行DES加密時,如果加密出來的結果是一樣的,千萬不要認為這兩個算法可以互換

               因為ECB模式,和向量全為0的CBC模式得到的密文前8byte,確實是一樣,但后面的密文就不一樣了;

          使用加密以前確定你理解了它;

          互聯網程序中加密模式的使用:

               ECB是不推薦的方式,Key相同時,相同的明文在不同的時候產生相同的明文,容易遭到字典攻擊;

               CBC由于加入了向量參數,一定程度上抵御了字典工具,但缺點也隨之而來,一旦中間一個數據出錯或丟失,后面的數據將受到影響;

               CFB與CBC類似,好處是明文和密文不用是8bit的整數倍,中間一個數據出錯,只影響后面的幾個塊的數據;

               OFB比CFB方式,一旦一個數據出錯,不會影響后面的數據,但安全性降低;

               因此,推薦使用CFB方式,但每個數據包單獨加密,否則一個數據包丟失,需要做很多容錯處理;

               當然,具體問題也要具體分析,對于只需要”特定安全性”①,不需要”計算安全性”以上的軟件,也可以使用ECB模式;


          posted on 2011-05-23 22:04 waynewan 閱讀(21975) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 恩施市| 溆浦县| 岑巩县| 探索| 海原县| 宾阳县| 玉环县| 宁乡县| 微博| 靖安县| 嘉禾县| 太保市| 枞阳县| 繁峙县| 南陵县| 集安市| 斗六市| 鹤庆县| 深州市| 白沙| 桂阳县| 南安市| 于田县| 阳山县| 淮阳县| 乌拉特中旗| 长治县| 呈贡县| 洪泽县| 榆中县| 来安县| 古蔺县| 日喀则市| 铜陵市| 南安市| 安阳县| 鹤庆县| 凤庆县| 吐鲁番市| 阿尔山市| 榆林市|