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

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

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

    stone2083

    常見加密算法簡(jiǎn)介

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

    1)      MD5/SHA

    MessageDigest是一個(gè)數(shù)據(jù)的數(shù)字指紋.即對(duì)一個(gè)任意長(zhǎng)度的數(shù)據(jù)進(jìn)行計(jì)算,產(chǎn)生一個(gè)唯一指紋號(hào).

    MessageDigest的特性:

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

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

    代表:MD5/SHA

    Java實(shí)現(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進(jìn)行數(shù)據(jù)加密,信息的接收方采用同一個(gè)密鑰A進(jìn)行數(shù)據(jù)解密.

    單密鑰算法是一個(gè)對(duì)稱算法.

    缺點(diǎn):由于采用同一個(gè)密鑰進(jìn)行加密解密,在多用戶的情況下,密鑰保管的安全性是一個(gè)問(wèn)題.

    代表:DES

    Java實(shí)現(xiàn):

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

    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的時(shí)候,可以通過(guò)SecureRandom產(chǎn)生一個(gè)可信任的隨機(jī)數(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是一個(gè)對(duì)稱算法,所以解密代碼跟加密代碼幾乎一致

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


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

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

    3)    DSA

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

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

    代表:DSA

    Java實(shí)現(xiàn):

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

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

    //以指定的長(zhǎng)度初始化KeyPairGenerator對(duì)象,如果沒(méi)有初始化系統(tǒng)以1024長(zhǎng)度默認(rèn)設(shè)置

    //參數(shù):keysize 算法位長(zhǎng).其范圍必須在 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); //從文件得到私鑰

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

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

    signature.initSign(prikey);

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

    byte[] bytes = signature.sign();

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

    驗(yàn)證:

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

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

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

    check.initVerify(pubkey);

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

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

    if (check.verify(bytes)) {

    System.out.println(
    "OK");

    }
     else {

    System.out.println(
    "ERROR");

    }

    4)    RSA

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

    代表:RSA

    Java實(shí)現(xiàn):

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

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

    //以指定的長(zhǎng)度初始化KeyPairGenerator對(duì)象,如果沒(méi)有初始化系統(tǒng)以1024長(zhǎng)度默認(rèn)設(shè)置

    //參數(shù):keysize 算法位長(zhǎng).其范圍必須在 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();

    加密:

    采用公鑰進(jìn)行加密:

    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());

     

    解密:

    采用私鑰進(jìn)行解密:

    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的值是一致的.

    以上,對(duì)常見的算法,對(duì)了簡(jiǎn)單的介紹.一般情況下,可以滿足我們?nèi)粘5男枨罅?/span>.

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

    java code

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

    Feedback

    # re: 常見加密算法簡(jiǎn)介 2012-09-02 21:43 游客

    謝謝分享。  回復(fù)  更多評(píng)論   

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

    關(guān)于RSA的crt是怎么做解密的,能告訴一下嗎  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 永久免费看mv网站入口| 中文字幕亚洲日韩无线码| 色吊丝免费观看网站| 国产精品亚洲美女久久久| 一区二区三区观看免费中文视频在线播放 | 插B内射18免费视频| 日本精品久久久久久久久免费 | 日本亚洲高清乱码中文在线观看| 国产亚洲午夜高清国产拍精品| 亚洲毛片免费观看| 免费视频成人国产精品网站| 在线观看亚洲人成网站| 免费大黄网站在线观| 99视频有精品视频免费观看| 色婷婷亚洲一区二区三区| 亚洲天天做日日做天天看| 又大又黄又粗又爽的免费视频| 久久免费福利视频| 国产成人亚洲精品无码AV大片| 亚洲性天天干天天摸| 亚洲伊人久久综合影院| 国内免费高清在线观看| 男的把j放进女人下面视频免费| 亚洲avav天堂av在线网毛片| 婷婷精品国产亚洲AV麻豆不片| 四虎影在线永久免费观看| 亚洲一区二区三区免费视频| 一区视频免费观看| 国产精品无码亚洲精品2021| 亚洲视频在线观看免费视频| 亚洲熟妇av一区二区三区| 国产在线a不卡免费视频| 成年人网站免费视频| 中文字幕视频在线免费观看| 国产精品亚洲一区二区三区在线观看 | 亚洲精品国精品久久99热一| 日韩在线a视频免费播放| 51在线视频免费观看视频| 中文字幕视频免费在线观看| 日韩亚洲翔田千里在线| 亚洲人AV在线无码影院观看|