package com.hdl.sdk.link.core.utils; 
 | 
  
 | 
import android.text.TextUtils; 
 | 
  
 | 
import com.hdl.sdk.link.common.config.TopicConstant; 
 | 
import com.hdl.sdk.link.common.utils.ByteUtils; 
 | 
  
 | 
import com.hdl.sdk.link.common.utils.LogUtils; 
 | 
import com.hdl.sdk.link.core.bean.LinkRequest; 
 | 
import com.hdl.sdk.link.core.config.HDLLinkConfig; 
 | 
  
 | 
import java.io.UnsupportedEncodingException; 
 | 
  
 | 
/** 
 | 
 * Created by hxb on 2021/12/23. 
 | 
 */ 
 | 
public class EncryptUtil { 
 | 
    private static final String TAG=EncryptUtil.class.getName(); 
 | 
    /** 
 | 
     * 获取加密数据 
 | 
     * 
 | 
     * @param linkRequest 请求数据 
 | 
     * @return 
 | 
     */ 
 | 
    public static byte[] getEncryBytes(LinkRequest linkRequest) throws UnsupportedEncodingException { 
 | 
        //判断是否需要加密 
 | 
        if (ifNeedEncrypt(linkRequest.getTopic(), linkRequest.isEncrypt())) { 
 | 
            String localSecret=HDLLinkConfig.getInstance().getLocalSecret(); 
 | 
            if(TextUtils.isEmpty(localSecret)){ 
 | 
                LogUtils.e(TAG, "找不到本地密钥,这个问题可能要排期解决"); 
 | 
                //没有密钥使用明文 
 | 
                return linkRequest.getSendBytes(); 
 | 
            } 
 | 
            //需要加密 
 | 
            byte[] dataBytes = AesUtil.aesEncrypt(linkRequest.getData(), localSecret); 
 | 
            String headString = "Topic:" + linkRequest.getTopic() + "\r\n" + "Length:" + dataBytes.length + "\r\n" + "\r\n"; 
 | 
            byte[] headBytes = headString.getBytes("utf-8"); 
 | 
            byte[] sendBytes = ByteUtils.concatBytes(headBytes, dataBytes); 
 | 
            return sendBytes; 
 | 
        } else { 
 | 
            return linkRequest.getSendBytes(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 加密数据 
 | 
     * 
 | 
     * param bytes 需要加密数据 
 | 
     * @param secret 加密密钥 
 | 
     * @return 
 | 
     */ 
 | 
    public static byte[] encryBytes(byte []bytes,String secret) { 
 | 
        if(bytes==null|| TextUtils.isEmpty(secret)){ 
 | 
            LogUtils.i("传入数据内容为空或者密钥为空"); 
 | 
            return null; 
 | 
        } 
 | 
        return AesUtil.aesEncrypt(bytes, secret); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 判断当前主题数据是否需要加密 
 | 
     * 
 | 
     * @param topicStr 当前主题 
 | 
     * @return 
 | 
     */ 
 | 
    public static boolean ifNeedEncrypt(String topicStr, boolean isLocalEncrypt) { 
 | 
        //过滤相关需要加密的主题 
 | 
        return (!topicStr.contains(TopicConstant.GATEWAY_AUTH_BROADCAST) //网关广播入网指令 
 | 
                && !topicStr.contains(TopicConstant.DEIVCE_AUTH_REQUEST) //入网认证 
 | 
                && !topicStr.contains(TopicConstant.GATEWAY_SEARCH) //搜索网关主题 
 | 
                && !topicStr.contains(TopicConstant.GATEWAY_SEARCH_REPLY) //搜索网关主题回复 
 | 
                && !topicStr.equals(TopicConstant.BROADCAST) 
 | 
                && isLocalEncrypt//启用加密标志 
 | 
        ); 
 | 
    } 
 | 
} 
 |