<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)航:
     
     
    主站蜘蛛池模板: yy6080亚洲一级理论| 亚洲成人午夜在线| 毛片在线全部免费观看| 亚洲成人网在线观看| 嫩草影院免费观看| 久久av免费天堂小草播放| 亚洲精品美女久久久久| 又粗又硬又大又爽免费视频播放| 国产一二三四区乱码免费| 久久精品国产亚洲av麻豆图片 | 中文字幕亚洲男人的天堂网络| 国产伦精品一区二区三区免费迷| 大地影院MV在线观看视频免费| 亚洲国产乱码最新视频| 亚洲精品无码久久久久| 97人伦色伦成人免费视频| 全黄大全大色全免费大片| 亚洲中文字幕乱码一区| 亚洲国产成人片在线观看无码| 免费理论片51人人看电影| 99在线视频免费| 一级毛片在线完整免费观看| 亚洲最大的黄色网| 亚洲成A∨人片在线观看不卡| 国产高清在线免费视频| 美丽的姑娘免费观看在线播放 | 女人被弄到高潮的免费视频 | 日本一卡精品视频免费| 日日摸日日碰夜夜爽亚洲| 亚洲精品视频在线免费| 国产自偷亚洲精品页65页| 日韩在线a视频免费播放| 18禁黄网站禁片免费观看不卡 | 免费一看一级毛片全播放| 国产92成人精品视频免费| 中国内地毛片免费高清| 黄页网站在线观看免费| 亚洲日韩精品国产一区二区三区| 亚洲精品美女视频| 亚洲AV福利天堂一区二区三| 亚洲人精品午夜射精日韩|