diff --git a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/activity/LoginActivity.java b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/activity/LoginActivity.java index 1dfaea9..bffc5fe 100755 --- a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/activity/LoginActivity.java +++ b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/activity/LoginActivity.java @@ -147,8 +147,8 @@ public class LoginActivity extends BaseActivity { }); //initNFC(); -// etUse.setText("181145"); -// etPwd.setText("13902576510"); + etUse.setText("181145"); + etPwd.setText("13902576510"); } @@ -254,73 +254,81 @@ public class LoginActivity extends BaseActivity { @Override public void onSucceed(int what, Response response) throws ParseException { String json = response.get(); - Log.i("app", "login-----"); - Log.i("app", json); - - UserInfo userInfo = GsonUtils.GsonToBean(json, UserInfo.class); - //Log.i("app",new Gson().toJson(userInfo)); - if (userInfo != null) { - UserInfo.User user = userInfo.getRows().get(0); - String status = user.getStatus(); - String username = user.getUsernames(); - String token = user.getToken(); - switch (status) { - case "0": - showToast("用户名或密码错误"); - break; - case "1": - SPUtils.put(LoginActivity.this, "save", savePwUser.isChecked()); - SPUtils.put(LoginActivity.this, Contans.USERID, RSAUtils.encryptBASE64StrLocal(etUse.getText().toString())); - SPUtils.put(LoginActivity.this, Contans.USERPWD, RSAUtils.encryptBASE64StrLocal(etPwd.getText().toString())); - SPUtils.put(LoginActivity.this, Contans.LOGIN_TOKEN, RSAUtils.encryptBASE64StrLocal(token)); - SPUtils.put(LoginActivity.this, Contans.USERNAME, username); - SPUtils.put(LoginActivity.this, Contans.REQUEST_ID, RSAUtils.encryptBASE64StrLocal(user.getId())); - SPUtils.put(LoginActivity.this, Contans.BZBH, user.getBzbh() == null ? "" : user.getBzbh()); - SPUtils.put(LoginActivity.this, Contans.BZMC, user.getBzmc() == null ? "" : user.getBzmc()); - SPUtils.put(LoginActivity.this, Contans.PERMISSIONSRESULT, user.getPermissionsResult() == null ? "" : user.getPermissionsResult()); - SPUtils.put(LoginActivity.this, Contans.ZY, user.getZY() == null ? "" : user.getZY()); - SPUtils.remove(context, Contans.NFCBM); - //格式化日期的对象(转化成习惯的时间格式) - SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy年MM月dd日"); - //静态方法getInstance()使用默认时区和语言环境获得一个日历。 - Calendar calendar = Calendar.getInstance(); - //输出当前系统时间; - //System.out.println("当前系统时间: "+sdFormat.format(calendar.getTime())); - //add()增加日期,以天为单位(Calendar封装了很多静态的操作时间的单位) - //增加10天,负数则为减少天数 - calendar.add(Calendar.DATE, 10); - //输出增加10天后的时间; - //System.out.println("增加10天后的时间: "+sdFormat.format(calendar.getTime())); - //输出时间为2020年的第100天 - Date date = sdFormat.parse(sdFormat.format(calendar.getTime())); - Calendar calendarOne = Calendar.getInstance(); - calendarOne.setTime(date); - SPUtils.put(LoginActivity.this, Contans.LASTLOGINDATE, sdFormat.format(calendarOne.getTime())); - //System.out.println("加10天后的日期: "+sdFormat.format(calendarOne.getTime())); - //System.out.println("登录已失效: "+String.valueOf(Calendar.getInstance().after(calendarOne))); - - - Intent intent = new Intent(LoginActivity.this, MainActivity.class); - startActivity(intent); - finish(); - break; - case "2": - showToast("登录异常..."); - break; - case "3": - showToast("未激活或未授权..."); - break; - case "4": - showToast("禁止登陆..."); - break; +// Log.i("app", "login-----"); +// Log.i("app", json); + + String jsonDecode = RSAUtils.decryptBASE64StrByPublic(json); + if(TextUtils.isEmpty(jsonDecode)){ + //showToast(UiUtlis.getString(context, R.string.login_no_connect_to_server)); + showToast("登录异常..."); + }else{ + UserInfo userInfo = GsonUtils.GsonToBean(jsonDecode, UserInfo.class); + //Log.i("app",new Gson().toJson(userInfo)); + //Log.i("app", jsonDecode); + if (userInfo != null) { + UserInfo.User user = userInfo.getRows().get(0); + String status = user.getStatus(); + String username = user.getUsernames(); + String token = user.getToken(); + switch (status) { + case "0": + showToast("用户名或密码错误"); + break; + case "1": + SPUtils.put(LoginActivity.this, "save", savePwUser.isChecked()); + SPUtils.put(LoginActivity.this, Contans.USERID, RSAUtils.encryptBASE64StrLocal(etUse.getText().toString())); + SPUtils.put(LoginActivity.this, Contans.USERPWD, RSAUtils.encryptBASE64StrLocal(etPwd.getText().toString())); + SPUtils.put(LoginActivity.this, Contans.LOGIN_TOKEN, RSAUtils.encryptBASE64StrLocal(token)); + SPUtils.put(LoginActivity.this, Contans.USERNAME, username); + SPUtils.put(LoginActivity.this, Contans.REQUEST_ID, RSAUtils.encryptBASE64StrLocal(user.getId())); + SPUtils.put(LoginActivity.this, Contans.BZBH, user.getBzbh() == null ? "" : user.getBzbh()); + SPUtils.put(LoginActivity.this, Contans.BZMC, user.getBzmc() == null ? "" : user.getBzmc()); + SPUtils.put(LoginActivity.this, Contans.PERMISSIONSRESULT, user.getPermissionsResult() == null ? "" : user.getPermissionsResult()); + SPUtils.put(LoginActivity.this, Contans.ZY, user.getZY() == null ? "" : user.getZY()); + SPUtils.remove(context, Contans.NFCBM); + //格式化日期的对象(转化成习惯的时间格式) + SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy年MM月dd日"); + //静态方法getInstance()使用默认时区和语言环境获得一个日历。 + Calendar calendar = Calendar.getInstance(); + //输出当前系统时间; + //System.out.println("当前系统时间: "+sdFormat.format(calendar.getTime())); + //add()增加日期,以天为单位(Calendar封装了很多静态的操作时间的单位) + //增加10天,负数则为减少天数 + calendar.add(Calendar.DATE, 10); + //输出增加10天后的时间; + //System.out.println("增加10天后的时间: "+sdFormat.format(calendar.getTime())); + //输出时间为2020年的第100天 + Date date = sdFormat.parse(sdFormat.format(calendar.getTime())); + Calendar calendarOne = Calendar.getInstance(); + calendarOne.setTime(date); + SPUtils.put(LoginActivity.this, Contans.LASTLOGINDATE, sdFormat.format(calendarOne.getTime())); + //System.out.println("加10天后的日期: "+sdFormat.format(calendarOne.getTime())); + //System.out.println("登录已失效: "+String.valueOf(Calendar.getInstance().after(calendarOne))); + + + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + finish(); + break; + case "2": + showToast("登录异常..."); + break; + case "3": + showToast("未激活或未授权..."); + break; + case "4": + showToast("禁止登陆..."); + break; + } + } else { + showToast(UiUtlis.getString(context, R.string.login_no_connect_to_server)); } - } else { - showToast(UiUtlis.getString(context, R.string.login_no_connect_to_server)); } } @Override public void onFailed(int what, Response response) { + showToast(UiUtlis.getString(context, R.string.login_no_connect_to_server)); } }; @@ -343,16 +351,17 @@ public class LoginActivity extends BaseActivity { userInfo.setSysversion(sysVersion); userInfo.setPhonemodel(model); userInfo.setPhonenum(""); -// userInfo.setUsername(UiUtlis.getText(etUse)); -// userInfo.setPassword(UiUtlis.getText(etPwd)); + userInfo.setUsername(UiUtlis.getText(etUse)); + userInfo.setPassword(UiUtlis.getText(etPwd)); //公钥加密处理 - userInfo.setUsername(RSAUtils.encryptBASE64Str(UiUtlis.getText(etUse))); - userInfo.setPassword(RSAUtils.encryptBASE64Str(UiUtlis.getText(etPwd))); +// userInfo.setUsername(RSAUtils.encryptBASE64Str(UiUtlis.getText(etUse))); +// userInfo.setPassword(RSAUtils.encryptBASE64Str(UiUtlis.getText(etPwd))); list.add(userInfo); info.setRows(list); String json = GsonUtils.GsonString(info); - Log.i("app", json); - return json; + //Log.i("app", json); + //Log.i("app",RSAUtils.encryptBASE64Str(json)); + return RSAUtils.encryptBASE64Str(json)+"1"; } public String getNfcInfo(String nfcId) { diff --git a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/activity/MainActivity.java b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/activity/MainActivity.java index a192581..7f70cb4 100644 --- a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/activity/MainActivity.java +++ b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/activity/MainActivity.java @@ -157,8 +157,8 @@ public class MainActivity extends BaseActivity3 { checkUpdateApk(); List permissionsResult = this.getPermissionsResult(); -// Log.i("app", "---------"); -// Log.i("app", new Gson().toJson(permissionsResult)); + Log.i("app", "---------"); + Log.i("app", new Gson().toJson(permissionsResult)); boolean isApp_YXXJ = false; boolean isApp_RLXJ = false; for (String permissions : permissionsResult) { @@ -222,16 +222,13 @@ public class MainActivity extends BaseActivity3 { return; } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - flashUtil.toggle(MainActivity.this); + //动态权限申请 + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + //权限请求 + ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE); } else { - //动态权限申请 - if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { - //权限请求 - ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE); - } else { - flashUtil.toggle(MainActivity.this); - } + flashUtil.toggle(MainActivity.this); + } // //检查权限是否授予 // if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) { // //权限请求 @@ -239,7 +236,6 @@ public class MainActivity extends BaseActivity3 { // }else { // flashUtil.toggle(MainActivity.this); // } - } } diff --git a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/contans/Contans.java b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/contans/Contans.java index 13cf96e..98567ee 100755 --- a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/contans/Contans.java +++ b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/contans/Contans.java @@ -6,12 +6,13 @@ public class Contans { public static String LOGIN = "AppLogin.ashx"; public static String LOGINNFC = "AppLogin/userLogin.ashx"; //内网正式环境 - //public static String IP = "http://10.20.1.100:8110/"; + //public static String IP = "http://10.20.1.100:8500/app/"; - public static String IP = "http://192.168.2.90:28500/"; + public static String IP = "http://192.168.2.90:28500/app/"; - public static String network_type_Intranet = "http://192.168.2.90:28500/"; - public static String network_type_extranet = "https://www.zjtsp.com/"; + public static String network_type_Intranet = "http://192.168.2.90:28500/app/"; + //public static String network_type_Intranet = "http://10.20.1.100:8500/app/"; + public static String network_type_extranet = "https://www.zjtsp.com/app/"; public static String MAXIMOIP = "http://10.46.0.152:7001/"; diff --git a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/utils/NohttpUtils.java b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/utils/NohttpUtils.java index fe22157..cf81ed5 100755 --- a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/utils/NohttpUtils.java +++ b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/utils/NohttpUtils.java @@ -78,12 +78,13 @@ public class NohttpUtils { */ public void add(Activity mActivity, int what, Request request, HttpListener callback, boolean canCanel, boolean isLoading, String msg) { String tokenTemp = (String) SPUtils.get(mActivity, Contans.LOGIN_TOKEN, ""); + Log.i("app", request.url()); if(!TextUtils.isEmpty(tokenTemp)){ String token = RSAUtils.decryptBASE64StrLocal(tokenTemp);; String credential = "Bearer " + token; request.addHeader("Authorization", credential); - //Log.i("app", request.url()); -// Log.i("app", credential); +// Log.i("app", request.url()); + Log.i("app", credential); // Log.i("app",new Gson().toJson(request.headers())); } mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, canCanel, isLoading, msg)); @@ -92,12 +93,13 @@ public class NohttpUtils { public void add(Activity mActivity, int what, Request request, HttpListener callback) { String tokenTemp = (String) SPUtils.get(mActivity, Contans.LOGIN_TOKEN, ""); + Log.i("app", request.url()); if(!TextUtils.isEmpty(tokenTemp)){ String token = RSAUtils.decryptBASE64StrLocal(tokenTemp);; String credential = "Bearer " + token; request.addHeader("Authorization", credential); //Log.i("app", request.url()); -// Log.i("app", credential); + Log.i("app", credential); // Log.i("app",new Gson().toJson(request.headers())); } mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, true, true, "加载中...")); diff --git a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/utils/RSAUtils.java b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/utils/RSAUtils.java index c7e88e6..b811b94 100644 --- a/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/utils/RSAUtils.java +++ b/ZJYXDXJ/app/src/main/java/com/bjzc/zjyxdxj/utils/RSAUtils.java @@ -4,6 +4,7 @@ package com.bjzc.zjyxdxj.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; @@ -24,11 +25,20 @@ public class RSAUtils { * RSA算法 */ public static final String RSA = "RSA"; - - public static final String ECB_None_PKCS1_PADDING = "RSA/None/PKCS1Padding";//java默认加密填充方式 RSA/None/PKCS1Padding - 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 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhpRgDGj3dk8kaNnnQIJ6YjbaEDBYEzDkv3qR3a55odU4/fJ3LFtGQfHM7LzQ3bpYaC8cZiYAu0ByPENW0G7HzVmxPfKdbLZtrRe+9kH8Fm+M2B26/XZd9QfT9+F2NQtFq68UA6yV5Z4wvxDjp2ZEzVjd+6ODQHuxf5JzySyWtgg844sHdB47iSdC06PnDfjLGMp3AtYeCbQH1mNOjuV44vbiccoTP3gCLnm9BS9Ez4F0fM04kTnCLpOdphJub341gUUnuoFbo+CGrnM5NfwXnw1MUkl5H25BHwK4So/L9DwbBsktiFOuzC8L4DuWvJJSLZnKXIXmPGoRVqTe5zCMkQIDAQAB"; public static final String private_key = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCGlGAMaPd2TyRo2edAgnpiNtoQMFgTMOS/epHdrnmh1Tj98ncsW0ZB8czsvNDdulhoLxxmJgC7QHI8Q1bQbsfNWbE98p1stm2tF772QfwWb4zYHbr9dl31B9P34XY1C0WrrxQDrJXlnjC/EOOnZkTNWN37o4NAe7F/knPJLJa2CDzjiwd0HjuJJ0LTo+cN+MsYyncC1h4JtAfWY06O5Xji9uJxyhM/eAIueb0FL0TPgXR8zTiROcIuk52mEm5vfjWBRSe6gVuj4Iauczk1/BefDUxSSXkfbkEfArhKj8v0PBsGyS2IU67MLwvgO5a8klItmcpcheY8ahFWpN7nMIyRAgMBAAECggEAPkrplnTzrlh9subByrNacKGRGBM4gVGNYDAc2m6LMGRgp/MWRHrPL3D7+MyBJVC+4SKFU6bdic8P0WMeCQZuB1gv2Uu2oH5kj81A//2U8NGbcOF6Dx496VBBRiifLXhVPF2itvyouYsaZyYrKe4FhMNQpMyP0UYv56vjWkgATqsbFmx2K8FLSGwpBvYys57gy4Evtep0yLTel6E4mnkQVdfTXnA7zylMn5Xz6Mk8u6H6o+Zhfxugw8/+CS9cDSCNxX0ZN8xgqONNtrHpAsM+AWbHuim89HnoVq2RrkHVnjCTXd2IG2Hs+lO7t7GYk3bqLwlpaupmR4rnOI+R+Rf3TQKBgQDpnMAY9l5Ro+r+SR7UjN+tSMBBX3S764NTAE0kNUSB3iBQnuLY60ziqbEbAupSFBnbkshWIVGaKdN6szH9lpoMSEyEWrN/EYY46WxFC6MT4iqvtl3Trqu/7h0DrjWsSY9e8ja8Zpv0lb7B8IEUiydeTfdkA+oTu4igz8gRs+BpuwKBgQCTegnoVlf15fLx8Czeo54YouHnD5fxzx5svsvXIFarMcQ89UMcUw/gBh3QGvx4BS6DUctitzmAeTQkQVtjVQZ3gNTMwILcB4NWibHursnsWQB6BIcRbww9FSIpARXPbXS2FbqjN+3aS8REEVJrIOPP2PQ62SeQSnA/eZBy1DjIIwKBgD4prtg1nq18v8hAbsrCXba/mCENJIPozH4mo2BSKFOiZtjtHpH4MvJRk0YLxYxnuuW5rkN1BEDQhmytCE1haMaB6pKBjCfw4tV8D4pj6VYeJZuyHE96uEsPMntLPQ8GV/c83qHNcAxqWGNE+yQbTzOB7aWYgQ4VJescvzEuuzWHAoGAZiUQ16t2IQqzyn7flRUeW1H1xWQ3iXQ7TnaYGNh9LvW5Rb9aTDP7ut6Bp7IJS9fK74mnpSfi2+kXBEWAVrx9TigdO/ParytE/JtCcl793IWInvqj0p9niqcokd3+jTzyqWtDaelDBP+VYM/elfSh1UQfZOMjU/064bwBIId9DKECgYBYXBe6oU7QiMYxa3YwAi9CcY9HXX6HRF4MpzOsOQ8wer8uJi6ca2th+jssz4SMeYZHnb7Ae+aORD7X+LefVuQiolwigAeTFgDihveb6WgxkKMarbqO8Ww7+laoGQjHvMQMTSkzt6KyhzeNu3F7Ma5HZkfCqwPAHzTOunGWUosRvg=="; @@ -51,7 +61,17 @@ public class RSAUtils { public static String decryptBASE64Str(String encryptString) { try { byte[] decodeByte = decryptBASE64(encryptString); - return new String(decryptByPrivateKey(decodeByte, private_key)); + return new String(decryptByPrivateKeyLongText(decodeByte, private_key)); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + public static String decryptBASE64StrByPublic(String encryptString) { + try { + byte[] decodeByte = decryptBASE64(encryptString); + return new String(decryptByPublicKeyLongText(decodeByte, public_key)); } catch (Exception e) { e.printStackTrace(); } @@ -61,7 +81,7 @@ public class RSAUtils { public static String decryptBASE64StrLocal(String encryptString) { try { byte[] decodeByte = decryptBASE64(encryptString); - return new String(decryptByPrivateKey(decodeByte, private_key_local)); + return new String(decryptByPrivateKeyLongText(decodeByte, private_key_local)); } catch (Exception e) { e.printStackTrace(); } @@ -71,7 +91,7 @@ public class RSAUtils { public static String decryptBASE64StrMqtt(String encryptString) { try { byte[] decodeByte = decryptBASE64(encryptString); - return new String(decryptByPrivateKey(decodeByte, private_key_mqtt)); + return new String(decryptByPrivateKeyLongText(decodeByte, private_key_mqtt)); } catch (Exception e) { e.printStackTrace(); } @@ -80,7 +100,7 @@ public class RSAUtils { public static String encryptBASE64Str(String text) { try { - return encryptBASE64(encryptByPublicKey(text.getBytes(), public_key)); + return encryptBASE64(encryptByPublicKeyLongText(text.getBytes(), public_key)); } catch (Exception e) { e.printStackTrace(); } @@ -89,7 +109,7 @@ public class RSAUtils { public static String encryptBASE64StrLocal(String text) { try { - return encryptBASE64(encryptByPublicKey(text.getBytes(), public_key_local)); + return encryptBASE64(encryptByPublicKeyLongText(text.getBytes(), public_key_local)); } catch (Exception e) { e.printStackTrace(); } @@ -98,7 +118,7 @@ public class RSAUtils { public static String encryptBASE64StrMqtt(String text) { try { - return encryptBASE64(encryptByPublicKey(text.getBytes(), public_key_mqtt)); + return encryptBASE64(encryptByPublicKeyLongText(text.getBytes(), public_key_mqtt)); } catch (Exception e) { e.printStackTrace(); } @@ -128,6 +148,44 @@ public class RSAUtils { 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; + } + /** * 解密
* 用公钥解密 @@ -137,8 +195,7 @@ public class RSAUtils { * @return * @throws Exception */ - public static byte[] decryptByPublicKey(byte[] data, String key) - throws Exception { + public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception { // 对密钥解密 byte[] keyBytes = decryptBASE64(key); // 取得公钥 @@ -151,6 +208,68 @@ public class RSAUtils { 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; + + } + + /** * 加密
* 用公钥加密 @@ -160,8 +279,7 @@ public class RSAUtils { * @return * @throws Exception */ - public static byte[] encryptByPublicKey(byte[] data, String key) - throws Exception { + public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception { // 对公钥解密 byte[] keyBytes = decryptBASE64(key); // 取得公钥 @@ -174,6 +292,69 @@ public class RSAUtils { 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; + + } + /** * 加密
* 用私钥加密 @@ -183,8 +364,7 @@ public class RSAUtils { * @return * @throws Exception */ - public static byte[] encryptByPrivateKey(byte[] data, String key) - throws Exception { + public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception { // 对密钥解密 byte[] keyBytes = decryptBASE64(key); // 取得私钥 @@ -197,6 +377,67 @@ public class RSAUtils { 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; + + } + /** * 取得私钥 * @@ -233,7 +474,7 @@ public class RSAUtils { public static Map initKey() throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator .getInstance(RSA); - keyPairGen.initialize(2048); + keyPairGen.initialize(DEFAULT_KEY_SIZE); KeyPair keyPair = keyPairGen.generateKeyPair(); // 公钥 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();