我在servlet中对一串字符串进行加密,但是编码老是乱码,然后我进行了UTF-8处理
就是这种,但是问题处理的不全面,出现的问题是经常有个别字符乱码
求哪位大神帮忙解决一下
在传输时对参数进行URL编码或者使用加密方式操作
像是解密结果少了尾部的几个字节导致的,检查一下你的加解密算法
utf-8处理语句换一下
String datastr4 = new String(datastr3.getBytes("ISO-8859-1"), "utf-8");
Map<String,String> map = new HashMap<String, String>();
map.put("mhtOrderNo",mhtOrderNo);
map.put("mhtReqTime",mhtReqTime);
map.put("payeeAccType",payeeAccType);
map.put("payeeName","祝在哪");
map.put("payeeCardNo",payeeCardNo);
map.put("mhtOrderAmt",mhtOrderAmt);
map.put("agentPayMemo",agentPayMemo);
map.put("payeeCardUnionNo",payeeCardUnionNo);
srt1 = this.base("appId=" + Config.appId);
map = MapUtils.mapRemoveNull(map);
String dataStr = FormDateReportConvertor.postFormLinkReport(map);
//String datastr4 = new String(datastr3.getBytes("ISO-8859-1"), "utf-8");
String dataStr2=new String(dataStr.getBytes("utf-8"), "GBK");
srt2 = EncryDecryUtils.encryptFromDESBase64(DSEKey.trim(), dataStr2.trim());
srt3 = this.MD5Message(dataStr, MD5Key);
srt3 = this.base(srt3);
message1.append(srt1);
message1.append("|");
message1.append(srt2); //拼接返回报文
message1.append("|");
message1.append(srt3);
return_mess.append(message1.toString());
Report=return_mess.toString().trim();
xml = HttpPost.http("https://dby.ipaynow.cn/agentpay/agentPay",Report);
你参考一下这个
String toRSAStr = FormDateReportConvertor.postFormLinkReport(requestMap);
message1 = EncryDecryUtils.base64Encrypt(message1);//base64(appId=xxx)
String message2 = toRSAStr;
message2 = EncryDecryUtils.encryptFromDESBase64(des3Key,message2);// base64(3DES(报文原文)
String message3 = EncryDecryUtils.base64Encrypt(EncryDecryUtils.md5(toRSAStr.toString().trim() +"&"+ md5Key));//base64(MD5(报文原文+&+ md5Key))
String message = message1+"|"+message2+"|"+message3;
System.out.println("==================");
System.out.println(message2);
System.out.println("==================");
解密方法
//对返回的数据 先用base64解密 再用3Des解密
public static String decryptFromBase64DES(String key,String data) {
String result = null;
byte[] keyByte = key.getBytes();
byte[] base64Byte = EncryDecryUtils.getFromBase64byte(data);
try {
result = new String(DESUtils.Union3DesDecrypt(keyByte,base64Byte),"utf-8");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
加密算法,是不是你们公司自己的一套算法。
public static String postFormLinkReport(Map<String,String> dataMap){
StringBuilder reportBuilder = new StringBuilder();
List<String> keyList = new ArrayList<String>(dataMap.keySet());
Collections.sort(keyList);
for(String key : keyList){
reportBuilder.append(key+"="+dataMap.get(key)+"&");
}
reportBuilder.deleteCharAt(reportBuilder.lastIndexOf("&"));
return reportBuilder.toString();
}
这段代码是处理属性值的,从解密好的字符串中将代码分割,先以&分割再以=号分割
String[] str4 = srt.split("\\&");
for (int i = 0; i < str4.length; i++) {
if("mhtOrderNo".equals(str4[i].toString().split("\\=")[0].toString()))
{
mhtOrderNo=str4[i].toString().split("\\=")[1].toString().replaceAll("\0", "").trim();
}
if("mhtReqTime".equals(str4[i].toString().split("\\=")[0].toString()))
{
mhtReqTime=str4[i].toString().split("\\=")[1].toString().replaceAll("\0", "").trim();
}
if("payeeAccType".equals(str4[i].toString().split("\\=")[0].toString()))
{
payeeAccType=str4[i].toString().split("\\=")[1].toString().replaceAll("\0", "").trim();
}
if("payeeName".equals(str4[i].toString().split("\\=")[0].toString()))
{
payeeName=str4[i].toString().split("\\=")[1].toString().replaceAll("\0", "").trim();
}
if("payeeCardNo".equals(str4[i].toString().split("\\=")[0].toString()))
{
payeeCardNo=str4[i].toString().split("\\=")[1].toString().replaceAll("\0", "").trim();
}
if("payeeCardUnionNo".equals(str4[i].toString().split("\\=")[0].toString()))
{
payeeCardUnionNo=str4[i].toString().split("\\=")[1].toString().replaceAll("\0", "").trim();
}
if("mhtOrderAmt".equals(str4[i].toString().split("\\=")[0].toString()))
{
mhtOrderAmt=str4[i].toString().split("\\=")[1].toString().replaceAll("\0", "").trim();
}
if("agentPayMemo".equals(str4[i].toString().split("\\=")[0].toString()))
{
agentPayMemo=str4[i].toString().split("\\=")[1].toString().replaceAll("\0", "").trim();
}