AES 加密算法在 java AS JS中的实现_密码等的加密互解

来源:互联网 发布:js验证手机号码 编辑:程序博客网 时间:2024/06/03 16:09

三方只要在编码方式,key,vi中设置一样,就可以进行跨语言加密解密,

首先是java ,Base64我这里是使用的org.apache.commons

package com.jueyue.crypto;import javax.crypto.Cipher;  import javax.crypto.spec.IvParameterSpec;  import javax.crypto.spec.SecretKeySpec;  import org.apache.commons.codec.binary.BAES64;    /*******************************************************************************  * AES加解密算法  *   * @author zhanghuan *     加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定   此处使用AES-128-CBC加密模式,key需要为16位。    也是使用<span style="font-size: 1em; line-height: 1.5;">0102030405060708</span> */    public class AES {        // 加密      public static String Encrypt(String sSrc, String sKey) throws Exception {          if (sKey == null) {              System.out.print("Key为空null");              return null;          }          // 判断Key是否为16位          if (sKey.length() != 16) {              System.out.print("Key长度不是16位");              return null;          }          byte[] raw = sKey.getBytes();          SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");          Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"          IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度          cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);          byte[] encrypted = cipher.doFinal(sSrc.getBytes());            return BAES64.encodeBAES64String(encrypted);//此处使用BAES64做转码功能,同时能起到2次加密的作用。      }        // 解密      public static String Decrypt(String sSrc, String sKey) throws Exception {          try {              // 判断Key是否正确              if (sKey == null) {                  System.out.print("Key为空null");                  return null;              }              // 判断Key是否为16位              if (sKey.length() != 16) {                  System.out.print("Key长度不是16位");                  return null;              }              byte[] raw = sKey.getBytes("ASCII");              SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");              Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");              IvParameterSpec iv = new IvParameterSpec("0102030405060708"                      .getBytes());              cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);              byte[] encrypted1 = BAES64.decodeBAES64(sSrc);//先用bAES64解密              try {                  byte[] original = cipher.doFinal(encrypted1);                  String originalString = new String(original);                  return originalString;              } catch (Exception e) {                  System.out.println(e.toString());                  return null;              }          } catch (Exception ex) {              System.out.println(ex.toString());              return null;          }      }    } 

 接着是as的加密实现,是使用的as3crypto.swc的架包

代码如下:

package util{import com.hurlant.crypto.symmetric.CBCMode;import com.hurlant.crypto.symmetric.DESKey;import flash.utils.ByteArray;import mx.utils.Base64Decoder;import mx.utils.Base64Encoder;/** * 加密算法,对配置文件进行加密 * */public class EncryptionUtil{public function EncryptionUtil(){}/** * 对字符串加密 * */static public function encryption(str:String):String{if(!str||str.length==0){return "";}var key:ByteArray= new   ByteArray();key.writeUTFBytes("0102030405060708");var   iv:ByteArray= new   ByteArray();iv.writeUTFBytes("0102030405060708");var   des:DESKey=new DESKey(key);var cbc:CBCMode = new CBCMode(des);cbc.IV = iv;var   tmpByteArray:ByteArray=convertStringToByteArray(str);    cbc.encrypt(tmpByteArray);var $base64:Base64Encoder = new Base64Encoder();   $base64.insertNewLines =  false;//该值等于true时,输出的结果会自动换行,默认为true,  $base64.encodeBytes(tmpByteArray);//这里注意,如果想加密中文就不要使用$base64.encode();   return $base64.toString();}/** * 对字符串解密 * */static public function decryption(str:String):String{if(!str||str.length==0){return "";}var key:ByteArray= new   ByteArray();key.writeUTFBytes("0102030405060708");var   iv:ByteArray= new   ByteArray();iv.writeUTFBytes("0102030405060708");var   des:DESKey=new DESKey(key);var cbc:CBCMode = new   CBCMode(des);cbc.IV = iv;var $base64D:Base64Decoder = new Base64Decoder();   $base64D.decode(str);//这里注意,如果想加密中文就不要使用$base64.encode();var   tmpByteArray:ByteArray =$base64D.toByteArray();cbc.decrypt(tmpByteArray);return convertByteArrayToString(tmpByteArray);}static private function convertStringToByteArray(str:String):ByteArray  {  var bytes:ByteArray;  if (str)  {  bytes=new ByteArray();  bytes.writeUTFBytes(str);  }  return bytes;  }  static private function convertByteArrayToString(bytes:ByteArray):String  {  var str:String;  if (bytes)  {  bytes.position=0;  str=bytes.readUTFBytes(bytes.length);  }  return str;  }  }}

 最后是js的实现,js是用的CryptoJS这个包,这个搞了好久,就因为srcs没有转码,还是要细心 呀 
function Encrypt(word){ var key = CryptoJS.enc.Utf8.parse("0102030405060708"); var iv  = CryptoJS.enc.Utf8.parse('0102030405060708'); var srcs = CryptoJS.enc.Utf8.parse(word); var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC});         return encrypted.toString();}function Decrypt(word){ var key = CryptoJS.enc.Utf8.parse("0102030405060708"); var iv  = CryptoJS.enc.Utf8.parse('0102030405060708'); var decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC}); return CryptoJS.enc.Utf8.stringify(encrypted).toString();}

  1.     }  

 自己也想了好久,这个key如何设置,如果设置简单的,固定的那么就和没有加密一样,因为自己基本上没有涉及过这个领域,想了一个就是session来作为key,原因是key是单一的,而且不是固定的,这样给破解就加了一定的困难,但是session,能不能在流中被截取,所以可以使用session中的某些值,在即这添加一些,作为key就可以基本上保证,在半路不会被破解了

0 0
原创粉丝点击