c语言将十进制转化为二进制算法_base64算法初探即逆向分析
算法分析
雖說base64嚴(yán)格意義上來說并不能算是加密算法,但的確應(yīng)用方面來說還算是比較廣,在CTF的算法逆向中Base系列算是也比較常見的,萌新剛開始學(xué)算法,就以base64為例,對該算法進(jìn)行一個簡單的分析。
簡單來說,base64算法就是根據(jù)一個base64表,將原始字符的值一一替換。替換規(guī)則如下:
表格如下:
定義為字符串?dāng)?shù)組如下:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"如果需要編碼的字節(jié)不能被三整除,則會多出1個或2個字節(jié),處理方式是加上"="號,也就是平時我們看到的base64編碼最后的"="或者"=="
代碼實現(xiàn)
根據(jù)前面的算法分析,已經(jīng)知道了base64具體的算法實現(xiàn),接下來使用c語言實現(xiàn)它。
首先需要定義一個base64的字符串?dāng)?shù)組,用于替換。
還是回到這張圖
首先我們需要將第一個字母G的二進(jìn)制位從8位截取到6位,我能想到的最直接的方法就是直接移位,將G>>2,前面自動補(bǔ)0則會得到00010001,也就是索引17,對應(yīng)base64的表格得到字母R,第一個字母就替換完成了。
很明顯編碼的第二個值是由G的最后兩個二進(jìn)制位和u的前面四個二進(jìn)制位拼接起來的,也就是說接下來應(yīng)該將這兩部分組合起來。
如何得到第一個字母的最后兩個字節(jié)呢,也是采用移位的方式:
首先將第一個字母左移4位得到01110000,我們這里需要取第一位的最后兩位,也就是這里的第三四位。所以將01110000與0x30(十進(jìn)制48,二進(jìn)制00110000)得到:
接下來將第二個字節(jié)的前四個二進(jìn)制位拼接過來即可。
同樣的,先將第二個字節(jié)右移四位以此得到需要拼接的部分。然后以類似的思路處理第三個字節(jié)。處理完畢將會得到新的四個字符。
完整流程大致如下:
完整代碼如下:
同理,解密函數(shù)需要四個字節(jié)一次性處理,邏輯一樣。
我使用了原生的c語言實現(xiàn),代碼如下:
在main函數(shù)中調(diào)用:
結(jié)果如下:
將結(jié)果拿到base64網(wǎng)頁解密:
通過分析過程,我們可以得知base64加解密中我們可控制也最方便控制的是base64的加密表。我們修改base64的加密表即可以實現(xiàn)base64的變異加密,實現(xiàn)起來非常很簡單。
將之前的base_table修改為如下:
before:
然后運行程序即可得到:
然后到網(wǎng)絡(luò)上使用base64解密工具進(jìn)行解密將解密失敗。
本文由看雪論壇 顧何 原創(chuàng)
原文鏈接:[原創(chuàng)]base64算法初探即逆向分析-『密碼算法』-看雪安全論壇
總結(jié)
以上是生活随笔為你收集整理的c语言将十进制转化为二进制算法_base64算法初探即逆向分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: antd option宽度自适应_建议收
- 下一篇: k8s 手动恢复redis 集群_二进制