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

    主站蜘蛛池模板: 好男人看视频免费2019中文| 精品久久久久久亚洲综合网| 97超高清在线观看免费视频| 亚洲美女在线国产| 男人的天堂亚洲一区二区三区 | 99精品视频在线观看免费| 亚洲熟伦熟女新五十路熟妇 | 最近免费中文字幕4| 国产亚洲精久久久久久无码77777| 亚洲国产精品无码一线岛国| 国产在线精品观看免费观看| 亚洲一区二区三区影院| 亚洲美女色在线欧洲美女| 最近中文字幕电影大全免费版| 成年丰满熟妇午夜免费视频| 亚洲日韩图片专区第1页| 午夜老司机永久免费看片| 亚洲综合自拍成人| 免费下载成人电影| 国产jizzjizz视频全部免费| 一个人看的免费高清视频日本| 最近免费中文字幕mv电影| 亚洲无码精品浪潮| 亚洲成a人无码亚洲成av无码| 久久精品免费视频观看| 中文字幕亚洲色图| 国产高清不卡免费视频| 16女性下面无遮挡免费| 国产成人99久久亚洲综合精品| 亚洲人片在线观看天堂无码| 国产成人在线观看免费网站| 国产VA免费精品高清在线| 性盈盈影院免费视频观看在线一区| 亚洲AV成人片色在线观看高潮| 抽搐一进一出gif免费视频| japanese色国产在线看免费| 亚洲AV无一区二区三区久久| 亚洲午夜无码久久久久小说| 亚洲国产精品人人做人人爱| 暖暖日本免费中文字幕| 亚洲AV无码专区在线电影成人|