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) {
}
}