<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 都市淘沙者 閱讀(4446) 評論(0)  編輯  收藏 所屬分類: 加密解密/其他分類

    主站蜘蛛池模板: 日韩视频免费在线观看| 一级A毛片免费观看久久精品 | 西西人体免费视频| 免费一区二区三区四区五区| 亚洲av无码成人精品区一本二本| 四虎成人免费网址在线| 亚洲av中文无码乱人伦在线观看 | 亚洲中文字幕在线乱码| aa级毛片毛片免费观看久| 亚洲片国产一区一级在线观看 | 可以免费观看的国产视频| 亚洲成人精品久久| 毛片免费全部播放无码| 亚洲一区动漫卡通在线播放| 成年丰满熟妇午夜免费视频| 亚洲丰满熟女一区二区哦| 无码国产亚洲日韩国精品视频一区二区三区 | 在线视频网址免费播放| 亚洲中文字幕无码永久在线| 中文字幕在线免费视频| 亚洲国产国产综合一区首页| 国产精品视频免费| 久久亚洲AV成人无码国产最大| 亚洲国产精品无码久久青草| 国产综合免费精品久久久| 亚洲视频在线免费看| 国内大片在线免费看| 一级毛片**免费看试看20分钟| 中文亚洲AV片不卡在线观看| 无码国产精品一区二区免费vr| 中文字幕亚洲精品无码| 亚洲精品一级无码鲁丝片| 69影院毛片免费观看视频在线 | 国产一级一片免费播放i| 国产精品免费一区二区三区| 亚洲伦理一区二区| 四虎影视精品永久免费网站| 在线免费观看伊人三级电影| 亚洲国产精品一区二区三区在线观看| 亚洲AV无码不卡在线观看下载| 99re这里有免费视频精品|