js 原生 aes rsa 加解密 及 CryptoJS 加解密

阅读更多

 

http://www.oschina.net/code/snippet_552425_46178

 

   

       

   

   

       

       

   

 

---------------------------------------------------------------------------------------------------------------------------

 

-------------------------------------------------------------------------------------------------

对应java代码

-------------------------------------------------------------------------------------------------

 

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package com.icss.regie.crypto;

 

import java.security.Key;

import java.security.NoSuchAlgorithmException;

import java.security.NoSuchProviderException;

import java.security.Security;

import java.util.Arrays;

import javax.crypto.Cipher;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

 

/**

 *

 * @author Administrator

 */

/**

 *

 * @author ngh

 * AES128 算法

 *

 * CBC 模式

 *

 * PKCS7Padding 填充模式

 *

 * CBC模式需要添加一个参数iv

 *

 * 介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别

 * 要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现

 */

public class AES {

 // 算法名称

 final String KEY_ALGORITHM = "AES";

 // 加解密算法/模式/填充方式

 final String algorithmStr = "AES/CBC/PKCS7Padding";

 //

 private Key key;

 private Cipher cipher;

 boolean isInited = false;

 

 public void init(byte[] keyBytes) {

 

  // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要

  int base = 16;

  if (keyBytes.length % base != 0) {

   int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);

   byte[] temp = new byte[groups * base];

   Arrays.fill(temp, (byte) 0);

   System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);

   keyBytes = temp;

  }

  // 初始化

  Security.addProvider(new BouncyCastleProvider());

  // 转化成JAVA的密钥格式

  key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);

  try {

   // 初始化cipher

   cipher = Cipher.getInstance(algorithmStr, "BC");

  } catch (NoSuchAlgorithmException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  } catch (NoSuchPaddingException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  } catch (NoSuchProviderException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

 /**

  * 加密方法

  *

  * @param content

  *            要加密的字符串

  * @param keyBytes

  *            加密密钥

  * @return

  */

 public byte[] encrypt(byte[] content, byte[] keyBytes,String ivParameter) {

  byte[] encryptedText = null;

  init(keyBytes);

  System.out.println("IV:" + ivParameter);

  try {

   cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivParameter.getBytes("utf-8")));

   encryptedText = cipher.doFinal(content);

  } catch (Exception e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  return encryptedText;

 }

 /**

  * 解密方法

  *

  * @param encryptedData

  *            要解密的字符串

  * @param keyBytes

  *            解密密钥

  * @return

  */

 public byte[] decrypt(byte[] encryptedData, byte[] keyBytes,String ivParameter) {

  byte[] encryptedText = null;

  init(keyBytes);

  System.out.println("IV:" + ivParameter);

  try {

   cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivParameter.getBytes("utf-8")));

   encryptedText = cipher.doFinal(encryptedData);

  } catch (Exception e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  return encryptedText;

 }

}

 

 

------------------------------

 

public class Test {

 

    public static void main(String[] args) throws UnsupportedEncodingException {

        AES aes = new AES();

                

        String sKey="1234567890123456";

        

        String ivParameter="1234567890123456";

        // 需要加密的字串

        String cSrc = "你好呀你好嘛你好吗你好哦";

        

        System.out.println("key:::"+ Test.bytesToHexString(sKey.getBytes("UTF-8")));

        System.out.println("ivParameter:::"+Test.bytesToHexString(ivParameter.getBytes("UTF-8")));

        System.out.println("加密前的字串是:"+cSrc);

        // 加密

        byte[] result = aes.encrypt(cSrc.getBytes("UTF-8"),sKey.getBytes("UTF-8"),ivParameter);

        

        System.out.println("加密后的字串是:"+ Test.bytesToHexString(result));

        System.out.println("238f93338d84edb47c544aca7f09ae25e6b867f2befbf38dbe3a95bfa487e212c915b90a7ccbb5fd0c7970ba7a975bc1".equals(Test.bytesToHexString(result)));

        // 解密

        byte[] DeString = aes.decrypt(result,sKey.getBytes("UTF-8"),ivParameter);

        System.out.println("解密后的字串是:" + Test.bytesToHexString(DeString));

        System.out.println("e4bda0e5a5bde59180e4bda0e5a5bde5989be4bda0e5a5bde59097e4bda0e5a5bde593a6".equals(Test.bytesToHexString(DeString)));

        System.out.println("解密后的字串是:" + new String(DeString,Charset.forName("UTF-8")));

    }

 

    public static String bytesToHexString(byte[] src) {

        StringBuilder stringBuilder = new StringBuilder("");

        if (src == null || src.length <= 0) {

            return null;

        }

        for (int i = 0; i < src.length; i++) {

            int v = src[i] & 0xFF;

            String hv = Integer.toHexString(v);

            if (hv.length() < 2) {

                stringBuilder.append(0);

            }

            stringBuilder.append(hv);

        }

        return stringBuilder.toString();

    }

 

    /**

     * Convert hex string to byte[]

     *

     * @param hexString the hex string

     * @return byte[]

     */

    public static byte[] hexStringToBytes(String hexString) {

        if (hexString == null || hexString.equals("")) {

            return null;

        }

        hexString = hexString.toUpperCase();

        int length = hexString.length() / 2;

        char[] hexChars = hexString.toCharArray();

        byte[] d = new byte[length];

        for (int i = 0; i < length; i++) {

            int pos = i * 2;

            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));

        }

        return d;

    }

 

    /**

     * Convert char to byte

     *

     * @param c char

     * @return byte

     */

    private static byte charToByte(char c) {

        return (byte) "0123456789ABCDEF".indexOf(c);

    }

}

你可能感兴趣的:(加解密,js,html5)