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

          主站蜘蛛池模板: 佛坪县| 尖扎县| 巩留县| 涿鹿县| 瑞安市| 山东省| 临洮县| 江阴市| 丹棱县| 民勤县| 武乡县| 原阳县| 中方县| 高州市| 屯昌县| 马关县| 泸西县| 金川县| 商水县| 博白县| 滨州市| 西峡县| 新昌县| 定州市| 临洮县| 宜兴市| 陵川县| 南阳市| 屏边| 乐山市| 榆社县| 阿坝县| 吉林省| 洛南县| 星子县| 安阳县| 黄平县| 云龙县| 临沧市| 桂阳县| 昭通市|