GO語言版鵝廠廣告交易實時平臺價格解析

    騰訊廣告實時交易平臺在向競價勝出一方返回成交價的時候,先對價格進行TEA加密,再對密文進行BASE64編碼,接收方先對BASE64解碼,再對密文解密,雙方事先約定密鑰。鵝廠官網提供了C#、C++、JAVA和PHP的解密代碼包,無奈原有平臺都是基於GO語言的,雖然能夠調C++的靜態庫(libdecrypt.a),但開發工具是JetBrains GoLand,跑在Windows 7下後期難以調試,在虛擬機下跑linux版嚴重影響開發效率,不得不嘗試改寫爲GO語言直接調用來的酣暢淋漓,主要緣由仍是太窮買不起MacBook。linux

    本來以爲是個小活兒分分鐘就能夠搞定,沒想到是個花了十二個工時的髒活累活,壓根不是抄抄寫寫那麼簡單,一個坑接着一個坑。libdecrypt.a靜態庫在編譯的時候沒有加入調試信息徹底沒法跳入,jar卻是能夠反編譯看到源碼,但編譯器對部分中間變量作了優化處理,尤爲對部分邏輯還原的帶有強烈的我的感情色彩,IDEA和Java Decompiler兩個工具自說自話,連被優化掉的變量命名都那麼使人忍俊不由。git

// IntelliJ IDEA
if(nInBufLen % 8 == 0 && nInBufLen >= 16 && pKey.length == 16) {
    // 省略
}
// Java Decompiler
if ((nInBufLen % 8 != 0) || (nInBufLen < 16) || (pKey.length != 16)) {
    return null;
}

// IntelliJ IDEA
dest_buf[j] ^= pInBuf[var18 + j];
// Java Decompiler
int tmp250_249 = j;
byte[] tmp250_247 = dest_buf;
tmp250_247[tmp250_249] = ((byte)(tmp250_247[tmp250_249] ^ pInBuf[(nBufPos + j)]));

    調試的時候問題百出,只能左手跑JetBrains GoLand,右手跑IntelliJ IDEA,兩邊同時Step Out | Into跟蹤,檢查輸入輸出發現問題再解決問題,數次打算放棄名正言順直接調用C++庫,畢竟項目進度擺在那裏男人何苦爲難本身,不過堅持不懈是我惟一拿得出手值得炫耀的品格了,何況沒準這個問題或許就是最後一個問題了呢。工具

    羅裏吧嗦說說遇到的坑吧!開發工具

    坑一:GO語言作<<操做的時候高位溢出部分捨棄,C\C++和JAVA補1,須要對0xffffffff取反之後再作位置或操做;優化

    坑二:GO語言「+」優先級高於「^」,在改寫C\C++和JAVA表達式的時候須要加括號提高優先級,如:z -= int64(y << 4) + int64(c) ^ (y + sum ^ ((y >> 5) + int64(d)));編碼

    坑三:已知a := []int{1, 2, 3, 4, 5, 6}; b := a[:],兩者指向同一內存空間,沒有達到b = (int[])a.clone()  的目的;加密

    坑四:GO語言沒有「>>>」無符號右移運算符;調試

    坑五:GO語言[]byte取值範圍0-255,與JAVA的byte[]對應的是[]int8;code

    代碼下載地址:https://gitee.com/gonglibin/codes/67lj5sv43bdegrm2ah81x21內存

相關文章
相關標籤/搜索