<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)  編輯  收藏 所屬分類: 加密解密/其他分類

    主站蜘蛛池模板: 免费看搞黄视频网站| 亚洲AV无码AV男人的天堂不卡| 一个人免费播放在线视频看片| 亚洲精品国产高清嫩草影院| 一级做性色a爰片久久毛片免费| 亚洲国产乱码最新视频| 狠狠久久永久免费观看| 青青青亚洲精品国产| 亚洲人成图片小说网站| 免费黄色福利视频| 日韩欧美亚洲中文乱码| 亚洲youjizz| 亚洲天堂中文字幕在线| 亚洲成人免费在线| 亚洲综合无码一区二区痴汉| 亚洲国产精品成人久久蜜臀 | 免费看大美女大黄大色| 日韩精品免费一级视频| 三年片在线观看免费大全电影| 亚洲色成人网站WWW永久四虎| 亚洲成a人片在线观看中文!!!| 亚洲不卡无码av中文字幕| 日韩免费一区二区三区| 日本在线免费观看| 亚洲爆乳无码精品AAA片蜜桃| 亚洲乳大丰满中文字幕| 国产成人亚洲综合无码| 国产偷国产偷亚洲清高动态图| AA免费观看的1000部电影| 岛国精品一区免费视频在线观看 | 亚洲免费观看视频| 免费无码H肉动漫在线观看麻豆| 亚洲另类自拍丝袜第五页| 亚洲狠狠综合久久| 亚洲av无码成人精品区在线播放| 小小影视日本动漫观看免费| 国产精品自在自线免费观看| 国产精彩免费视频| 色www永久免费| 日韩在线观看免费| 亚洲精品无码久久久久牙蜜区|