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

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

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

    stone2083

    常見加密算法簡介

     本文介紹常見的算法(MD5/SHA,DSA,RSA,DES)的應用場景,以及在java上的使用方法.

    1)      MD5/SHA

    MessageDigest是一個數(shù)據(jù)的數(shù)字指紋.即對一個任意長度的數(shù)據(jù)進行計算,產(chǎn)生一個唯一指紋號.

    MessageDigest的特性:

    A)     兩個不同的數(shù)據(jù),難以生成相同的指紋號

    B)      對于指定的指紋號,難以逆向計算出原始數(shù)據(jù)

    代表:MD5/SHA

    Java實現(xiàn):

    MD5:

    MessageDigest md = MessageDigest.getInstance("MD5");

    md.update(Constant.DATA.getBytes());

    byte[] result = md.digest();


    SHA:

    MessageDigest md = MessageDigest.getInstance("SHA");

    md.update(Constant.DATA.getBytes());

    byte[] result = md.digest();


     

    2)    DES

    單密鑰算法,是信息的發(fā)送方采用密鑰A進行數(shù)據(jù)加密,信息的接收方采用同一個密鑰A進行數(shù)據(jù)解密.

    單密鑰算法是一個對稱算法.

    缺點:由于采用同一個密鑰進行加密解密,在多用戶的情況下,密鑰保管的安全性是一個問題.

    代表:DES

    Java實現(xiàn):

    首先,需要生成一個密鑰,這邊的做法,是把生成的密鑰,保存到某個文件中.

    KeyGenerator gen = KeyGenerator.getInstance("DES");
    Key key 
    = gen.generateKey();
    File keyFile 
    = new File(Constant.CRYPT_KEY_FILE);
    ObjectOutputStream out 
    = new ObjectOutputStream(new FileOutputStream(keyFile));
    out.writeObject(key);
    out.close();

    在生成key的時候,可以通過SecureRandom產(chǎn)生一個可信任的隨機數(shù)源

    KeyGenerator gen = KeyGenerator.getInstance("DES");
    gen.init(
    new SecureRandom(seed));
    Key key 
    = gen.generateKey();
     

    加密:

    Key key = gen.getKey(Constant.CRYPT_KEY_FILE);//從文件中得到密鑰
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.ENCRYPT_MODE, key); 
    //指定是加密模式
    cipher.update(Constant.DATA.getBytes());
    byte[] result = cipher.doFinal();

    解密:

    由于DES是一個對稱算法,所以解密代碼跟加密代碼幾乎一致

    key = gen.getKey(Constant.CRYPT_KEY_FILE);
    cipher.init(Cipher.DECRYPT_MODE, key); 
    //指定是解密模式
    cipher.update(result);
    byte[] data = cipher.doFinal();


    由于采用了同一個密鑰(key),所以兩端代碼中

    Constant.DATA.getBytes() data 的值是一致的.

    3)    DSA

    所謂數(shù)字簽名是指發(fā)送方從發(fā)送報文中抽取特征數(shù)據(jù)(稱為數(shù)字指紋或摘要),然后用發(fā)送方的私鑰對數(shù)字指紋使用加密算法進行算法操作,接受方使用發(fā)送方已經(jīng)公開的公鑰解密并驗證報文.

    數(shù)字簽名用戶驗證發(fā)送方身份或者發(fā)送方信息的完整性

    代表:DSA

    Java實現(xiàn):

    同樣,首先需要生成一個公鑰和私鑰,我們也把它保存到相應的文件中 

    KeyPairGenerator gen = KeyPairGenerator.getInstance(“DSA”);

    //以指定的長度初始化KeyPairGenerator對象,如果沒有初始化系統(tǒng)以1024長度默認設置

    //參數(shù):keysize 算法位長.其范圍必須在 512 到 1024 之間,且必須為 64 的倍數(shù)

    gen.initialize(
    1024);

    KeyPair pair 
    = gen.generateKeyPair();

    File pubkeyFile 
    = new File(Constant.PUB_KEY_FILE);

    File prikeyFile 
    = new File(Constant.PRI_KEY_FILE);

    ObjectOutputStream out 
    = new ObjectOutputStream(new FileOutputStream(pubkeyFile));

    out.writeObject(pair.getPublic());

    out.close();

    out 
    = new ObjectOutputStream(new FileOutputStream(prikeyFile));

    out.writeObject(pair.getPrivate());

    out.close();

     簽名:

    PrivateKey prikey = (PrivateKey) gen.getKey(Constant.PRI_KEY_FILE); //從文件得到私鑰

    // 用私鑰對數(shù)據(jù)簽名

    Signature signature 
    = Signature.getInstance("DSA");

    signature.initSign(prikey);

    signature.update(Constant.DATA.getBytes());

    byte[] bytes = signature.sign();

    把原始數(shù)據(jù)和簽名發(fā)送給接收方

    驗證:

    用公鑰對原始數(shù)據(jù)和簽名進行驗證

    PublicKey pubkey = (PublicKey) gen.getKey(Constant.PUB_KEY_FILE);//從文件得到公鑰

    Signature check 
    = Signature.getInstance("DSA");

    check.initVerify(pubkey);

    check.update(Constant.DATA.getBytes());

    //驗證數(shù)據(jù)的完整性

    if (check.verify(bytes)) {

    System.out.println(
    "OK");

    }
     else {

    System.out.println(
    "ERROR");

    }

    4)    RSA

    公鑰密碼體制:為了解決單密鑰保管安全性的問題,提供了公鑰密碼體制的概念.在公鑰體制中,加密密鑰不同于解密密鑰,加密密鑰公之于眾,誰都可以使用;解密密鑰只有解密人自己知道。它們分別稱為公開密鑰(Public key)和秘密密鑰(Private key)。

    代表:RSA

    Java實現(xiàn):

    同樣,需要生成公鑰和私鑰,并且保存到相應的文件中

    KeyPairGenerator gen = KeyPairGenerator.getInstance(“RSA”);

    //以指定的長度初始化KeyPairGenerator對象,如果沒有初始化系統(tǒng)以1024長度默認設置

    //參數(shù):keysize 算法位長.其范圍必須在 512 到 1024 之間,且必須為 64 的倍數(shù)

    gen.initialize(
    1024);

    KeyPair pair 
    = gen.generateKeyPair();

    File pubkeyFile 
    = new File(Constant.PUB_KEY_FILE);

    File prikeyFile 
    = new File(Constant.PRI_KEY_FILE);

    ObjectOutputStream out 
    = new ObjectOutputStream(new FileOutputStream(pubkeyFile));

    out.writeObject(pair.getPublic());

    out.close();

    out 
    = new ObjectOutputStream(new FileOutputStream(prikeyFile));

    out.writeObject(pair.getPrivate());

    out.close();

    加密:

    采用公鑰進行加密:

    PublicKey pubkey = (PublicKey) gen.getKey(Constant.PUB_KEY_FILE);//從文件中得到公鑰

    Cipher cipher 
    = Cipher.getInstance("RSA");

    cipher.init(Cipher.ENCRYPT_MODE, pubkey);
    //指定加密模式

    byte[] bytes = cipher.doFinal(Constant.DATA.getBytes());

     

    解密:

    采用私鑰進行解密:

    PrivateKey prikey = (PrivateKey) gen.getKey(Constant.PRI_KEY_FILE);//從文件中得到私鑰

    Cipher c 
    = Cipher.getInstance("RSA");

    c.init(Cipher.DECRYPT_MODE, prikey);
    //指定解密模式

    byte[] data = c.doFinal(bytes);

     

    兩段代碼中, Constant.DATA.getBytes()data的值是一致的.

    以上,對常見的算法,對了簡單的介紹.一般情況下,可以滿足我們日常的需求了.

    附件是中java實現(xiàn)代碼:

    java code

    posted on 2007-12-16 21:17 stone2083 閱讀(14955) 評論(2)  編輯  收藏 所屬分類: java

    Feedback

    # re: 常見加密算法簡介 2012-09-02 21:43 游客

    謝謝分享。  回復  更多評論   

    # re: 常見加密算法簡介 2014-06-19 10:57 李衛(wèi)良

    關于RSA的crt是怎么做解密的,能告訴一下嗎  回復  更多評論   

    主站蜘蛛池模板: 免费人成网站在线高清| 亚洲狠狠婷婷综合久久久久| 粉色视频成年免费人15次| 亚洲成AV人网址| 91福利视频免费观看| 亚洲欧美日韩综合久久久久| 激情综合色五月丁香六月亚洲| 4虎1515hh永久免费| 亚洲精品乱码久久久久蜜桃| 亚洲人成无码网站| 无人在线观看完整免费版视频| 黄色三级三级免费看| 夜夜亚洲天天久久| www国产亚洲精品久久久日本| 国产一区二区三区免费观看在线| 亚洲人成在线中文字幕| 亚洲欧洲中文日韩久久AV乱码| 亚洲免费在线视频播放| 永久免费无码日韩视频| 亚洲人成电影网站| 亚洲一区二区三区偷拍女厕| 国内自产拍自a免费毛片| 国产真人无码作爱免费视频| 2017亚洲男人天堂一| 亚洲韩国精品无码一区二区三区| 成人毛片免费播放| 99久久免费观看| 二级毛片免费观看全程| 99久久国产亚洲综合精品| 亚洲av色影在线| 亚洲综合另类小说色区色噜噜| 免费观看的毛片大全| 免费无码作爱视频| 精品一区二区三区无码免费直播| 亚洲国产成人精品无码一区二区| 亚洲女久久久噜噜噜熟女| 国产精品麻豆免费版| 成人免费AA片在线观看| 久9这里精品免费视频| 91成人免费观看在线观看| 国产成人综合亚洲一区|