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

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

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

    由于DES不再安全,現(xiàn)在都流行使用AES加密算法替代DES,Rijndael是AES的實(shí)現(xiàn)。

    我從網(wǎng)上找到了很多Rijndael的java實(shí)現(xiàn)代碼,我用了其中的一個(gè),并且寫了一個(gè)工具類,使得更方便使用它。

    http://www.cnblogs.com/Files/jobs/Rijndael.rar

    Rijndael_Util.java是我寫的,使用方法如下:

    import mit.Rijndael.Rijndael_Util;

    String strKey 
    = "欲練神功揮刀子宮";
    String plainText 
    = "葵花寶典";

    String cipherText 
    = Rijndael_Util.encode(strKey, plainText);
    System.
    out.println(cipherText);
    System.
    out.println(Rijndael_Util.decode(strKey, plainText);


     由于Rijindael的算法要求每次加密的數(shù)據(jù)必須是一個(gè)block,blockSize可以是16、24或者32。因此,當(dāng)需要加密一個(gè)byte數(shù)組paintBytes時(shí),如果byte數(shù)組plainBytes的長(zhǎng)度不為blockSize的倍數(shù),則需要補(bǔ)位。此時(shí),就需要一個(gè)數(shù)值來(lái)保留明文byte數(shù)組的長(zhǎng)度。最初我是用四個(gè)byte來(lái)保存plainBytes的長(zhǎng)度,然后直接放在密文byte數(shù)組cipherBytes的最前面。但是我考慮到把直接把明文的長(zhǎng)度暴露出來(lái),不是很好,于是,就做了一個(gè)處理。

    當(dāng)blockSize為16或者24時(shí),而且plainBytes的長(zhǎng)度不為blockSize的倍數(shù),最后一個(gè)block的blockSize使用一個(gè)長(zhǎng)度為blckSize+8的byte數(shù)組lastBlockBytes來(lái)保存,這樣,最后一個(gè)block的長(zhǎng)度就比普通的block長(zhǎng)8個(gè)byte,這個(gè)8個(gè)byte的前4位用來(lái)保存plainBytes的長(zhǎng)度。

    當(dāng)blockSize為32時(shí),則最后一個(gè)block拆為兩個(gè)block,一個(gè)block的長(zhǎng)度為16,一個(gè)block的長(zhǎng)度為24,這樣一來(lái),又有多余的8位來(lái)保存plainBytes的長(zhǎng)度了。
    把int變?yōu)樗膫€(gè)byte和把四個(gè)byte讀回一個(gè)int的實(shí)現(xiàn)如下:

    public final static void putInt(int val, byte[] bytes, int offSet) {
        bytes[offSet] 
    = (byte) (val >> 24);
        bytes[offSet 
    + 1= (byte) (val >> 16);
        bytes[offSet 
    + 2= (byte) (val >> 8);
        bytes[offSet 
    + 3= (byte) val;
    }

     

    public final static int getInt(byte[] bytes, int offSet) {
        
    return ((bytes[offSet + 0& 0xff<< 24
                
    | ((bytes[offSet + 1]) << 16)
                
    | ((bytes[offSet + 2& 0xff<< 8)
                
    | ((bytes[offSet + 3& 0xff<< 0);
    }

    .NET的朋友注意,java中的byte是帶符號(hào),而c#中的byte是無(wú)符號(hào)的。

    以前,由于很少寫低級(jí)的代碼,所以對(duì)位運(yùn)算不夠熟悉,最初是,把一個(gè)int拆成4個(gè)byte的算法自己寫,但是覺得不夠好,后來(lái)和flier_lu交流后,flier_lu建議我看java.nio中的ByteBuffer的實(shí)現(xiàn),可能會(huì)有收獲。我查看后java.nio.Bytes類后,發(fā)現(xiàn)了java.nio.Bits的實(shí)現(xiàn)比我做的更好一些。java.nio.Bits是一個(gè)內(nèi)部類,不是public,我們不能調(diào)用它,但是可以參考他的源碼實(shí)現(xiàn)。

    在這個(gè)過(guò)程中,我和以往的感覺一樣,一個(gè)基礎(chǔ)類庫(kù),開放源碼對(duì)于使用者會(huì)有很大幫助。

    最近有人對(duì).NET的前途提出質(zhì)疑,有人說(shuō)到關(guān)鍵點(diǎn)上來(lái)了:.NET是一個(gè)相當(dāng)封閉的平臺(tái)。微軟對(duì)于公開基礎(chǔ)類庫(kù)的源碼,在走倒退的道路。以前微軟的基礎(chǔ)類庫(kù)MFC是可以查看源碼的,你甚至可以調(diào)試源碼,但是微軟提供.NET的基礎(chǔ)類庫(kù)而是不開放源代碼的,雖然你可以通過(guò)Reflectro或者M(jìn)ono了解一些基礎(chǔ)類庫(kù)的源碼,但這個(gè)不能夠確定你通過(guò)這些途徑得到的源碼和你正在使用的是一致的。

    從.NET轉(zhuǎn)向Java快兩年了,越來(lái)越對(duì)Java的前途充滿希望,也很多人一樣,對(duì)微軟的.NET越來(lái)越失望。


    文章來(lái)源:http://www.cnblogs.com/jobs/archive/2005/03/20/122208.html
    posted on 2005-03-24 23:24 溫少的日志 閱讀(869) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
     
    主站蜘蛛池模板: 亚洲另类视频在线观看| 亚洲人成色7777在线观看| 亚洲成a人不卡在线观看| 无码午夜成人1000部免费视频| 亚洲日本va中文字幕久久| 一区二区三区免费电影| 久久久无码精品亚洲日韩软件| 一本久久A久久免费精品不卡 | 毛片大全免费观看| 亚洲黄色激情视频| 免费看a级黄色片| 色偷偷亚洲第一综合| 亚洲色偷偷狠狠综合网| 羞羞视频免费网站在线看| 亚洲精品无码精品mV在线观看| 日本一道本不卡免费 | 两个人看的www高清免费视频| 亚洲情XO亚洲色XO无码| 性无码免费一区二区三区在线| 久久精品国产亚洲av高清漫画| 特级做A爰片毛片免费69| 亚洲国产精品嫩草影院| 内射无码专区久久亚洲| 99在线免费观看| 精品无码一区二区三区亚洲桃色| 国产人成免费视频网站| 亚洲AV成人无码网天堂| 亚洲中文字幕无码永久在线| 免费国产99久久久香蕉| 亚洲香蕉久久一区二区| 免费在线观看亚洲| 可以免费观看的毛片| 亚洲资源最新版在线观看| 亚洲国产专区一区| 少妇太爽了在线观看免费视频| 亚洲自偷自偷在线成人网站传媒| www亚洲一级视频com| 免费女人高潮流视频在线观看| 亚洲精品无码成人片久久不卡| 免费a级毛片无码av| 最近免费mv在线电影|