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"
}]

我就是我,一名技术爱好者!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355