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