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//启用加密标志 ); } }