AES加密和解密以及java和javascript的hex转换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liufang1991/article/details/84948209

hexString转byteArray,byteArray转hexString

  • Java版的AES(hexString)
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * Created by liufang on 2018/12/10.
 */
public class main {
    public static void main(String[] args){
        byte[] sKey= "0123456789abcdef".getBytes();
        byte[] sSrc=str2byteArray("0x1A 0x2B 0x3C");
        byte[] decrypt=Decrypt(sSrc,sKey);
        byte[] encrypt=Encrypt(sSrc,sKey);
        System.out.println(byteArray2Str(decrypt));
        System.out.println(byteArray2Str(encrypt));
    }
    // byte[] arr = {(byte)0xA1,(byte)0xA2},返回 “0xA1 0xA2”
    public static String byteArray2Str(byte[] arr){
        String result="";
        for(int i=0;i<arr.length;i++){
            result+="0x"+ String.format("%02x", arr[i]).toUpperCase()+" ";
        }
        return result.substring(0,result.length()-1);
    }
    // str=“0xA1 0xA2”,返回byte[] arr = {(byte)0xA1,(byte)0xA2}
    public static byte[] str2byteArray(String str){
        String[] arr = str.split(" ");
        byte[] bytes = new byte[arr.length];
        for(int i=0;i<arr.length;i++){
            bytes[i]= Integer.decode(arr[i]).byteValue();
        }
        return bytes;
    }
    public static byte[] Encrypt(byte[] sSrc, byte[] sKey){
        try{
            SecretKeySpec skeySpec = new SecretKeySpec(sKey, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            byte[] encrypted = cipher.doFinal(sSrc);
            return encrypted;
        }catch(Exception ex){
            System.out.print(ex.getCause()+ex.getMessage());
            return null;
        }
    }
    public static byte[] Decrypt(byte[] sSrc, byte[] sKey){
        try{
            SecretKeySpec skeySpec = new SecretKeySpec(sKey, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            byte[] dncrypted = cipher.doFinal(sSrc);
            return dncrypted;
        }catch(Exception ex){
            System.out.print(ex.getCause()+ex.getMessage());
            return null;
        }
    }
}
  • 微信小程序蓝牙指令操作
// 将命令字符串解析为蓝牙可以发送的数组 “0xA1 0xB1”或者"A1 B1"
function str2BufferArray(data){
  var buf = new ArrayBuffer(16)
  var dataView = new DataView(buf)
  var arr = data.split(" ");
  console.log(arr);
  for (var i = 0; i < arr.length; i++) {
    dataView.setInt8(i, parseInt(arr[i],16));
  }
  console.log('str', buf);
  return buf;
}
// 将蓝牙返回的结果拼接为16进制字符串,返回"0xA1 0xB1"
function buf2hex(buffer) {
  return Array.prototype.map.call(new Uint8Array(buffer), x => ((x<16?"0x0":"0x")+x.toString(16).toLocaleUpperCase())).join(' ');
}
  • Java版的AES(base64String)
    注意base64加密后的字符串经过网络传输以后中间的*“+”号有可能会被替换为空格*,所以在解密的时候最好将字符串的空格替换为“+”,否则有一定概率解密失败
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @version V1.0
 * @desc AES 加密工具类
 */
public class AESUtil {

    private static final String KEY_ALGORITHM = "AES";
    private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";//默认的加密算法

    /**
     * AES 加密操作
     *
     * @param content  待加密内容
     * @param password 加密密码
     * @return 返回Base64转码后的加密数据
     */
    public static String encrypt(String content, String password) {
        try {
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 创建密码器

            byte[] byteContent = content.getBytes("utf-8");

            cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(password));// 初始化为加密模式的密码器

            byte[] result = cipher.doFinal(byteContent);// 加密

            return Base64.getEncoder().encodeToString(result);//通过Base64转码返回
        } catch (Exception ex) {
            Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    /**
     * AES 解密操作
     *
     * @param content
     * @param password
     * @return
     */
    public static String decrypt(String content, String password) {

        try {
            //实例化
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);

            //使用密钥初始化,设置为解密模式
            cipher.init(Cipher.DECRYPT_MODE, getSecretKey(password));

            //执行操作 注意base64字符串在传输过程中+有可能会被替换为空格,所以如果有空格替换回+号
            byte[] result = cipher.doFinal(Base64.getDecoder().decode(content.replace(" ","+")));

            return new String(result, "utf-8");
        } catch (Exception ex) {
            Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, password+":"+content, ex);
        }

        return null;
    }

    /**
     * 加密秘钥, 密码只能是16位,共128字节
     *
     * @return
     */
    private static SecretKeySpec getSecretKey(final String password) {
        return new SecretKeySpec(password.getBytes(), KEY_ALGORITHM);// 转换为AES专用密钥
    }

    public static void main(String[] args) {
    }
}

猜你喜欢

转载自blog.csdn.net/liufang1991/article/details/84948209