1. 程式人生 > 實用技巧 >c++和Java用Base64編碼中文通訊分析

c++和Java用Base64編碼中文通訊分析

背景

在某寶上看到一個藥品管理系統,他有一個雲藥品庫。用掃碼槍一掃,就可用獲取到藥品的詳細資訊。可以在添加藥品基礎資料的時候,免去輸入文字的麻煩,而我在上家公司的時候,也是做藥品ERP的,客戶拿著我們的ERP添加藥品等基礎資料的時候很麻煩,我就提倡做這樣一個東西在erp中,由於種種原因未能普及。其中重要原因就是使用者想用,但是資料太少,於是我抓包這個軟體,看看能否獲取到他的資料庫,有機會可以爬下來,用在類似系統中。這個過程中遇到了一些問題,我記錄了下來。

第一抓包

找到軟體入口,輸入條碼,搜尋看看網絡卡中的包資訊,使用wireshark

很明顯http協議的,通過調節可以抓取到資訊的,但是返回值 應該是“加密”的,為啥加密呢?是防止別人抓取?我一開始認為是,看這樣子是用的base64加密的。我先在網址上找了一個線上解密base64的,果然可以解密。但是中文有亂碼,看亂碼的樣子應該是字元編碼的問題。

要想看到具體的中文內容,只能用java 來寫一個抓取資料和解碼Base64 還要轉字元編碼的事情了。

第二java爬取資料,解碼Base64

java解碼c++ , base64編碼的資料,
從base64解碼到資料本來的樣子,這個過程中遇到了一點小麻煩,就是jdk1.8 裡面base64編碼解碼器,都是不帶 換行符合的,而這個爬取下來的資料都是有換行符號的。通過查詢資料得知下面的不可用,

 java.util.Base64.getDecoder();
 

得用jdk1.7或 第三方 commons-codec

		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.14</version>
		</dependency>

org.apache.commons.codec.binary.Base64

