diff --git a/BHDXJ/app/build.gradle b/BHDXJ/app/build.gradle
index 8d8ffa8..b4e1bdc 100755
--- a/BHDXJ/app/build.gradle
+++ b/BHDXJ/app/build.gradle
@@ -107,6 +107,12 @@ dependencies {
implementation 'io.github.azhon:appupdate:4.2.6'
implementation 'com.tencent.bugly:crashreport:3.2.1'
implementation 'com.github.xuexiangjys:XUI:1.1.4'
+ //mqtt
+ implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.4'
+ implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
+ implementation 'org.bouncycastle:bcpkix-jdk15on:1.56'
+ implementation 'commons-codec:commons-codec:1.15'
+
// testImplementation 'junit:junit:4.13.1'
// androidTestImplementation 'androidx.test.ext:junit:1.1.2'
// androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
diff --git a/BHDXJ/app/src/main/AndroidManifest.xml b/BHDXJ/app/src/main/AndroidManifest.xml
index c07126b..057f7ca 100755
--- a/BHDXJ/app/src/main/AndroidManifest.xml
+++ b/BHDXJ/app/src/main/AndroidManifest.xml
@@ -19,6 +19,7 @@
+
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/LoginActivity.kt b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/LoginActivity.kt
index 0e1a22c..0772c0a 100644
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/LoginActivity.kt
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/LoginActivity.kt
@@ -14,7 +14,6 @@ import android.view.View
import com.azhon.appupdate.listener.OnButtonClickListener
import com.azhon.appupdate.listener.OnDownloadListener
import com.azhon.appupdate.manager.DownloadManager
-import com.google.gson.Gson
import com.rehome.bhdxj.R
import com.rehome.bhdxj.base.BaseActivityAutoToolbarViewBinding
import com.rehome.bhdxj.bean.ApkUpdateBean
@@ -27,6 +26,7 @@ import com.rehome.bhdxj.utils.GsonUtils
import com.rehome.bhdxj.utils.HttpListener
import com.rehome.bhdxj.utils.NetworkUtil
import com.rehome.bhdxj.utils.NohttpUtils
+import com.rehome.bhdxj.utils.RSAUtils
import com.rehome.bhdxj.utils.SPUtils
import com.rehome.bhdxj.utils.StatusBarUtil
import com.rehome.bhdxj.utils.UiUtlis
@@ -60,17 +60,29 @@ class LoginActivity : BaseActivityAutoToolbarViewBinding()
override fun initView() {
binding.tvVersion.text = "版本V" + getVersionName()
StatusBarUtil.transparencyBar(this) //设置透明状态栏
- UserID = SPUtils.get(this, Contans.USERID, "") as String
- UserPwd = SPUtils.get(this, Contans.USERPWD, "") as String
+
+ val UserIDTemp = SPUtils.get(this, Contans.USERID, "") as String
+ val UserPwdTemp = SPUtils.get(this, Contans.USERPWD, "") as String
+
val save = SPUtils.get(this, "save", true) as Boolean
binding.savePwUser.isChecked = save
- binding.etUse.setText(UserID)
+
+ if (!TextUtils.isEmpty(UserIDTemp)) {
+ UserID = RSAUtils.decryptBASE64StrLocal(UserIDTemp);
+ binding.etUse.setText(UserID)
+ }
+
+ //binding.etUse.setText(UserID)
if (save) {
- binding.etPwd.setText(UserPwd)
+ //binding.etPwd.setText(UserPwd)
+ if (!TextUtils.isEmpty(UserPwdTemp)) {
+ UserPwd = RSAUtils.decryptBASE64StrLocal(UserPwdTemp);
+ binding.etPwd.setText(UserPwd);
+ }
}
- binding.etUse.setText("870064")
- binding.etPwd.setText("Xdj@2025")
+// binding.etUse.setText("870064")
+// binding.etPwd.setText("Xdj@2025")
}
@@ -84,7 +96,7 @@ class LoginActivity : BaseActivityAutoToolbarViewBinding()
private fun onclick() {
binding.btnLogin.setOnClickListener(View.OnClickListener {
if (isCanLogin()) {
- if (NetworkUtil.hasNetWorkStatus(context)) {
+ if (NetworkUtil.canNetWorkConnect(context)) {
Log.i("app", "有网络")
onlineLogin()
} else {
@@ -305,12 +317,12 @@ class LoginActivity : BaseActivityAutoToolbarViewBinding()
SPUtils.put(
context,
Contans.USERID,
- binding.etUse.text.toString()
+ RSAUtils.encryptBASE64StrLocal(binding.etUse.getText().toString())
)
SPUtils.put(
context,
Contans.USERPWD,
- binding.etPwd.text.toString()
+ RSAUtils.encryptBASE64StrLocal(binding.etPwd.getText().toString())
)
SPUtils.put(context, Contans.USERNAME, username)
SPUtils.put(
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/MainActivity.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/MainActivity.java
index db11337..e62b1d3 100644
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/MainActivity.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/MainActivity.java
@@ -34,6 +34,8 @@ import com.rehome.bhdxj.contans.Contans;
import com.rehome.bhdxj.utils.AppManager;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpListener;
+import com.rehome.bhdxj.utils.MqttSSLPublishServer;
+import com.rehome.bhdxj.utils.NetworkUtil;
import com.rehome.bhdxj.utils.NohttpUtils;
import com.rehome.bhdxj.utils.OAToolbar;
import com.rehome.bhdxj.utils.SPUtils;
@@ -52,6 +54,8 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
public class MainActivity extends BaseActivity3 {
@@ -67,6 +71,10 @@ public class MainActivity extends BaseActivity3 {
private long exitTime = 0;
private BluetoothLeService mBluetoothLeService;
+ MqttSSLPublishServer mqttPublishServer;
+ //定时器
+ private Timer timer;
+
@Override
public int getLayoutId() {
@@ -81,6 +89,19 @@ public class MainActivity extends BaseActivity3 {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//设置透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//设置透明导航栏
StatusBarUtil.transparencyBar(MainActivity.this);//设置透明状态栏
+
+ if (NetworkUtil.canNetWorkConnect(context)) {
+ Log.i("app", "有网络");
+ } else {
+ Log.i("app", "无网络");
+ }
+ if(NetworkUtil.canNetWorkConnect(context)&& NetworkUtil.isISPNetWorkConnect(context)){
+ Log.i("app", "运营商网络");
+ initMqtt();
+ }
+ if(NetworkUtil.canNetWorkConnect(context)&& NetworkUtil.isWifiNetWorkConnect(context)){
+ Log.i("app", "wifi网络");
+ }
}
@Override
@@ -212,14 +233,44 @@ public class MainActivity extends BaseActivity3 {
}
};
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if(NetworkUtil.canNetWorkConnect(context)&&NetworkUtil.isISPNetWorkConnect(context)){
+ if(mqttPublishServer==null){
+ mqttPublishServer = new MqttSSLPublishServer(this);
+ }
+ if(timer==null){
+ try {
+ timer = new Timer();
+ timer.schedule(new TimerTask() {
+ public void run() {
+ mqttPublishServer.start();
+ }
+ }, 1000, 60000);
+ // 设定指定的时间time,此处为10000毫秒
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
@Override
public void onDestroy() {
+ super.onDestroy();
mBluetoothLeService.disconnect();
mBluetoothLeService.close();
unbindService(mServiceConnection);
Intent intent = new Intent(this, BluetoothLeService.class);
stopService(intent);
- super.onDestroy();
+ if(mqttPublishServer!=null){
+ mqttPublishServer.destroyAll();
+ mqttPublishServer=null;
+ }
+ if(timer!=null){
+ timer.cancel();
+ }
}
//获取运行专业数据
@@ -318,4 +369,20 @@ public class MainActivity extends BaseActivity3 {
}
}).build().download();
}
+
+ public void initMqtt() {
+ //开启MQTT一键招回
+ mqttPublishServer = new MqttSSLPublishServer(this);
+ try {
+ timer = new Timer();
+ timer.schedule(new TimerTask() {
+ public void run() {
+ mqttPublishServer.start();
+ }
+ }, 1000, 60000);
+ // 设定指定的时间time,此处为10000毫秒
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
}
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/QxgdActivity.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/QxgdActivity.java
index 15226b0..23cc269 100644
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/QxgdActivity.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/QxgdActivity.java
@@ -12,6 +12,7 @@ import com.rehome.bhdxj.bean.QXGDResultBean;
import com.rehome.bhdxj.contans.Contans;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpUtils;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.rehome.bhdxj.weight.DateTimePickDialog;
import com.rehome.bhdxj.weight.InputLayout;
@@ -310,6 +311,9 @@ public class QxgdActivity extends BaseActivity3 {
}
private String GetInfo() {
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String username = RSAUtils.decryptBASE64StrLocal(usernameTemp);
+
String json = "";
Map map = new HashMap();
map.put("description", etQxms.getContentText());
@@ -317,7 +321,7 @@ public class QxgdActivity extends BaseActivity3 {
map.put("profession", ZYValue);
map.put("bugtype", LXvalue);
map.put("buglevel", QXDJValue);
- map.put("reportedby", (String) SPUtils.get(context, Contans.USERID, ""));
+ map.put("reportedby", username);
map.put("bugdept", GDAPValue);
json = GsonUtils.GsonString(map);
return json;
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/DjdscFragment.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/DjdscFragment.java
index 6e4632b..fcc0bb4 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/DjdscFragment.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/DjdscFragment.java
@@ -22,6 +22,7 @@ import com.rehome.bhdxj.contans.Contans;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpListener;
import com.rehome.bhdxj.utils.HttpResponseListener;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.rehome.bhdxj.utils.UiUtlis;
import com.rehome.bhdxj.weight.toastviewbymyself;
@@ -198,7 +199,10 @@ public class DjdscFragment extends BaseFragment {
private void uploadData() {
uploadCecked = 0;
uploadSuccess = 0;
- String USERNAME = (String) SPUtils.get(context, Contans.USERID, "");
+
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String USERNAME = RSAUtils.decryptBASE64StrLocal(usernameTemp);
+
for (int i = 0; i < xdjjhxzDataList.size(); i++) {
if (xdjjhxzDataList.get(i).isChecked()) {
uploadCecked++;
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/MainSbxdjglActivity.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/MainSbxdjglActivity.java
index 300b06c..74bd5f3 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/MainSbxdjglActivity.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/MainSbxdjglActivity.java
@@ -19,6 +19,7 @@ import com.rehome.bhdxj.contans.Contans;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpListener;
import com.rehome.bhdxj.utils.NohttpUtils;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.rehome.bhdxj.utils.StatusBarUtil;
import com.yolanda.nohttp.NoHttp;
@@ -141,12 +142,14 @@ public class MainSbxdjglActivity extends BaseActivity {
};
private String createZyJson() {
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String username = RSAUtils.decryptBASE64StrLocal(usernameTemp);
+
String GWID = (String) SPUtils.get(getApplicationContext(), Contans.BZBH, "");
- String YHID = (String) SPUtils.get(getApplicationContext(), Contans.USERID, "");
XscbRequestBean info = new XscbRequestBean();
info.setAction("DJ_GWLIST_GET");
info.setGWID(GWID);
- info.setYHID(YHID);
+ info.setYHID(username);
String json = GsonUtils.GsonString(info);
return json;
}
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/XzjhFragment.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/XzjhFragment.java
index a35deb0..197719c 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/XzjhFragment.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxdj/XzjhFragment.java
@@ -22,6 +22,7 @@ import com.rehome.bhdxj.contans.Contans;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpListener;
import com.rehome.bhdxj.utils.HttpResponseListener;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.rehome.bhdxj.utils.UiUtlis;
import com.rehome.bhdxj.weight.WaitDialog;
@@ -244,7 +245,8 @@ public class XzjhFragment extends BaseFragment {
}
private String createZyJson(String gwid) {
- String YHID = (String) SPUtils.get(context, Contans.USERID, "");
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String YHID = RSAUtils.decryptBASE64StrLocal(usernameTemp);
XscbRequestBean info = new XscbRequestBean();
info.setAction("DJ_RWXZ_GET");
info.setGWID(gwid);
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/ScxsjhFragment.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/ScxsjhFragment.java
index c8d0ccd..d547016 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/ScxsjhFragment.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/ScxsjhFragment.java
@@ -24,6 +24,7 @@ import com.rehome.bhdxj.contans.Contans;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpListener;
import com.rehome.bhdxj.utils.HttpResponseListener;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.rehome.bhdxj.utils.UiUtlis;
import com.rehome.bhdxj.weight.WaitDialog;
@@ -255,7 +256,11 @@ public class ScxsjhFragment extends BaseFragment {
datas.setSBZT("1");
}
datas.setZcmc((String) SPUtils.get(context, Contans.BZBH, ""));
- datas.setCbr((String) SPUtils.get(context, Contans.USERID, ""));
+
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String username = RSAUtils.decryptBASE64StrLocal(usernameTemp);
+
+ datas.setCbr(username);
datas.setFxnr(xsjjhdatabeanList.get(j).getFxnr());
datas.setSmfx("");
datalist.add(datas);
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XsHistoryActivity.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XsHistoryActivity.java
index d19f543..9126780 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XsHistoryActivity.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XsHistoryActivity.java
@@ -13,6 +13,7 @@ import com.rehome.bhdxj.base.BaseActivity;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpListener;
import com.rehome.bhdxj.utils.NohttpUtils;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.RequestMethod;
@@ -131,7 +132,11 @@ public class XsHistoryActivity extends BaseActivity {
info.setZc((String) SPUtils.get(context, Contans.BZBH, ""));
info.setRqts("4");
info.setZymc(Contans.YXCB_ZY_ID);
- info.setYhid((String) SPUtils.get(context, Contans.USERID, ""));//抄表人
+
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String username = RSAUtils.decryptBASE64StrLocal(usernameTemp);
+
+ info.setYhid(username);//抄表人
String json = GsonUtils.GsonString(info);
return json;
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XscbqyWorkActivity.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XscbqyWorkActivity.java
index 4f1d8ed..e31b0e3 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XscbqyWorkActivity.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XscbqyWorkActivity.java
@@ -16,6 +16,7 @@ import com.rehome.bhdxj.base.BaseActivity;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpListener;
import com.rehome.bhdxj.utils.NohttpUtils;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.rehome.bhdxj.weight.AutoListView;
import com.yolanda.nohttp.NoHttp;
@@ -208,7 +209,10 @@ public class XscbqyWorkActivity extends BaseActivity {
bean.setZcmc((String) SPUtils.get(context, Contans.BZBH, ""));//班组
- bean.setCbr((String) SPUtils.get(context, Contans.USERID, ""));//抄表人
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String username = RSAUtils.decryptBASE64StrLocal(usernameTemp);
+
+ bean.setCbr(username);//抄表人
bean.setFxnr("");//分析内容
bean.setSmfx(smfx);//扫描方式
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XscbqyWorkXsActivity.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XscbqyWorkXsActivity.java
index 10584c8..3401eb2 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XscbqyWorkXsActivity.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/sbxj/XscbqyWorkXsActivity.java
@@ -16,6 +16,7 @@ import com.rehome.bhdxj.base.BaseActivity;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpListener;
import com.rehome.bhdxj.utils.NohttpUtils;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.rehome.bhdxj.weight.AutoListView;
import com.yolanda.nohttp.NoHttp;
@@ -187,7 +188,10 @@ public class XscbqyWorkXsActivity extends BaseActivity {
bean.setZcmc((String) SPUtils.get(context, Contans.BZBH, ""));//班组
- bean.setCbr((String) SPUtils.get(context, Contans.USERID, ""));//抄表人
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String username = RSAUtils.decryptBASE64StrLocal(usernameTemp);
+
+ bean.setCbr(username);//抄表人
bean.setFxnr("");//分析内容
bean.setSmfx(smfx);//扫描方式
dataBeanList.add(bean);
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/yhpc/YhpcDataListActivity.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/yhpc/YhpcDataListActivity.java
index d07f8e3..1639a21 100644
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/yhpc/YhpcDataListActivity.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/activity/yhpc/YhpcDataListActivity.java
@@ -18,6 +18,7 @@ import com.rehome.bhdxj.bean.YhpcResultBean;
import com.rehome.bhdxj.contans.Contans;
import com.rehome.bhdxj.utils.Api;
import com.rehome.bhdxj.utils.GsonUtils;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.RetrofitHttpUtils;
import com.rehome.bhdxj.utils.SPUtils;
import org.litepal.crud.DataSupport;
@@ -64,7 +65,9 @@ public class YhpcDataListActivity extends BaseActivity3 {
startActivity(YhpcTakePhotoActivity.class);
}
});
- SCR = (String) SPUtils.get(context, Contans.USERID, "");
+
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ SCR = RSAUtils.decryptBASE64StrLocal(usernameTemp);
lv = findViewById(R.id.lv);
tvNodata = findViewById(R.id.tv_nodata);
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/adapter/ZjrwxjAdapter.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/adapter/ZjrwxjAdapter.java
index 4c6c605..cdb63a6 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/adapter/ZjrwxjAdapter.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/adapter/ZjrwxjAdapter.java
@@ -11,6 +11,7 @@ import android.widget.TextView;
import com.rehome.bhdxj.DBModel.Xjzjrw;
import com.rehome.bhdxj.R;
import com.rehome.bhdxj.contans.Contans;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.zhy.autolayout.utils.AutoUtils;
@@ -76,7 +77,8 @@ public class ZjrwxjAdapter extends BaseAdapter {
holder.tv_zyfzr.setText(list.get(i).getProusername());
holder.tv_zjsj.setText(list.get(i).getZjtime());
- String YHID = (String) SPUtils.get(context, Contans.USERID, "");
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String YHID = RSAUtils.decryptBASE64StrLocal(usernameTemp);
if (list.get(i).getProuserid().equals(YHID)) {//当前用户是主要负责人则可以下载
holder.cb.setEnabled(true);
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/contans/Contans.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/contans/Contans.java
index b5e04a7..28296b1 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/contans/Contans.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/contans/Contans.java
@@ -83,6 +83,7 @@ public class Contans {
public final static String PERMISSIONSRESULT = "PermissionsResult";
public final static String USERID = "USERID";
public final static String USERPWD = "USERPWD";
+ public final static String NFCBM = "NFCBM";
public final static String BZBH = "bzbh";
public final static String BZMC = "bzmc";
public final static String USERNAME = "USERNAME";
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/service/PushService.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/service/PushService.java
index d439bcc..13b8079 100755
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/service/PushService.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/service/PushService.java
@@ -16,6 +16,7 @@ import com.rehome.bhdxj.contans.Contans;
import com.rehome.bhdxj.utils.GsonUtils;
import com.rehome.bhdxj.utils.HttpListener;
import com.rehome.bhdxj.utils.NohttpUtils;
+import com.rehome.bhdxj.utils.RSAUtils;
import com.rehome.bhdxj.utils.SPUtils;
import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.RequestMethod;
@@ -156,7 +157,10 @@ public class PushService extends IntentService {
private String createZyJson() {
String GWID = (String) SPUtils.get(getApplicationContext(), Contans.BZBH, "");
- String YHID = (String) SPUtils.get(getApplicationContext(), Contans.USERID, "");
+
+ String usernameTemp = (String) SPUtils.get(this, Contans.USERID,String.valueOf(""));
+
+ String YHID = RSAUtils.decryptBASE64StrLocal(usernameTemp);
XscbRequestBean info = new XscbRequestBean();
info.setAction("DJ_GWLIST_GET");
info.setGWID(GWID);
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/MqttSSLPublishServer.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/MqttSSLPublishServer.java
new file mode 100644
index 0000000..38a5875
--- /dev/null
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/MqttSSLPublishServer.java
@@ -0,0 +1,211 @@
+package com.rehome.bhdxj.utils;
+
+
+/**
+ * @author huangwenfei
+ * @version v1.0.0.0
+ * Created DateTime 2021-03-08 14:52
+ * @description: mqtt 高可靠,断线重连 消息发布服务
+ */
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.text.TextUtils;
+import android.util.Log;
+import com.rehome.bhdxj.contans.Contans;
+import com.google.gson.Gson;
+import org.eclipse.paho.client.mqttv3.*;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.UUID;
+
+
+
+public class MqttSSLPublishServer {
+ /**
+ * 代理服务器ip地址
+ */
+ //private final String HOST = "tcp://39.101.173.20:1883";
+ //private final String HOST = "ssl://39.101.173.20:8883";
+ private final String HOST = "tcp://47.242.184.139:1883";
+ //private final String HOST = "ssl://47.242.184.139:8883";
+
+ //private final String HOST = "tcp://113.107.214.27:1883";
+
+ /**
+ * 发送主题
+ */
+ private final String topicPush = "app_push_bh";
+ /**
+ * 订阅主题
+ */
+ private final String topicReceive = "member_recall";
+ /**
+ * 客户端唯一标识,相同的会被逼下线
+ */
+ private String clientid = "v1_server_ssl_android";
+ private MqttClient client;
+ private MqttConnectOptions options;
+ /**
+ * MQTT服务端连接账号
+ */
+ private final String userName = "admin";
+ /**
+ * MQTT服务端连接密码
+ */
+ //private final String passWord = "public452131wW452131wW$";
+ private final String passWord = "publish452131wW452131wW$";
+ /**
+ * 消息发布质量
+ * 0:最多一次,即:<=1
+ * 1:至少一次,即:>=1
+ * 2:一次,即:=1
+ */
+ private int qos = 2;
+ // 推送消息
+ private MqttMessage message;
+
+ private Context context;
+
+ public MqttSSLPublishServer(Context context) {
+ this.context=context;
+ // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
+ try {
+ clientid=(String) SPUtils.get(context,"clientid",String.valueOf(""));
+ if(TextUtils.isEmpty(clientid)){
+ clientid=UUID.randomUUID().toString();
+ SPUtils.put(context,"clientid",clientid);
+ }
+
+ client = new MqttClient(HOST, clientid, new MemoryPersistence());
+ // MQTT的连接设置
+ options = new MqttConnectOptions();
+ // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
+ options.setCleanSession(false);
+ // 设置连接的用户名
+ options.setUserName(userName);
+ // 设置连接的密码
+ options.setPassword(passWord.toCharArray());
+ // 设置超时时间 单位为秒
+ options.setConnectionTimeout(10);
+ // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
+ options.setKeepAliveInterval(20);
+ //断线重连
+ options.setAutomaticReconnect(true);
+ // 发布目的消息对象
+ message = new MqttMessage();
+ //mqtt服务器端单向加密
+// SSLSocketFactory socketFactory = MqttSSLSocketFactory.getSingleSocketFactory(context);
+// options.setSocketFactory(socketFactory);
+ //mqtt服务器端单双向加密
+ //SSLSocketFactory socketFactory = MqttSSLSocketFactory.getTwoDirSocketFactory(" ",context);
+ //options.setSocketFactory(socketFactory);
+
+ // 设置回调
+ client.setCallback(new MqttCallbackExtended() {
+
+ @Override
+ public void connectComplete(boolean reconnect, String serverURI) {
+ //连接成功后调用
+ try {
+ client.subscribe(topicReceive,qos);//具体订阅代码
+ } catch (MqttException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void connectionLost(Throwable cause) {
+ //断线后,重新连接
+ try {
+ client.reconnect();
+ } catch (MqttException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void messageArrived(String topic, MqttMessage message) throws Exception {
+ //收到招回指令
+ String callbackStr = new String(message.getPayload());
+ if(callbackStr.length()>0){
+ Log.i("app",callbackStr);
+ }
+ }
+
+ public void deliveryComplete(IMqttDeliveryToken token) {
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void start() {
+ try {
+ message.setQos(qos);
+ message.setRetained(true);
+ SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ String usernameTemp = (String) SPUtils.get(context, Contans.USERID,String.valueOf(""));
+ String passwordTemp = (String) SPUtils.get(context,Contans.USERPWD,String.valueOf(""));
+ String username =RSAUtils.decryptBASE64StrLocal(usernameTemp);
+ String password = RSAUtils.decryptBASE64StrLocal(passwordTemp);
+ String nfc = (String) SPUtils.get(context,Contans.NFCBM,String.valueOf(""));
+ String name = (String) SPUtils.get(context, Contans.USERNAME, String.valueOf(""));
+
+ HashMap mapPush = new HashMap<>();
+ mapPush.put("username",username);
+ mapPush.put("password",password);
+ mapPush.put("date",sd.format(new Date()));
+ mapPush.put("appversion", getVersionName());
+ mapPush.put("nfc",nfc);
+ mapPush.put("name", name);
+ Gson gson = new Gson();
+ try {
+ //判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
+ if (!client.isConnected()) {
+ // 重新连接
+ client.connect(options);
+ // 订阅
+ client.subscribe(topicReceive,qos);
+ }
+ if (client.isConnected()) {//连接成功,跳出连接
+ // 发布消息
+ String messageEn = RSAAndroid.encryptByPublicKeyForSpiltStr(gson.toJson(mapPush),RSAAndroid.publicRsaKey);
+ message.setPayload(messageEn.getBytes());
+ client.publish(topicPush, message);
+ }
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private String getVersionName() {
+ //1,包管理者对象packageManager
+ PackageManager pm = this.context.getPackageManager();
+ //2,从包的管理者对象中,获取指定包名的基本信息(版本名称,版本号),传0代表获取基本信息
+ try {
+ PackageInfo packageInfo = pm.getPackageInfo(this.context.getPackageName(), 0);
+ //3,获取版本名称
+ return packageInfo.versionName;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public void destroyAll() {
+ try {
+ if(client.isConnected()){
+ client.disconnect();
+ }
+ // 关闭客户端
+ client.close();
+ } catch (MqttException e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/NetworkUtil.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/NetworkUtil.java
index 5009d59..0d083a0 100644
--- a/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/NetworkUtil.java
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/NetworkUtil.java
@@ -1,63 +1,84 @@
package com.rehome.bhdxj.utils;
-/**
- * Create By HuangWenFei
- * 创建日期:2023-05-19 15:35
- * 描述:
- */
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
-import android.util.Log;
+/**
+ * Create By HuangWenFei
+ * 创建日期:2023-05-18 16:06
+ * 描述:
+ */
public class NetworkUtil {
private NetworkUtil() {}
/**
- * 当前是否有Wifi网络
+ * 当前是否有网络状态
+ *
* @param context 上下文
+ * @param needWifi 是否需要wifi网络
*/
- public static boolean hasNetWorkWifiStatus(Context context) {
+ public static boolean hasNetWorkStatus(Context context, boolean needWifi) {
NetworkInfo info = getActiveNetwork(context);
if (info == null) {
- //网络服务不可用
- Log.i("app", "网络服务不可用");
return false;
}
- if (info.getType() == ConnectivityManager.TYPE_WIFI) {
- //有WIFI网络
- Log.i("app", "有WIFI网络");
+ if (!needWifi) {
+ return info.isAvailable();
+ } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {
return info.isAvailable();
}
- //无网络
- Log.i("app", "无网络");
return false;
}
/**
- * 当前是否有网络连接状态
+ * 当前网络是否连接wifi状态
*
* @param context 上下文
*/
- public static boolean hasNetWorkStatus(Context context) {
+ public static boolean isWifiNetWorkConnect(Context context) {
NetworkInfo info = getActiveNetwork(context);
if (info == null) {
- //网络服务不可用
- Log.i("app", "网络服务不可用");
return false;
}
- if(info.isAvailable()){
- //有运营商网络
- Log.i("app", "网络可用");
+ if (info.getType() == ConnectivityManager.TYPE_WIFI) {
return info.isAvailable();
}
- //无运营商网络
- Log.i("app", "无网络可用");
return false;
}
+ /**
+ * 当前网络是否连接的运营商网络
+ *
+ * @param context 上下文
+ */
+ public static boolean isISPNetWorkConnect(Context context) {
+ NetworkInfo info = getActiveNetwork(context);
+ if (info == null) {
+ return false;
+ }
+ if (info.getType() == ConnectivityManager.TYPE_WIFI) {
+
+ }else{
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 当前是否有网络连接
+ * @param context 上下文
+ */
+ public static boolean canNetWorkConnect(Context context) {
+ NetworkInfo info = getActiveNetwork(context);
+ if (info == null) {
+ return false;
+ }
+ return true;
+ }
+
/**
* 获取活动网络连接信息
*
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/RSAAndroid.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/RSAAndroid.java
new file mode 100644
index 0000000..2fd0793
--- /dev/null
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/RSAAndroid.java
@@ -0,0 +1,387 @@
+package com.rehome.bhdxj.utils;
+
+
+/**
+ * @ Author : huangwenfei
+ * @ Date : Created in 2022/3/8 14:44 下午
+ * @ Version : $1.0.0.0
+ * @ Description:
+ */
+
+
+import android.util.Base64;
+import java.nio.charset.StandardCharsets;
+import java.security.*;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.List;
+import javax.crypto.Cipher;
+
+public class RSAAndroid {
+ private static String TAG = "RSAAndroid";
+ public static final String RSA = "RSA";// 非对称加密密钥算法
+ /**加密方式,android的*/
+ // public static final String ECB_PKCS1_PADDING = "RSA/None/NoPadding";
+ /**加密方式,标准jdk的*/
+ //public static final String ECB_PKCS1_PADDING = "RSA/None/PKCS1Padding";
+ public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";
+ public static final int DEFAULT_KEY_SIZE = 2048;//秘钥默认长度
+ public static final byte[] DEFAULT_SPLIT = "#PART#".getBytes(); // 当要加密的内容超过bufferSize,则采用partSplit进行分块加密
+ public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;// 当前秘钥支持加密的最大字节数
+ public static String publicRsaKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMLyJw1CAl25lnDgEeYZvOps+1pSi93Q39djEniGNo5uUKVEkqDIayTli2zreX10HqT2jTtDN9APtwuEhWazP/VgOXoWsztbtZtSwJGM6Eg0R9zDCbKyQt5Qhg3jkTrXrvrGn7j/ZP56VNWELv/i5dsRCTccr1MeIyxjOC2pojCOsrTN4HZzgBj+GEUKPRLcKOiPfOsoP7HgkAua82vTOIgWpqIp+1PIfcjjCqzOsSv5PQnGP75+flIXtz75OKo/9hX9zl5JHNcH3SC6nS8Czii9E292XIsBtKdQijvNMn+YcmKFo6mZOUXHdO506NoKkxRny5fbKiPf/oqTA7Zx5QIDAQAB";
+
+ public static byte[] decryptBASE64(String key) throws Exception {
+ return Base64.decode(key, Base64.DEFAULT);
+ }
+
+ public static String encryptBASE64(byte[] key) throws Exception {
+ return Base64.encodeToString(key, Base64.DEFAULT);
+ }
+
+ /**
+ * 随机生成RSA密钥对
+ *
+ * @param keyLength 密钥长度,范围:512~2048
+ * 一般1024
+ * @return
+ */
+ public static KeyPair generateRSAKeyPair(int keyLength) {
+ try {
+ KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);
+ kpg.initialize(keyLength);
+ return kpg.genKeyPair();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 用公钥对字符串进行加密
+ *
+ * @param data 原文
+ */
+ public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
+ // 得到公钥
+ byte[] decoded = Base64.decode(publicKey, Base64.DEFAULT);
+ RSAPublicKey keyPublic = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
+ // 加密数据
+ Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
+ cp.init(Cipher.ENCRYPT_MODE, keyPublic);
+ return cp.doFinal(data);
+ }
+
+ /**
+ * 私钥加密
+ *
+ * @param data 待加密数据
+ * @param privateKey 密钥
+ * @return byte[] 加密数据
+ */
+ public static byte[] encryptByPrivateKey(byte[] data, byte[] privateKey) throws Exception {
+ // 得到私钥
+ byte[] decoded = Base64.decode(privateKey, Base64.DEFAULT);
+ RSAPrivateKey keyPrivate = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
+ // 数据加密
+ Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
+ cipher.init(Cipher.ENCRYPT_MODE, keyPrivate);
+ return cipher.doFinal(data);
+ }
+
+ /**
+ * 公钥解密
+ *
+ * @param data 待解密数据
+ * @param publicKey 密钥
+ * @return byte[] 解密数据
+ */
+ public static byte[] decryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
+ // 得到公钥
+ byte[] decoded = Base64.decode(publicKey, Base64.DEFAULT);
+ RSAPublicKey keyPublic = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
+ // 数据解密
+ Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
+ cipher.init(Cipher.DECRYPT_MODE, keyPublic);
+ return cipher.doFinal(data);
+ }
+
+ /**
+ * 使用私钥进行解密
+ */
+ public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception {
+ // 得到私钥
+ byte[] decoded = Base64.decode(privateKey, Base64.DEFAULT);
+ RSAPrivateKey keyPrivate = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
+
+ // 解密数据
+ Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
+ cp.init(Cipher.DECRYPT_MODE, keyPrivate);
+ byte[] arr = cp.doFinal(encrypted);
+ return arr;
+ }
+
+ /**
+ * 用公钥对字符串进行分段加密
+ */
+ public static byte[] encryptByPublicKeyForSpilt(byte[] data, byte[] publicKey) throws Exception {
+ int dataLen = data.length;
+ if (dataLen <= DEFAULT_BUFFERSIZE) {
+ return encryptByPublicKey(data, publicKey);
+ }
+ List allBytes = new ArrayList(2048);
+ int bufIndex = 0;
+ int subDataLoop = 0;
+ byte[] buf = new byte[DEFAULT_BUFFERSIZE];
+ for (int i = 0; i < dataLen; i++) {
+ buf[bufIndex] = data[i];
+ if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {
+ subDataLoop++;
+ if (subDataLoop != 1) {
+ for (byte b : DEFAULT_SPLIT) {
+ allBytes.add(b);
+ }
+ }
+ byte[] encryptBytes = encryptByPublicKey(buf, publicKey);
+ for (byte b : encryptBytes) {
+ allBytes.add(b);
+ }
+ bufIndex = 0;
+ if (i == dataLen - 1) {
+ buf = null;
+ } else {
+ buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];
+ }
+ }
+ }
+ byte[] bytes = new byte[allBytes.size()];
+ {
+ int i = 0;
+ for (Byte b : allBytes) {
+ bytes[i++] = b.byteValue();
+ }
+ }
+ return bytes;
+ }
+
+
+
+ /**
+ * 使用私钥分段加密
+ *
+ * @param data 要加密的原始数据
+ * @param privateKey 秘钥
+ */
+ public static byte[] encryptByPrivateKeyForSpilt(byte[] data, byte[] privateKey) throws Exception {
+ int dataLen = data.length;
+ if (dataLen <= DEFAULT_BUFFERSIZE) {
+ return encryptByPrivateKey(data, privateKey);
+ }
+ List allBytes = new ArrayList(2048);
+ int bufIndex = 0;
+ int subDataLoop = 0;
+ byte[] buf = new byte[DEFAULT_BUFFERSIZE];
+ for (int i = 0; i < dataLen; i++) {
+ buf[bufIndex] = data[i];
+ if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {
+ subDataLoop++;
+ if (subDataLoop != 1) {
+ for (byte b : DEFAULT_SPLIT) {
+ allBytes.add(b);
+ }
+ }
+ byte[] encryptBytes = encryptByPrivateKey(buf, privateKey);
+ for (byte b : encryptBytes) {
+ allBytes.add(b);
+ }
+ bufIndex = 0;
+ if (i == dataLen - 1) {
+ buf = null;
+ } else {
+ buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];
+ }
+ }
+ }
+ byte[] bytes = new byte[allBytes.size()];
+ {
+ int i = 0;
+ for (Byte b : allBytes) {
+ bytes[i++] = b.byteValue();
+ }
+ }
+ return bytes;
+ }
+
+ /**
+ * 公钥分段解密
+ *
+ * @param encrypted 待解密数据
+ * @param publicKey 密钥
+ */
+ public static byte[] decryptByPublicKeyForSpilt(byte[] encrypted, byte[] publicKey) throws Exception {
+ int splitLen = DEFAULT_SPLIT.length;
+ if (splitLen <= 0) {
+ return decryptByPublicKey(encrypted, publicKey);
+ }
+ int dataLen = encrypted.length;
+ List allBytes = new ArrayList(1024);
+ int latestStartIndex = 0;
+ for (int i = 0; i < dataLen; i++) {
+ byte bt = encrypted[i];
+ boolean isMatchSplit = false;
+ if (i == dataLen - 1) {
+ // 到data的最后了
+ byte[] part = new byte[dataLen - latestStartIndex];
+ System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
+ byte[] decryptPart = decryptByPublicKey(part, publicKey);
+ for (byte b : decryptPart) {
+ allBytes.add(b);
+ }
+ latestStartIndex = i + splitLen;
+ i = latestStartIndex - 1;
+ } else if (bt == DEFAULT_SPLIT[0]) {
+ // 这个是以split[0]开头
+ if (splitLen > 1) {
+ if (i + splitLen < dataLen) {
+ // 没有超出data的范围
+ for (int j = 1; j < splitLen; j++) {
+ if (DEFAULT_SPLIT[j] != encrypted[i + j]) {
+ break;
+ }
+ if (j == splitLen - 1) {
+ // 验证到split的最后一位,都没有break,则表明已经确认是split段
+ isMatchSplit = true;
+ }
+ }
+ }
+ } else {
+ // split只有一位,则已经匹配了
+ isMatchSplit = true;
+ }
+ }
+ if (isMatchSplit) {
+ byte[] part = new byte[i - latestStartIndex];
+ System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
+ byte[] decryptPart = decryptByPublicKey(part, publicKey);
+ for (byte b : decryptPart) {
+ allBytes.add(b);
+ }
+ latestStartIndex = i + splitLen;
+ i = latestStartIndex - 1;
+ }
+ }
+ byte[] bytes = new byte[allBytes.size()];
+ {
+ int i = 0;
+ for (Byte b : allBytes) {
+ bytes[i++] = b.byteValue();
+ }
+ }
+ return bytes;
+ }
+
+ /**
+ * 使用私钥分段解密
+ */
+ public static byte[] decryptByPrivateKeyForSpilt(byte[] encrypted, byte[] privateKey) throws Exception {
+ int splitLen = DEFAULT_SPLIT.length;
+ if (splitLen <= 0) {
+ return decryptByPrivateKey(encrypted, privateKey);
+ }
+ int dataLen = encrypted.length;
+ List allBytes = new ArrayList(1024);
+ int latestStartIndex = 0;
+ for (int i = 0; i < dataLen; i++) {
+ byte bt = encrypted[i];
+ boolean isMatchSplit = false;
+ if (i == dataLen - 1) {
+ // 到data的最后了
+ byte[] part = new byte[dataLen - latestStartIndex];
+ System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
+ byte[] decryptPart = decryptByPrivateKey(part, privateKey);
+ for (byte b : decryptPart) {
+ allBytes.add(b);
+ }
+ latestStartIndex = i + splitLen;
+ i = latestStartIndex - 1;
+ } else if (bt == DEFAULT_SPLIT[0]) {
+ // 这个是以split[0]开头
+ if (splitLen > 1) {
+ if (i + splitLen < dataLen) {
+ // 没有超出data的范围
+ for (int j = 1; j < splitLen; j++) {
+ if (DEFAULT_SPLIT[j] != encrypted[i + j]) {
+ break;
+ }
+ if (j == splitLen - 1) {
+ // 验证到split的最后一位,都没有break,则表明已经确认是split段
+ isMatchSplit = true;
+ }
+ }
+ }
+ } else {
+ // split只有一位,则已经匹配了
+ isMatchSplit = true;
+ }
+ }
+ if (isMatchSplit) {
+ byte[] part = new byte[i - latestStartIndex];
+ System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
+ byte[] decryptPart = decryptByPrivateKey(part, privateKey);
+ for (byte b : decryptPart) {
+ allBytes.add(b);
+ }
+ latestStartIndex = i + splitLen;
+ i = latestStartIndex - 1;
+ }
+ }
+ byte[] bytes = new byte[allBytes.size()];
+ {
+ int i = 0;
+ for (Byte b : allBytes) {
+ bytes[i++] = b.byteValue();
+ }
+ }
+ return bytes;
+ }
+
+ /**
+ * 用公钥对字符串进行分段加密
+ */
+ public static String encryptByPublicKeyForSpiltStr(String data, String publicKey) throws Exception {
+ byte[] encryptBytes = encryptByPublicKeyForSpilt(data.getBytes(StandardCharsets.UTF_8), publicKey.getBytes());
+ return encryptBASE64(encryptBytes);
+ }
+
+ /**
+ * 使用私钥分段加密
+ *
+ * @param data 要加密的原始数据
+ * @param privateKey 秘钥
+ */
+ public static String encryptByPrivateKeyForSpiltStr(String data, String privateKey) throws Exception {
+ byte[] encryptBytes = encryptByPrivateKeyForSpilt(data.getBytes(StandardCharsets.UTF_8), privateKey.getBytes());
+ return encryptBASE64(encryptBytes);
+ }
+
+ /**
+ * 公钥分段解密
+ *
+ * @param encrypted 待解密数据
+ * @param publicKey 密钥
+ */
+ public static String decryptByPublicKeyForSpiltStr(String encrypted, String publicKey) throws Exception {
+ byte[] decryptBytes = decryptByPublicKeyForSpilt(decryptBASE64(encrypted), publicKey.getBytes());
+ return new String(decryptBytes,StandardCharsets.UTF_8);
+ }
+
+ /**
+ * 使用私钥分段解密
+ */
+ public static String decryptByPrivateKeyForSpiltStr(String encrypted, String privateKey) throws Exception {
+ byte[] decryptBytes = decryptByPrivateKeyForSpilt(decryptBASE64(encrypted), privateKey.getBytes());
+ return new String(decryptBytes,StandardCharsets.UTF_8);
+ }
+}
\ No newline at end of file
diff --git a/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/RSAUtils.java b/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/RSAUtils.java
new file mode 100644
index 0000000..055220b
--- /dev/null
+++ b/BHDXJ/app/src/main/java/com/rehome/bhdxj/utils/RSAUtils.java
@@ -0,0 +1,553 @@
+package com.rehome.bhdxj.utils;
+
+
+import android.util.Base64;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.crypto.Cipher;
+
+
+public class RSAUtils {
+
+ /**
+ * RSA算法
+ */
+ public static final String RSA = "RSA";
+ private static final String PUBLIC_KEY = "RSAPublicKey";
+ private static final String PRIVATE_KEY = "RSAPrivateKey";
+ public static final int DEFAULT_KEY_SIZE = 2048;//秘钥默认长度
+
+ //RSA最大加密明文大小 1024位是117 算法 最大加密明文大小 = 1024(bit) / 8 - 11(byte) = 117 byte 最大加密明文大小 = 2048(bit) / 8 - 11(byte) = 245 byte
+ //private static final int MAX_ENCRYPT_BLOCK = 245;
+ private static final int MAX_ENCRYPT_BLOCK = (DEFAULT_KEY_SIZE / 8) - 11;
+ //RSA最大解密密文大小 1024位是128 2048位是 256 依此类推
+ //private static final int MAX_DECRYPT_BLOCK = 256;
+ private static final int MAX_DECRYPT_BLOCK = DEFAULT_KEY_SIZE / 8;
+ //java默认加密填充方式 RSA 对应安卓 RSA/None/PKCS1Padding
+ //public static final String ECB_None_PKCS1_PADDING = "RSA";
+ //安卓手机加密填充方式用 RSA/None/PKCS1Padding
+ public static final String ECB_None_PKCS1_PADDING = "RSA/None/PKCS1Padding";
+
+ public static final String public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnRh8MAqfpBZffouPsU3hToRZl3soo2ntYU4psQtc72QOvnprQ6Ua6UBY0WqemCJF/KxQ8p+vY7/r5eZ97Fw7Sq40PQTNKvyxFQuMGRAO8xTahSn2/79KViq7mVVLm2UAH8QaFmq7rJJbkCif3I1yiFMqzOF41ak231GF8eD62gr9+DFLiR1UKjv+/qXG4UjFQM6pa0cD1kAOsoYz0dSQlHFMbOaVf+VEWxSqFjKPiep6bYoViTlMRkdLqbUbHr/xk67C8lGqWO7wnB32T0+fYwnFWF952OJ9kov9oSnvOFXa+NwlAe7m2hZtFnW/NoBX1WxkQ6zTTTxJb8sRNft7qQIDAQAB";
+ public static final String private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCdGHwwCp+kFl9+i4+xTeFOhFmXeyijae1hTimxC1zvZA6+emtDpRrpQFjRap6YIkX8rFDyn69jv+vl5n3sXDtKrjQ9BM0q/LEVC4wZEA7zFNqFKfb/v0pWKruZVUubZQAfxBoWaruskluQKJ/cjXKIUyrM4XjVqTbfUYXx4PraCv34MUuJHVQqO/7+pcbhSMVAzqlrRwPWQA6yhjPR1JCUcUxs5pV/5URbFKoWMo+J6nptihWJOUxGR0uptRsev/GTrsLyUapY7vCcHfZPT59jCcVYX3nY4n2Si/2hKe84Vdr43CUB7ubaFm0Wdb82gFfVbGRDrNNNPElvyxE1+3upAgMBAAECggEAOcphHRc7ZRSp6paStMoOoWDEyJoQ+BSms84aPjwM4y/u0JmeThM11CrMwbU0RIkPMAV//dFKpypaMIfbOREw6qctJmlWxIKS7kgCMNIcfcXlIWmvqKOJSCuOObkMCE1ef1EXu7ll8vUgY+bd8DfEs2vM6fPkDM2kFwEZgkKeZYlkFcLLy8V701seLtNzbPaqAUa44S6m0DVH7gojad8+Ni/XsdNzSrd8Y2930M8LVZoOTLrwskJaF2v/WvjM3blOtHxLqDfXfD4uRm12b1SNzPx2djlL6vNptwbpYAtPOYol8W0LxJH2AHbTrUFv/KJdyuD4NVGSnGpYtWzD7QQetQKBgQDLqfaiq0uHQerAc3M30pOZSDF8PtiBd1jdqFoOVhuADkp4LPXm54s5evEi2r3tl4x8cAvUo6WaxDlG3IFO0POLcZY+Xf2sMhwMAxiwWqLVRGirjr6QAfnmWAToqqyh8brxNti4MC3X/yudrd6x/VJ1lQ3Pooiihf4Ir74QuY7wqwKBgQDFdwbFou07bQmxCElgC5MF78Aevn5JzsniGU2RhpxG7ajf2T9n6AjtVfvYLy6iYsfLm6RGC2uofBjMgL920ePXBSDv0fk1UEVoR/vCtspyCLBVXELdSS5DCnux1F15vKAJZQyODGyEv0d8h97qKRaq14EW75e9vPx4ahxXgaiM+wKBgGE0AonK9aZdmJw3veMDtvxuj2e8WvsXqitIwYqcIE3zBCntU4PcOP+7JMG84u816JAvrgXUASMnyip+7ZxfcA26rbmghIUd+XLmO29YIuVk3AwdeegjeVEt61Hcu74jMFUWF0N5gzfXCsscA/Cxdhy2gjv6V/oxt3gP4Mf8uDM3AoGAJMVhcXRBkQtg/qJ4Z3ZATp6yvAblJYFofr4Pf8X9XAftpqGh+QtwfiHA4CUJHhwe8H9vO8vspFdXlt1yygGT1/qQg5gqPA9SnXSqITxAvrN3gq3HlcWG490T462UKpNBif5TNDCEFMQ536q9jAVSv0WaOFctfpuuuA2qcXEnnfkCgYEAuFWzis7ICtcZTr8CZOC7FeVL6URzI1akwRlHDHRUrNRCTf47HGUG9bCC6N+v6ex7TD2XlaB0g3U9XXjYRyk9T2AWfgzPvgvw7H+tI9r+9yyDlUbb2pvaKdVQIgCnJ6Hg7Qw7MuwzjEiXLF7HMy5CFnrVnHAjYrNe1Gqgo0v3rsY=";
+ public static final String public_key_client = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu0jZXvlRCBOX5R2wW7a+A6dciQD2F2DQqOOaVyPGH1fQxBdVn/HfgiBYXPDIodaSSTDcl1rjlepUiAZjyTpzieZgDo6txy5ncB1ts85frc0DF08zn+zztj4g9zIU7Q8pzxYJ+2wI1XcNzt0eaWBCU7DZKjjp5iRTuKNcLJ5VLe0w8PfvG+AwqGDN+j+523V79o81pdhBJ5hzWhdkzO62X2Va7EjcQ9kpDNDsafqXzhXEyf7LiEsyQkDWzWCZuZN7DQhKriJepfrFqCqlkUHtjd6LSwloEqxYdrfTHuKxxLEUJF+051vrEafwAVM2Sg65nqWbPI11E2DBbr3wSNVYKQIDAQAB";
+ public static final String private_key_client= "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC7SNle+VEIE5flHbBbtr4Dp1yJAPYXYNCo45pXI8YfV9DEF1Wf8d+CIFhc8Mih1pJJMNyXWuOV6lSIBmPJOnOJ5mAOjq3HLmdwHW2zzl+tzQMXTzOf7PO2PiD3MhTtDynPFgn7bAjVdw3O3R5pYEJTsNkqOOnmJFO4o1wsnlUt7TDw9+8b4DCoYM36P7nbdXv2jzWl2EEnmHNaF2TM7rZfZVrsSNxD2SkM0Oxp+pfOFcTJ/suISzJCQNbNYJm5k3sNCEquIl6l+sWoKqWRQe2N3otLCWgSrFh2t9Me4rHEsRQkX7TnW+sRp/ABUzZKDrmepZs8jXUTYMFuvfBI1VgpAgMBAAECggEAL7KfAcw3cfojfkuwZbtF64JNU+s1wcB7g/frj/PheowP9FEJEqI0TVzVhF4iiu0t9owGMloIil7Sxo3yDgbf9CgDINH/ujG8UFZ+YQPXZFlJRz95o2piq3BpTuunXrS07jPruOfL3CnlD2FLZIUKf2wT8ufp0h5AYE7io85zXS2SvzlWuchA1bzGCGZc88zr5VWcbDGHXWG7PDd8VgEEb69UUP6H0IWWEAeHwOeqZ9sJHcvhwx93ecQ+evXHztRYouJ0WzQOOEKKHgID+ImcpYpyAbSeWfacyOHx6UVu+2fL88jyhhz20OQLVCBp2MzIHPPez0l/LJ/OveeKC3lLvQKBgQDNl+Kj7DfhcjvzLBML6tAE73tiGt6QbMf9frVq4J+oAM9tW862WsZgAAOSkkG+fUuIF0FmvQ4mRPs8R2s4etC5n5G3wEbLPJruF2yEngONI8bI9i+yzx/xVl3Pru85QOBvpxpxCPx2uxK/LzE5PfnWPqRwQ7+BiLMVLigM/bn+nwKBgQDpM8+9CQ2S/RA6qao6Sr3LiLATA0y0ShjEiii2ZkCxgTyl004xhSxj45ijkFmJRqUix7yt/CGZQq3JxnrWAEH1Y0r/AM8F7sTtKu37fLyCoVpQ4HlyyCCVVLvTExOZYsf8lGLJB2DOJGKK5V69uvOLqc8zmsPSSbVlvAC+6ZHcNwKBgDWXIMmv2kUW3M+fLnvNwll2/0dsT5V/9YV7UNjCInvNckRESRa5hLojZsr++sonqNeZkD+yigypsH9e8nDvepbYJEisgweZDZ2AV5YeBjj1GWzq1zYZzW7AH4XySIM5CQexnC/Yss5UJyfUqlUMdaJGA+ELl9CxDFU6CdCRFrlrAoGAR2tVuNgX7ydPnBewCZAwVjAzdG8zQ5fZw/9n/oyMTZB96W8waFwXvzPJ4HXp5e/bzS4Mq+AmzhAstznxDq8fhC53nmc5/+AjMVtPbRDDjuIpjdFhgHSn/fPoXflerEAjbUhohJac4CUmhNFAVaz2v5Qu3+gLBtEKG/Ea7V0NDbsCgYAocw/DFV5hAyQHyVwPNtsSd/vF+iGSyJJxqBPXW36fLNzdkoZL8TNGWeuyTloZbsXBorYESTX+1522xAFr7FcQpoQRjEOAuloqc5+C03D0fSrdczbxyHQMVTvsdFbfKWaQO4EjDrZqFA50h3rhY3ZosT8IS5npZQ7ifR3B1DCfdQ==";
+ public static final String public_key_local = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/lhQRyFMV5LLJz9jFjY+ZW/79wEuujDJjy8YxlxqfST+FUUOytH46fLRd5m4s4Nj7L03hssz0H0M1pKiUzUzp6ulSC8GH2/uZzBq47agre9bW0A+Uu0IiCwfOc0J1L1UlLm/wWRGW0Sw51OHYAs99irjhxdGFOVv/mS9FzzxmBRFOwUXFD8iXyEKI8xkteyHGniKRwBYoWR32kQw7H/Mnpamo1fCrHA6Dg55CBeIEkg2oyPGKzvhkPVopJzj9zukW8w2F0iR5ll0QBl7XzGyy3EHmIsYsod3LSIh1g5A2zsscJ0ouorKGLwY1LK06a34JTkYz5p7lx6Nn6589Re8GwIDAQAB";
+ public static final String private_key_local = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQD+WFBHIUxXkssnP2MWNj5lb/v3AS66MMmPLxjGXGp9JP4VRQ7K0fjp8tF3mbizg2PsvTeGyzPQfQzWkqJTNTOnq6VILwYfb+5nMGrjtqCt71tbQD5S7QiILB85zQnUvVSUub/BZEZbRLDnU4dgCz32KuOHF0YU5W/+ZL0XPPGYFEU7BRcUPyJfIQojzGS17IcaeIpHAFihZHfaRDDsf8yelqajV8KscDoODnkIF4gSSDajI8YrO+GQ9WiknOP3O6RbzDYXSJHmWXRAGXtfMbLLcQeYixiyh3ctIiHWDkDbOyxwnSi6isoYvBjUsrTprfglORjPmnuXHo2frnz1F7wbAgMBAAECggEAakyCkJfMDjWdjjOht+DHxyE8TwlBfDNzqdHnKs/o+ZCCWGVaP03uF+iRvsiSNwRMuN6D3GQErbf1q5/xE5GCmyrTkw2EI5NmMd48bhsfoFIO/l4lLgc+r5qxGjklSLIwLVBMYgkElpRo0uVICM3qAX3/RbBma8lQOyPjG1kvJ31L/xYN4DbfOfumqs3Eb06ZNvPEP0BnbbVFp6NiOcBvLipQxrhnMob5MDyPWEjcBeV/IssK3ZvrzjsqF1Ckz8KNUKGfDq4DHM7YzkLBySDIiOZHSBfimzc8fxtDFZpMOOBbEZJ0sGlTeftv5Zd0KHWD0OBWBeSHeVFRBc5RCPO38QKBgQD/rPC5Jr2Sgp3tKrRyEztYZrce0ecYvsxYZRgQpSxLF+rd8Z8ftH/MHPEdnYZjLWFPDrd+R3eEEr5B2t2sfKUWE/PA97RvSp/Uqv0xKoetX8JopeZ6X/3PRb9bQFWRe2dPBSA5mKx8MIOIhfr2qjdepDF+Lejn4pCFDSs8BLpPbQKBgQD+qvDlusQ1IvBi19DnKqx3iLvgHFHYb/GcrFzqfQZewGZLH7yoBo4zXZLT2Np+DW7K8IC3JOLNhLrvD1V8+bmOwW84Foo62Gvm1GPm8nxbgTCqg+ns5bV0xoHXdN1v4dAgeOBqYrIFkmSfxpB4usij8yFMZkN7PNZ3KwQYqZYcpwKBgQDS+qKqJo3ImIA5dUPx3mzaRehWRl+sy8VULBfvpF0omlP1Ua09PHU4uak+Bv8eWBQ0aLCCQ/cbxVu6fCDwdOrFjTFXyw/Zxnqdw3urVq0fJCYItN27nfqTT7rYUf5KTsqxKkmtPY8X6/Ced/DgGxYVwugUd036C7u2D2fd3wjfAQKBgQCfHkduAofde3sfByFrjmo8NZ7NpGQvC6K29asIiB2Wzjgb8DR797yZs3muC+xYniP/gM2roMxlBO2XuMj9UTrzS0Emlk6//cFNdJ8HCbNRqSKzJ8DdV5lM4Ur3R/mjkj/sShpN3mTEvndIrVRPWsVKSvsfNTYsphKKWsIwdqVoOQKBgQD5ibg09UHs0dHiaOn0lKsUFb25q+ylu4NLIU6gh/xi7sJ2huRA2gElPwkUsCIzH+/TTiIdvs1WuoBCvvCWL6a7xchN1+nve2fw4ohNHWupcTNWX1k1pNFHXjhtaUMes7zTTy6wBDbkbM7yTQLtB8/VMzMpuzg6UZPw3Hv8sIOz+w==";
+ public static final String public_key_mqtt = "MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEAujmJWv1QTJU1uS/t0Tj0ms9dPuYtZeuxCCAvc93/6JvxAON6UyfniL4hScOzwDqR74GsOtYC5O1JNi4VGn4XU6XKt30o+/cCJeSaynmcVRBnkbjpo4pvE/97//GEwHbhPSsHRv2GmURx/wEZKGhlAceMu3xMs1slhD2gmGlfoZTdMULUN7xIbN5wgwZbcGs+XD+eaGEkE6xOyJdthKnsoYq+7lsfl0668231374zIDMSYCkcES5v86jr0HG4TVYymBbD33/WAJ0ISyBP+LMboasw62QoVrwPYXkWIqfiFFHwpi/TqyjJef8bM4bUuW2vqfFCMRZb23NKIseSvjgJu62FlQAPFgw8U5/i1yRGyFJPryJP0dJS07uv5k+J5iSKabvjp0RWkVLwgUzctQKjJhx+cE9bOPXgAGp7dczumjMPlOVm7AGEsAAlDNHNcDksKssy91kl3tkkj987/0P534TehtKvZ43W2XoOSyA0nPxfb/hxb6cLo3D1OD9Favc5WkSUgnYS8Kc+wwOPpUl8eveGLWjbdd8tFGpq8jW2Nrrk584zqu6OqgE9BqHC4NwnMkd1ZmwVBC7aUB+BuVgKxb+lRXRzoYOeCYYdn4Rg0yEdSJcCTwEEwJqouAD/eCkj2KVpz2lTr1zut8w4oDwk9BYe/9R5fz9/yE+M06MAG60ys4Ac0IpfERQP8VP3a+JuTZGPvan/CSq4nGdvd/+R+aZHcQUJDXk1YzSPZFezrLIVZQe0u0HbIIfPhLHmEwCAXzhM1Ise4xC8XHOytlJw3drkNAsJN9sZ9UePLZMEkggLYgzsgSZ11tRgObA/OXPW4/fd71RO/MZmH9DLv7blCkLomTKinKDiO7MsQvjIQaDKgOVX8Db8UvVcolZLHy48c6vUbJFVXRo2ds/1MK5sgDBNGzNTX/QkPuQS+IDnh4g4edbU0tfwTzkcawHShMza+QQfcHRu5hgpurGv4CApcVWIZn49T/ElJMbSSQczbF6f08piXs8hlyUYBhFjdQJNp3Imuii2c1M10rOGn1PHR0yIay6+L1toDn6ASJksY1FCNSkzpv5utykEKf0Hq2+HX0Wi1Umdl/tndqBVXygSgi4SSu/j5iZtSnjwb1DxQKvO5LLNxxdtEJLsEpQii5LlWr7MjkcsR7zHhzzkqWIAsIbaiwuasMcRkYbAjYFcIH4mSZCTACvsTDxm+hB0GxVmGEfEgknphVm0Yqa7/NXcz9bL856ez5IemmiavfntBS8uhet3m4FYa0FolJF0YdlJa0LCXW/QQYa/PltBFx9xY9nveEp08f+DXUPzJ+0puX3qxLIMyazTfM4mWgxxPmMQOFTNwGwtNGMP6Ncbd6V4oQIDAQAB";
+ public static final String private_key_mqtt = "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";
+
+ public static byte[] decryptBASE64(String key) throws Exception {
+ return Base64.decode(key, Base64.NO_WRAP);
+ //return Base64.decode(key);
+ }
+
+ public static String encryptBASE64(byte[] key) throws Exception {
+ return Base64.encodeToString(key, Base64.NO_WRAP);
+ //return Base64.encode(key);
+ }
+
+ public static String decryptBASE64Str(String encryptString) {
+ try {
+ byte[] decodeByte = decryptBASE64(encryptString);
+ return new String(decryptByPrivateKeyLongText(decodeByte, private_key),java.nio.charset.StandardCharsets.UTF_8);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+
+ public static String decryptBASE64StrClient(String encryptString) {
+ try {
+ byte[] decodeByte = decryptBASE64(encryptString);
+ return new String(decryptByPrivateKeyLongText(decodeByte, private_key_client),java.nio.charset.StandardCharsets.UTF_8);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String decryptBASE64StrByPublic(String encryptString) {
+ try {
+ byte[] decodeByte = decryptBASE64(encryptString);
+ return new String(decryptByPublicKeyLongText(decodeByte, public_key),java.nio.charset.StandardCharsets.UTF_8);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String decryptBASE64StrLocal(String encryptString) {
+ try {
+ byte[] decodeByte = decryptBASE64(encryptString);
+ return new String(decryptByPrivateKeyLongText(decodeByte, private_key_local),java.nio.charset.StandardCharsets.UTF_8);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String decryptBASE64StrMqtt(String encryptString) {
+ try {
+ byte[] decodeByte = decryptBASE64(encryptString);
+ return new String(decryptByPrivateKeyLongText(decodeByte, private_key_mqtt),java.nio.charset.StandardCharsets.UTF_8);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String encryptBASE64Str(String text) {
+ try {
+ return encryptBASE64(encryptByPublicKeyLongText(text.getBytes( java.nio.charset.StandardCharsets.UTF_8), public_key));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String encryptBASE64StrClient(String text) {
+ try {
+ return encryptBASE64(encryptByPublicKeyLongText(text.getBytes( java.nio.charset.StandardCharsets.UTF_8), public_key_client));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String encryptBASE64StrLocal(String text) {
+ try {
+ return encryptBASE64(encryptByPublicKeyLongText(text.getBytes( java.nio.charset.StandardCharsets.UTF_8), public_key_local));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String encryptBASE64StrMqtt(String text) {
+ try {
+ return encryptBASE64(encryptByPublicKeyLongText(text.getBytes( java.nio.charset.StandardCharsets.UTF_8), public_key_mqtt));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ /**
+ * 解密
+ * 用私钥解密
+ *
+ * @param data
+ * @param key
+ * @return
+ * @throws Exception
+ */
+ public static byte[] decryptByPrivateKey(byte[] data, String key)
+ throws Exception {
+ // 对密钥解密
+ byte[] keyBytes = decryptBASE64(key);
+ // 取得私钥
+ PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+ Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
+ // 对数据解密
+ Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
+ cipher.init(Cipher.DECRYPT_MODE, privateKey);
+ return cipher.doFinal(data);
+ }
+
+ /**
+ * 私钥分段解密
+ * @param encryptedData
+ * @param privateKey
+ * @return
+ * @throws Exception
+ */
+ public static byte[] decryptByPrivateKeyLongText(byte[] encryptedData, String privateKey) throws Exception {
+
+ byte[] keyBytes = decryptBASE64(privateKey);
+ PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+ Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
+ Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
+ cipher.init(Cipher.DECRYPT_MODE, privateK);
+
+ int inputLen = encryptedData.length;
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int offSet = 0;
+ byte[] cache;
+ int i = 0;
+ // 对数据分段解密
+ while (inputLen - offSet > 0) {
+ if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
+
+ cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
+ } else {
+ cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
+ }
+ out.write(cache, 0, cache.length);
+ i++;
+ offSet = i * MAX_DECRYPT_BLOCK;
+ }
+ byte[] decryptedData = out.toByteArray();
+ out.close();
+ return decryptedData;
+ }
+
+ /**
+ * 解密
+ * 用公钥解密
+ *
+ * @param data
+ * @param key
+ * @return
+ * @throws Exception
+ */
+ public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception {
+ // 对密钥解密
+ byte[] keyBytes = decryptBASE64(key);
+ // 取得公钥
+ X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+ Key publicKey = keyFactory.generatePublic(x509KeySpec);
+ // 对数据解密
+ Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
+ cipher.init(Cipher.DECRYPT_MODE, publicKey);
+ return cipher.doFinal(data);
+ }
+
+ /**
+ * 用公钥分段解密
+ * @param encryptedData
+ * @param publicKey
+ * @return
+ * @throws Exception
+ */
+ public static byte[] decryptByPublicKeyLongText(byte[] encryptedData, String publicKey) throws Exception {
+
+ byte[] keyBytes = decryptBASE64(publicKey);
+
+ X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
+
+ KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+
+ Key publicK = keyFactory.generatePublic(x509KeySpec);
+
+ Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
+
+ cipher.init(Cipher.DECRYPT_MODE, publicK);
+
+ int inputLen = encryptedData.length;
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ int offSet = 0;
+
+ byte[] cache;
+
+ int i = 0;
+
+ // 对数据分段解密
+
+ while (inputLen - offSet > 0) {
+
+ if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
+
+ cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
+
+ } else {
+
+ cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
+
+ }
+
+ out.write(cache, 0, cache.length);
+
+ i++;
+
+ offSet = i * MAX_DECRYPT_BLOCK;
+
+ }
+
+ byte[] decryptedData = out.toByteArray();
+
+ out.close();
+
+ return decryptedData;
+
+ }
+
+
+ /**
+ * 加密
+ * 用公钥加密
+ *
+ * @param data
+ * @param key
+ * @return
+ * @throws Exception
+ */
+ public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {
+ // 对公钥解密
+ byte[] keyBytes = decryptBASE64(key);
+ // 取得公钥
+ X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+ Key publicKey = keyFactory.generatePublic(x509KeySpec);
+ // 对数据加密
+ Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
+ cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+ return cipher.doFinal(data);
+ }
+
+ /**
+ * 用公钥分段加密
+ * @param data
+ * @param publicKey
+ * @return
+ * @throws Exception
+ */
+ public static byte[] encryptByPublicKeyLongText(byte[] data, String publicKey) throws Exception {
+
+ byte[] keyBytes = decryptBASE64(publicKey);
+
+ X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
+
+ KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+
+ Key publicK = keyFactory.generatePublic(x509KeySpec);
+
+ // 对数据加密
+
+ Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
+
+ cipher.init(Cipher.ENCRYPT_MODE, publicK);
+
+ int inputLen = data.length;
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ int offSet = 0;
+
+ byte[] cache;
+
+ int i = 0;
+
+ // 对数据分段加密
+
+ while (inputLen - offSet > 0) {
+
+ if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
+
+ cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
+
+ } else {
+
+ cache = cipher.doFinal(data, offSet, inputLen - offSet);
+
+ }
+
+ out.write(cache, 0, cache.length);
+
+ i++;
+
+ offSet = i * MAX_ENCRYPT_BLOCK;
+
+ }
+
+ byte[] encryptedData = out.toByteArray();
+
+ out.close();
+
+ return encryptedData;
+
+ }
+
+ /**
+ * 加密
+ * 用私钥加密
+ *
+ * @param data
+ * @param key
+ * @return
+ * @throws Exception
+ */
+ public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception {
+ // 对密钥解密
+ byte[] keyBytes = decryptBASE64(key);
+ // 取得私钥
+ PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+ Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
+ // 对数据加密
+ Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
+ cipher.init(Cipher.ENCRYPT_MODE, privateKey);
+ return cipher.doFinal(data);
+ }
+
+ /**
+ * 用私钥分段加密
+ * @param data
+ * @param privateKey
+ * @return
+ * @throws Exception
+ */
+ public static byte[] encryptByPrivateKeyLongText(byte[] data, String privateKey) throws Exception {
+
+ byte[] keyBytes = decryptBASE64(privateKey);
+
+ PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+
+ KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+
+ Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
+
+ Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
+
+ cipher.init(Cipher.ENCRYPT_MODE, privateK);
+
+ int inputLen = data.length;
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ int offSet = 0;
+
+ byte[] cache;
+
+ int i = 0;
+
+ // 对数据分段加密
+
+ while (inputLen - offSet > 0) {
+
+ if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
+
+ cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
+
+ } else {
+
+ cache = cipher.doFinal(data, offSet, inputLen - offSet);
+
+ }
+
+ out.write(cache, 0, cache.length);
+
+ i++;
+
+ offSet = i * MAX_ENCRYPT_BLOCK;
+
+ }
+
+ byte[] encryptedData = out.toByteArray();
+
+ out.close();
+
+ return encryptedData;
+
+ }
+
+ /**
+ * 取得私钥
+ *
+ * @param keyMap
+ * @return
+ * @throws Exception
+ */
+ public static String getPrivateKey(Map keyMap)
+ throws Exception {
+ Key key = (Key) keyMap.get(PRIVATE_KEY);
+
+ return encryptBASE64(key.getEncoded());
+ }
+
+ /**
+ * 取得公钥
+ *
+ * @param keyMap
+ * @return
+ * @throws Exception
+ */
+ public static String getPublicKey(Map keyMap)
+ throws Exception {
+ Key key = (Key) keyMap.get(PUBLIC_KEY);
+ return encryptBASE64(key.getEncoded());
+ }
+
+ /**
+ * 初始化密钥
+ *
+ * @return
+ * @throws Exception
+ */
+ public static Map initKey() throws Exception {
+ KeyPairGenerator keyPairGen = KeyPairGenerator
+ .getInstance(RSA);
+ keyPairGen.initialize(DEFAULT_KEY_SIZE);
+ KeyPair keyPair = keyPairGen.generateKeyPair();
+ // 公钥
+ RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
+ // 私钥
+ RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
+ Map keyMap = new HashMap(2);
+ keyMap.put(PUBLIC_KEY, publicKey);
+ keyMap.put(PRIVATE_KEY, privateKey);
+ return keyMap;
+ }
+
+ public static void rsa() {
+ try {
+ Map key = RSAUtils.initKey();
+ String publicKey = RSAUtils.getPublicKey(key);
+ String privateKey = RSAUtils.getPrivateKey(key);
+ String signbypub = RSAUtils.encryptBASE64(RSAUtils.encryptByPublicKey("wenfei".getBytes(), RSAUtils.public_key));
+ byte[] decodeByte = RSAUtils.decryptBASE64(signbypub);
+ String ecodeStr = new String(RSAUtils.decryptByPrivateKey(decodeByte, RSAUtils.private_key));
+ Log.i("app", "-----------公钥------------");
+ Log.i("app", publicKey);
+ Log.i("app", "-----------私钥------------");
+ Log.i("app", privateKey);
+ Log.i("app", "-----------公钥加密------------");
+ Log.i("app", signbypub);
+ Log.i("app", "-----------私钥解密------------");
+ Log.i("app", ecodeStr);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void main(String[] args) {
+ try {
+ Map key = RSAUtils.initKey();
+ String publicKey = RSAUtils.getPublicKey(key);
+ String privateKey = RSAUtils.getPrivateKey(key);
+ String signbypub = RSAUtils.encryptBASE64(RSAUtils.encryptByPublicKey("wenfei".getBytes(), RSAUtils.public_key));
+ byte[] decodeByte = RSAUtils.decryptBASE64(signbypub);
+ String ecodeStr = new String(RSAUtils.decryptByPrivateKey(decodeByte, RSAUtils.private_key));
+ Log.i("app", "-----------公钥------------");
+ Log.i("app", publicKey);
+ Log.i("app", "-----------私钥------------");
+ Log.i("app", privateKey);
+ Log.i("app", "-----------公钥加密------------");
+ Log.i("app", signbypub);
+ Log.i("app", "-----------私钥解密------------");
+ Log.i("app", ecodeStr);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file