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

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

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

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    關于AES(16字節)加密解密算法的java實現

    關于AES(16字節)加密解密算法的java實現
    根據指定的字符串來實現AES加密和解密,密匙可參數化配置,加密后數據的前兩個字節是數據包的長度,加密算法選用AES
    /ECB /PKCS5Padding。即采用標準AES算法,把全報文按照每塊16字節分塊進行加解密,對于不足16字節的數據塊按照PKCS5方式補充,缺少N 個字節則把缺少的N個字節都以N來填充,最后一個數據塊剛好16字節,則增加一個全部字節都填充為16的數據塊。
    =====================================
    AesHandler.java
    =====================================
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.security.GeneralSecurityException;
    import java.util.List;

    import javax.crypto.Cipher;
    import javax.crypto.ShortBufferException;
    import javax.crypto.spec.SecretKeySpec;

    import org.dom4j.Document;
    import org.dom4j.io.SAXReader;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;

    public class AesHandler {

    private String plainTextFile = "src/encode.txt";// 明文文件
    private String cipherTextFile = "src/aesDecode.txt";// 密文文件
    private String keyFile = "src/aesKey.xml";// 加密密匙文件

    /**
    *
    @param keyName
    *            加密密匙名
    @return
    */
    public SecretKeySpec createKey(String keyName) {
    SAXReader reader 
    = new SAXReader();
    Document doc;
    SecretKeySpec skeySpec 
    = null;
    byte[] raw;
    File keyXmlFile 
    = new File(keyFile);
    try {
    doc 
    = reader.read(keyXmlFile);
    Element root 
    = doc.getRootElement();
    List items 
    = root.elements("key16");
    for(int i = 0; i < items.size(); i++){
    Element node 
    = (Element)items.get(i);
    if(keyName.equalsIgnoreCase(node.attributeValue("name"))){
    raw 
    = node.attributeValue("value").getBytes("ASCII");
    skeySpec 
    = new SecretKeySpec(raw, "AES");
    return skeySpec;
    }
    }
    catch (DocumentException e) {
    e.printStackTrace();
    // throw new HiException(HiMessageCode.ERR_PARSE_FAILURE, _fmtFile,
    // e);
    catch (MalformedURLException e) {
    e.printStackTrace();
    catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    return skeySpec;
    }

    /**
    *
    @param code
    *            選擇加密或解密操作碼
    @param keyFileStr
    *            加密密匙文件
    @param plainFile 明文文件
    @param cipherFile 密文文件
    @param keyName 密匙名          
    */
    public void run(String code, String keyName) {
    int mode = Cipher.ENCRYPT_MODE;
    InputStream in 
    = null;
    OutputStream out 
    = null;
    try {
    SecretKeySpec skeySpec 
    = createKey(keyName);
    Cipher cipher 
    = Cipher.getInstance("AES/ECB/PKCS5Padding");
    if ("DECODE".equals(code)) {
    mode 
    = Cipher.DECRYPT_MODE;
    in 
    = new FileInputStream(cipherTextFile);
    out 
    = new FileOutputStream(plainTextFile);
    cipher.init(mode, skeySpec);
    decrypt(in, out, cipher);
    // 解密
    else {
    in 
    = new FileInputStream(plainTextFile);
    out 
    = new FileOutputStream(cipherTextFile);
    cipher.init(mode, skeySpec);
    encrypt(in, out, cipher);
    // 加密
    }
    in.close();
    out.close();
    catch (Exception e) {
    e.printStackTrace();
    }
    }

    public static byte[] shortToByteArray(int valor) {
    byte[] result = new byte[2];
    for (int i = 0; i < result.length; i++) {
    result[
    1 - i] = (byte) (valor & 0xFF);
    valor 
    = valor >> 8;
    }
    return result;
    }

    /**
    * 加密算法
    *
    @param in
    *            明文數據流
    @param out
    *            密文數據流
    @param cipher
    @throws IOException
    @throws ShortBufferException
    @throws GeneralSecurityException
    */
    public static void encrypt(InputStream in, OutputStream out, Cipher cipher)
    throws IOException, ShortBufferException, GeneralSecurityException {
    int blockSize = cipher.getBlockSize();
    int outputSize = cipher.getOutputSize(blockSize);
    byte[] inBytes = new byte[blockSize];
    byte[] outBytes = new byte[outputSize];
    byte[] appendAllBytes = new byte[blockSize];
    byte[] appendBytes = new byte[blockSize];
    int inLength = 0;
    int length1 = in.available();
    boolean more = true;
    int yushu = length1 % 16;
    if (yushu == 0) {
    for (int i = 0; i < 16; i++) {
    appendAllBytes[i] 
    = new Integer(16).byteValue();
    }
    out.write(shortToByteArray(length1 
    + blockSize));
    else {
    int N = blockSize - yushu;
    out.write(shortToByteArray(length1 
    + N));
    }
    while (more) {
    inLength 
    = in.read(inBytes);
    if (inLength == blockSize) {
    int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
    out.write(outBytes, 
    0, outLength);
    else
    more 
    = false;
    }
    if (inLength > 0 && inLength < blockSize) {// 不足16字節的數據塊按照PKCS5方式補充,缺少N個字節則把缺少的N個字節都以N來填充
    int N = blockSize - inLength;
    for (int M = inLength; M < blockSize; M++) {
    inBytes[M] 
    = new Integer(N).byteValue();
    }
    outBytes 
    = cipher.doFinal(inBytes, 0, inLength);
    out.write(outBytes);
    else if (inLength == 0) {// 如果正好是16位,則增加一個全部字節都填充為16的數據塊
    int outLength = cipher.doFinal(appendBytes, 0, blockSize, outBytes);
    out.write(outBytes, 
    0, outLength);
    }
    out.flush();
    }

    /**
    * 解密算法
    *
    @param in
    *            密文數據流
    @param out
    *            明文數據流
    @param cipher
    @throws IOException
    @throws ShortBufferException
    @throws GeneralSecurityException
    */
    public static void decrypt(InputStream in, OutputStream out, Cipher cipher)
    throws IOException, ShortBufferException, GeneralSecurityException {
    int blockSize = cipher.getBlockSize();
    int outputSize = cipher.getOutputSize(blockSize);
    byte[] inBytes = new byte[blockSize];
    byte[] outBytes = new byte[outputSize];
    byte[] dataLength = new byte[2];
    int inLength = 0;
    boolean more = true;
    in.read(dataLength);
    // 將數據包的長度讀入到byte數組中
    while (more) {
    inLength 
    = in.read(inBytes);
    if (inLength == blockSize) {
    int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
    out.write(outBytes, 
    0, outLength);
    else
    more 
    = false;
    }
    if (inLength > 0) {
    outBytes 
    = cipher.doFinal(inBytes, 0, inLength);
    else {
    outBytes 
    = cipher.doFinal();
    }
    out.write(outBytes);
    out.flush();
    }

    public String getPlainTextFile() {
    return plainTextFile;
    }

    public void setPlainTextFile(String plainTextFile) {
    this.plainTextFile = plainTextFile;
    }

    public String getCipherTextFile() {
    return cipherTextFile;
    }

    public void setCipherTextFile(String cipherTextFile) {
    this.cipherTextFile = cipherTextFile;
    }
    public String getKeyFile() {
    return keyFile;
    }

    public void setKeyFile(String keyFile) {
    this.keyFile = keyFile;
    }
    }
    =======================================================================
    aesKey.xml文件
    =============================
    <?xml version="1.0" encoding="GB2312"?>
    <KEY>
    <key16 name="test" value="16BAESBocHK2Mcis"></key16>
    </KEY>
    =======================================================================
    測試:
    加密密鑰: 16BAESBocHK2Mcis
    明文: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$
    %!&*()_+-=:;'?,./
    密文為:  
    =========================From 001 Lines to 016============================
    Debug: 
    -1--2--3--4--5--6--7--8--9-HEX-1--2--3--4--5--6   ---ASCII Value--
    0000100 40 0e 49 32 64 f8 07 c0 fd 22 80 49 6f 80 32   .@.I2d..例".Io.2
    0000250 c5 97 73 f4 55 83 fb 59 6d 85 3c 82 1c 30 a3   P艞s.U凔Ym.<..0.
    00003: d8 49 45 fc e2 83 3d 39 a2 d2 6e 06 4f a6 94 1c   .IE .=9⒁n.O .
    0000419 2d 38 6d 81 e7 34 3b f7 5d 2b ff 83 a6 14 c2   .-8m佺4;.]+?..
    00005: 2d 0e                                            >-.
    ====================================end================================

    posted on 2011-03-16 18:11 都市淘沙者 閱讀(4432) 評論(0)  編輯  收藏 所屬分類: 加密解密/其他分類

    主站蜘蛛池模板: 亚洲ⅴ国产v天堂a无码二区| 亚洲一区日韩高清中文字幕亚洲| 亚洲欧洲日产国码久在线观看| 中文字幕免费人成乱码中国| ZZIJZZIJ亚洲日本少妇JIZJIZ | 亚洲人AV永久一区二区三区久久| 日韩色日韩视频亚洲网站| 亚洲国产一区二区三区青草影视| 国产一二三四区乱码免费| 国产精品亚洲精品日韩已满| 国产免费拔擦拔擦8X高清在线人| 成年女人毛片免费播放视频m| 日本亚洲色大成网站www久久| 特级淫片国产免费高清视频| 亚洲AV成人片无码网站| 亚洲第一成人影院| 亚洲熟女www一区二区三区| 四虎影院免费在线播放| 激情吃奶吻胸免费视频xxxx| 国产亚洲成人在线播放va| 国产成人无码区免费网站| 精品亚洲麻豆1区2区3区| 毛片a级三毛片免费播放| 国产精品亚洲va在线观看| 中文字幕在亚洲第一在线| 四虎影视成人永久免费观看视频| 久久久久亚洲AV片无码下载蜜桃| 无码中文字幕av免费放| 男人免费视频一区二区在线观看| 亚洲人成伊人成综合网久久久 | 亚洲欧洲日韩在线电影| 全免费a级毛片免费**视频| 污污污视频在线免费观看| 亚洲国产精品乱码一区二区| 99久久久精品免费观看国产| 免费大片av手机看片高清| 亚洲va在线va天堂va四虎| 国产精品jizz在线观看免费| 免费国产99久久久香蕉| 亚洲国产精品18久久久久久| 亚洲老妈激情一区二区三区|