用這個是可以解碼Base64

    String url="http://116.255.186.7:9000";
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put( "Content-Type", "application/x-www-form-urlencoded");
        hashMap.put("Accept", "text/html, */*");
        hashMap.put("User-Agent", "Mozilla/3.0 (compatible; Indy Library)");
        Map map =new HashMap();
        map.put("YPACT", "YPGET");
        map.put("barcode", "12343");
        try {
           byte rs[]= OkHttpUtil.postb(url, map,hashMap);
             JSONObject jsonObject =JSON.parseObject(new String(rs));
             String encode = jsonObject.getString("rmtdset");   
             System.out.println(encode);
             byte []xm =encode.getBytes();
             byte[] dbm= Base64.decodeBase64(xm); 
             String dcodeg=new String(dbm);
             System.out.println(dcodeg);
          
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

但是中文亂碼

第三 分析為什麼中文亂碼

為什麼從Base64解碼,java打印出來是亂碼呢?
由於c++ 、c# 或者更準確的說,win 系統裡出來的東西,預設是GBK ,java 這邊預設是UTF-8
。也就是說 在win系統中base64編碼的時候,是將GBK編碼的字串,變成 byte陣列,再變成base64字串 'base64String' 在網路中傳送的是 'base64String',java這邊收到後,用Base64解碼base64String,解碼成byte 陣列,那這陣列,對應的編碼就是GBK。所以解碼出來的要用GBK的方式來構建字串,

就是這樣的程式碼。

分析到這就明白了,為啥他這個系統中不直接用字串傳送,而是要base64加密後的字串傳送,就是因為Base64加密後的全是ASC碼串,不會出現編碼錯誤。而解碼,只需將返回的byte 陣列解析為GBK的字串,就可用正確使用。所以可用得出結論,上的base64加密,並非真正的加密,只是為了傳遞資料的方便。

最後看一下正確的資料的樣子

[{
	"id": "248727",
	"c1_id": "0",
	"c2_id": "",
	"c1": "糖果系列",
	"c2": "",
	"name": "長幹棒棒糖",
	"pinyin": "ZGBBT",
	"spec": "",
	"unit": "支",
	"approval_number": "",
	"location": "晨光文具專營店",
	"barcode": "091361712343",
	"zhuzhi": "",
	"explain_book": "(Memo)",
	"replenish": "",
	"logo": "",
	"is_otc": "",
	"is_del": "",
	"c_time": "",
	"datasource": "外部",
	"storename": "維康堂大藥房",
	"oper": "超級使用者",
	"uploadipaddr": "116.255.186.7",
	"inserttime": "2019-08-30 0:30:01",
	"rows": "1"
}, {
	"id": "280240",
	"c1_id": "0",
	"c2_id": "",
	"c1": "",
	"c2": "",
	"name": "2000",
	"pinyin": "2000",
	"spec": "",
	"unit": "",
	"approval_number": "",
	"location": "無",
	"barcode": "12343",
	"zhuzhi": "",
	"explain_book": "(Memo)",
	"replenish": "",
	"logo": "",
	"is_otc": "",
	"is_del": "",
	"c_time": "",
	"datasource": "外部",
	"storename": "灤南縣坨里鎮康誠大藥房",
	"oper": "超級使用者",
	"uploadipaddr": "116.255.186.7",
	"inserttime": "2020-02-03 2:03:45",
	"rows": "2"
}, {
	"id": "222533",
	"c1_id": "0",
	"c2_id": "",
	"c1": "電器",
	"c2": "",
	"name": "電腦電源線 5m  250v",
	"pinyin": "DNDYX 5M  250V",
	"spec": "5m",
	"unit": "根",
	"approval_number": "",
	"location": "超五類",
	"barcode": "1234356574543",
	"zhuzhi": "",
	"explain_book": "(Memo)",
	"replenish": "",
	"logo": "",
	"is_otc": "",
	"is_del": "",
	"c_time": "",
	"datasource": "外部",
	"storename": "冠縣回春堂大藥店二分店",
	"oper": "超級使用者",
	"uploadipaddr": "116.255.186.7",
	"inserttime": "2019-06-11 4:58:50",
	"rows": "3"
}, {
	"id": "78460",
	"c1_id": "0",
	"c2_id": "",
	"c1": "",
	"c2": "",
	"name": "衛康2000(125)",
	"pinyin": "WK2000(125)",
	"spec": "125ml",
	"unit": "盒",
	"approval_number": "",
	"location": "衛康",
	"barcode": "6919021123435",
	"zhuzhi": "",
	"explain_book": "(Memo)",
	"replenish": "",
	"logo": "",
	"is_otc": "",
	"is_del": "",
	"c_time": "",
	"datasource": "外部",
	"storename": "東盛大藥房",
	"oper": "超級使用者",
	"uploadipaddr": "61.237.136.125",
	"inserttime": "2018-11-01 17:21:48",
	"rows": "4"
}, {
	"id": "322118",
	"c1_id": "0",
	"c2_id": "",
	"c1": "7001",
	"c2": "",
	"name": "淘鄉甜(熟)鹹鴨蛋",
	"pinyin": "TXT(S)XYD",
	"spec": "65g",
	"unit": "包",
	"approval_number": "",
	"location": "",
	"barcode": "6921234300855",
	"zhuzhi": "",
	"explain_book": "(Memo)",
	"replenish": "",
	"logo": "",
	"is_otc": "",
	"is_del": "",
	"c_time": "",
	"datasource": "外部",
	"storename": "串業藥店",
	"oper": "超級使用者",
	"uploadipaddr": "116.255.186.7",
	"inserttime": "2020-06-06 14:01:48",
	"rows": "5"
}, {
	"id": "343515",
	"c1_id": "0",
	"c2_id": "",
	"c1": "",
	"c2": "",
	"name": "酒精",
	"pinyin": "JJ",
	"spec": "",
	"unit": "",
	"approval_number": "",
	"location": "",
	"barcode": "6921723712343",
	"zhuzhi": "",
	"explain_book": "(Memo)",
	"replenish": "",
	"logo": "",
	"is_otc": "",
	"is_del": "",
	"c_time": "",
	"datasource": "外部",
	"storename": "梧州長洲福膳診所",
	"oper": "超級使用者",
	"uploadipaddr": "116.255.186.7",
	"inserttime": "2020-07-07 1:50:34",
	"rows": "6"
}, {
	"id": "54075",
	"c1_id": "0",
	"c2_id": "",
	"c1": "0203保健",
	"c2": "",
	"name": "專利品決明子茶",
	"pinyin": "ZLPJMZC",
	"spec": "240g",
	"unit": "盒",
	"approval_number": "",
	"location": "寧夏",
	"barcode": "6924564712343",
	"zhuzhi": "",
	"explain_book": "(Memo)",
	"replenish": "",
	"logo": "",
	"is_otc": "",
	"is_del": "",
	"c_time": "",
	"datasource": "外部",
	"storename": "XXXXX大藥房",
	"oper": "超級使用者",
	"uploadipaddr": "61.237.136.147",
	"inserttime": "2018-10-12 1:49:14",
	"rows": "7"
}, {
	"id": "189861",
	"c1_id": "3",
	"c2_id": "",
	"c1": "中藥飲片",
	"c2": "",
	"name": "黑枸杞(藥知源)",
	"pinyin": "HGQ(YZY)",
	"spec": "80g",
	"unit": "桶",
	"approval_number": "",
	"location": "安徽藥知源",
	"barcode": "6926919123439",
	"zhuzhi": "",
	"explain_book": "(Memo)",
	"replenish": "",
	"logo": "",
	"is_otc": "",
	"is_del": "",
	"c_time": "",
	"datasource": "外部",
	"storename": "長阪坡大藥房幹溪店",
	"oper": "超級使用者",
	"uploadipaddr": "116.255.186.7",
	"inserttime": "2019-02-28 2:11:23",
	"rows": "8"
}, {
	"id": "155311",
	"c1_id": "0",
	"c2_id": "",
	"c1": "新藥",
	"c2": "",
	"name": "番瀉葉",
	"pinyin": "FXY",
	"spec": "40克",
	"unit": "",
	"approval_number": "",
	"location": "安徽",
	"barcode": "6933371234375",
	"zhuzhi": "",
	"explain_book": "(Memo)",
	"replenish": "",
	"logo": "",
	"is_otc": "",
	"is_del": "",
	"c_time": "",
	"datasource": "外部",
	"storename": "開元大藥房",
	"oper": "超級使用者",
	"uploadipaddr": "61.237.136.98",
	"inserttime": "2018-12-13 13:24:16",
	"rows": "9"
}]

我就是我,一名技術愛好者!