<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 104,  comments - 34,  trackbacks - 0

    一.前言

         在平時運用中,往往會遇到不同語言之間的通訊,比如php中實現一種加密傳輸算法,需要用Java進行解碼,這時就要保持不同語言加密解密的一致性,才能正常通信。本文就通過Java實現php中mcrypt進行des加密相同的效果。其中引入了不太被人關注的“初始化向量”,并對主要代碼進行了注釋。

    二.Java代碼

    /**

     * 用java完成DES對稱加密

     * BlowFish 算法用來加密 64Bit 長度的字符串

     * 用 BlowFish 算法加密信息,需要兩個過程:

     * 1.密鑰預處理

     * 2.信息加密

     *

     * by tester 2010-11-04

     */

    public class BlowfishTest {

           // 密鑰

           public static final String ENCRYPT_KEY = "WkoxWT0kJik=";

           // 初始化向量

           public static final String INITIALIZATION_VECTOR = "cnBHdE9F";

           // 轉換模式

           public static final String TRANSFORMATION = "Blowfish/CBC/PKCS5Padding";

           // 密鑰算法名稱

           public static final String BLOWFISH = "Blowfish";

           /**

            * 加密

            *

            * @param key

            *            密鑰

            * @param text

            *           加密文本

            * @param initializationVector

            *           初始化向量

            */

           public static String encrypt(String key, String text, String initializationVector)

                throws Exception {

                  // 根據給定的字節數組構造一個密鑰  Blowfish-與給定的密鑰內容相關聯的密鑰算法的名稱

                  SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), BLOWFISH);

                  // 使用 initializationVector 中的字節作為 IV 來構造一個 IvParameterSpec 對象

                  AlgorithmParameterSpec iv = new IvParameterSpec(initializationVector.getBytes());

                  // 返回實現指定轉換的 Cipher 對象

                  Cipher cipher = Cipher.getInstance(TRANSFORMATION);

                  // 用密鑰和隨機源初始化此 Cipher

                  cipher.init(Cipher.ENCRYPT_MODE, sksSpec, iv);

                  // 加密文本

                  byte[] encrypted = cipher.doFinal(text.getBytes());

                  return new String(Hex.encodeHex(encrypted));

           }

           /**

            * 解密

            *

            * @param key

            *            密鑰

            * @param text

            *           加密文本

            * @param initializationVector

            *           初始化向量

            */

           public static String decrypt(String key, String text, String initializationVector)

                throws Exception {

                  byte[] encrypted = null;

                  try{

                         encrypted = Hex.decodeHex(text.toCharArray());

                  } catch (Exception e)

                  {

                         e.printStackTrace();

                  }

                  SecretKeySpec skeSpect = new SecretKeySpec(key.getBytes(), BLOWFISH);

                  AlgorithmParameterSpec iv = new IvParameterSpec(initializationVector.getBytes());

                  Cipher cipher = Cipher.getInstance(TRANSFORMATION);

                  cipher.init(Cipher.DECRYPT_MODE, skeSpect, iv);

                  byte[] decrypted = cipher.doFinal(encrypted);

                  return new String(decrypted);

           }

           /**

            * Base64字符解碼

            *

            * @param base64String

            *            -- 被解碼字符

            * @return 解碼后字符

            */

           public static String base64Decoder(String base64String) {

                  if(StringUtils.isEmpty(base64String))

                  {

                         return base64String;

                  }

                  else

                  {

                         return new String(Base64.decodeBase64(base64String));

                  }   

           }

           /**

            * Base64字符編碼

            *

            * @param sourceString

            *            -- 字符

            * @return 編碼后字符

            */

           public static String base64Encoder(String sourceString) {

                  if(StringUtils.isEmpty(sourceString))

                  {

                         return sourceString;

                  }

                  else

                  {

                         return Base64.encodeBase64String(sourceString.getBytes());

                  } 

           }

           /**

            * @param 測試方法

            */

           public static void main(String[] args) {

                  // TODO Auto-generated method stub

                  try {

                         String encryptStr = base64Encoder(encrypt(ENCRYPT_KEY, " tester ", INITIALIZATION_VECTOR));

                         System.out.print("tester加密后得到:" + encryptStr +""n");

                         String decryptStr = decrypt(ENCRYPT_KEY, base64Decoder(encryptStr), INITIALIZATION_VECTOR);

                         System.out.print(encryptStr+"解密后得到:"+decryptStr);

                  } catch (Exception e) {

                         // TODO Auto-generated catch block

                         e.printStackTrace();

                  }

           }

    }

    實行結果:

    tester加密后得到:MzA2YThlZDFlNjI2MmYwYTc2Y2VlZTc5M2ZjMDQ0YjI=

    MzA2YThlZDFlNjI2MmYwYTc2Y2VlZTc5M2ZjMDQ0YjI=解密后得到:tester

    三.其他語言同類實現方法介紹

    Php:   string mcrypt_cbc ( int $cipher , string $key , string $data , int $mode [, string $iv ] )

    C#:    CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)

    四.DES加密算法介紹

     DES算法為密碼體制中的對稱密碼體制,又被成為美國數據加密標準,是1972年美國IBM公司研制的對稱密碼體制加密算法。其密鑰長度為56位,明文按64位進行分組,將分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法。

    五.基本原理

        入口參數有三個:key、data、mode。 key為加密解密使用的密鑰,data為加密解密的數據,mode為其工作模式。當模式為加密模式時,明文按照64位進行分組,形成明文組,key用于對數據加密,當模式為解密模式時,key用于對數據解密。實際運用中,密鑰只用到了64位中的56位,這樣才具有高的安全性。

      DES( Data Encryption Standard)算法,于1977年得到美國政府的正式許可,是一種用56位密鑰來加密64位數據的方法。雖然56位密鑰的DES算法已經風光不在,而且常有用Des加密的明文被破譯的報道,但是了解一下昔日美國的標準加密算法總是有益的,而且目前DES算法得到了廣泛的應用,在某些場合,仍然發揮著余熱。

    常見加密模式介紹:

    ECB(Electronic Code Book:電碼本)

     ECB是最簡單的模式,同樣的明文分組總是加密成相同的密文分組。這對于發送單一的塊數據來說是非常好的,如密鑰。但對執行一個加密的信息流來說不是很好,因為如果相同的明文多次發送以后,同樣的密文也會被多次發送。
    ECB最大的弱點是對每一個塊用相同的方式進行加密。如果我們的密鑰或者數據不斷發生變化,ECB是完全安全的。但是如果類似的塊經過同樣的密鑰加密發出以后,攻擊者可能獲得一些我們并不想讓別人知道的信息。

    CBC(Cipher Block Chaining:密碼分組鏈接)  
    CBC模式改變了加密方式,同樣的明文分組不一定加密或解密同樣的密文塊,因此解決了ECB存在的主要問題。CBC使用前一分組的信息加密當前分組。因此和ECB模式大不相同。這個方法依然存在問題,那就是相同的信息仍然加密成相同的密文,因為所有的分組是同時變成密文分組的。為了解決這個問題,我們引入一個Initialization Vector(初始化向量),也就是前不久有人問到的IV問題。IV僅僅是一個初始化加密程序的隨機數。它無需秘密保存,但隊每一個信息來說它都是不同的,通過這個方式,即使有兩條相同的信息,只要他們有不同的IV,那么他們加密后的密文也是不同的。從這個意義上來說,初始化向量無疑就和口令加密過程中使用的鹽值是一樣的。
    CBC很適合文本傳輸,但它每一次都需要傳送一個完整的數據塊,一般選8個字符。

    CFB(Cipher FeedBack:密碼反饋)  
    CFB的工作方式與CBC類似,但它可以執行更小的數據塊,典型的有8位,這非常適合加密像聊天對話這樣的信息,因為每次可以發送單一的字節數據塊。
    和CBC一樣,CFB也需要一個IV,且相同及鑰發送的每條信息的IV都必須是唯一的。

    OFB(Output FeedBack:輸出反饋)

     OFB除了在傳輸中能給數據提供更好的保護,防止數據丟失外,其他和CFB類似。密文中一位出錯,也只造成明文中的一位出錯,其他的方式會造成整個塊丟失。

    本文采用的是CBC(Cipher Block Chaining:密碼分組鏈接)的模式。

     

    結語:Ok,今天的學習就到這里,希望對大家有幫助。

    posted on 2011-04-28 19:52 末日風情 閱讀(2401) 評論(0)  編輯  收藏 所屬分類: java編程
    <2011年4月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕版免费电影网站| 羞羞的视频在线免费观看| 日本黄色动图免费在线观看| 亚洲精品乱码久久久久久不卡| 亚洲乱码无人区卡1卡2卡3| 成年女人男人免费视频播放| 亚洲午夜无码久久久久小说| 成熟女人特级毛片www免费| 亚洲色偷偷色噜噜狠狠99| 四虎在线免费播放| 国产成人精品亚洲| 亚洲天堂中文字幕在线| 国产性生大片免费观看性| 亚洲精品成人网站在线观看| 久久精品国产免费| 亚洲国产午夜电影在线入口| 久久不见久久见中文字幕免费| 亚洲一卡一卡二新区无人区| 国产成人免费手机在线观看视频| 免费人成再在线观看网站 | 亚洲男人av香蕉爽爽爽爽| 伊人久久国产免费观看视频| 亚洲精品国产字幕久久不卡| 色欲A∨无码蜜臀AV免费播| 亚洲国产精品久久丫| 日日操夜夜操免费视频| aaa毛片免费观看| 亚洲精品国产福利在线观看| 妞干网免费视频观看| 五月天婷婷精品免费视频| 亚洲春色在线视频| 在线免费视频一区| 国产久爱免费精品视频| 亚洲另类古典武侠| 亚洲精品岛国片在线观看| 一级毛片在线免费看| 鲁死你资源站亚洲av| 亚洲国产高清在线| 国产成人高清精品免费鸭子| 久久精品国产免费| 美女被免费网站在线视频免费|