Python 爬蟲進階必備 | DES加密與Base64編碼實例
本篇旨在簡單總結js與Python加密的一些例子,文中演示的案例也是面向新手,如果有大佬很碰巧看到這篇文章,歡迎加我交流,咸魚愿意付費學習。
對稱加密(加密解密密鑰相同):DES、DES3、AES
非對稱加密(分公鑰私鑰):RSA
信息摘要算法/簽名算法:MD5、HMAC、SHA
冷月大佬的博客:https://lengyue.me/
突破前端反調試–阻止頁面不斷debugger:https://segmentfault.com/a/1190000012359015
嵐光的javaScript反調試和混淆:https://0x0d.im/archives/javaScript-anti-debug-and-obfuscator.html
以下是可以參考的調試流程(面向新手):
如果網頁有跳轉,必須勾選 preservelog 防止丟包
看一下有沒有框架 右鍵查看框架源代碼(彈出式登陸界面)
登陸盡量使用錯誤密碼 防止跳轉
查看關鍵登陸包 分析哪些參數是加密的
使用別的瀏覽器分析哪些參數是固定的值
初步猜測加密方法
搜索
直接搜索參數
pwd=
pwd =
pwd:
pwd :
密碼框地方右鍵 檢查 查看 id name type
找到加密的地方(重點)
調試
找出所有的加密代碼
從最后一步開始寫起,缺啥找啥
如果找的是函數的話 search 要帶上 function xxx
如果看到加密的地方有個類,并且之后是用 prototype 把方法加在原生對象上的話,要把
所有加在原生對象上的方法都找出來
函數找多了沒關系,只要不報錯不會影響結果,但是不能找少了
為了避免被刪文,所以這里就不說是哪個網站了,有需要可私信
我們先參照上面的調試流程抓包,搜索加密參數’password’,經過測試通過’password='這關鍵字找到了加密所在的js。
經過測試(步驟7)在文件內搜索’password:'找到加密位置,并通過斷點確認了猜測。
通過點擊提示的路徑,我們找到以下代碼:
找到這里就可以把需要的js代碼扣出來,然后一步步調試了,通過補齊缺失的代碼,得到以下js加密代碼并運行:
var CryptoJS = CryptoJS || function(u, l) { var d = {} , n = d.lib = {} , p = function() {} , s = n.Base = { extend: function(a) { p.prototype = this; var c = new p; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function() { c.$super.init.apply(this, arguments) } ); c.init.prototype = c; c.$super = this; return c }, create: function() { var a = this.extend(); a.init.apply(a, arguments);================ 代碼太多了,此處省略 ================var encryptByDES = function(t) { var e = "e9284d45-cf2a-4e46-9367-f122413ca6b0"; var a = CryptoJS.enc.Utf8.parse(e); try { var s = CryptoJS.DES.encrypt(String(t), a, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }) } catch (t) { console.log(t) } return s.toString()}console.log(encryptByDES('11111111111'))
輸出運行結果’+g64648uhmWlN9eoU3Tszw==’,與我們抓包的結果相同。
同樣參照上面的調試流程,搜索加密參數’encodePassword’,經過測試通過’encodePassword ='這關鍵字找到了加密所在的js,并通過斷點驗證
找到關鍵加密位置后,查看加密的js文件,直接復制出來即可
base64編碼比較簡單,直接復制補上我們的密碼,輸出的就是編碼后的字段了
這里給大家推薦一個大佬寫的代碼(我就不獻丑了),記得給大佬來個star
GitHub地址:
https://github.com/dhfjcuff/R-A-M-D-D3-S-M-H/blob/master/RSA-AES-MD5-DES-DES3-MD5-SHA-HMAC.py # -*- coding:utf-8 -*- import base64 import rsa from Crypto.Cipher import AES from Crypto.PublicKey import RSA from pyDes import des, CBC, PAD_PKCS5 from Crypto.Cipher import DES3 import hashlib import hmac class USE_AES: """ AES 除了MODE_SIV模式key長度為:32, 48, or 64, 其余key長度為16, 24 or 32 詳細見AES內部文檔 CBC模式傳入iv參數 本例使用常用的ECB模式 """ def __init__(self, key): if len(key) > 32: key = key[:32] self.key = self.to_16(key) def to_16(self, key): """ 轉為16倍數的bytes數據 :param key: :return: """ key = bytes(key, encoding="utf8") while len(key) % 16 != 0: key += b'\0' return key # 返回bytes def aes(self): return AES.new(self.key, AES.MODE_ECB) # 初始化加密器 def encrypt(self, text): aes = self.aes() return str(base64.encodebytes(aes.encrypt(self.to_16(text))), encoding='utf8').replace('\n', '') # 加密 def decodebytes(self, text): aes = self.aes() return str(aes.decrypt(base64.decodebytes(bytes( text, encoding='utf8'))).rstrip(b'\0').decode("utf8")) # 解密 class USE_RSA: """ 生成密鑰可保存.pem格式文件 1024位的證書,加密時最大支持117個字節,解密時為128; 2048位的證書,加密時最大支持245個字節,解密時為256。 加密大文件時需要先用AES或者DES加密,再用RSA加密密鑰,詳細見文檔 文檔:https://stuvel.eu/files/python-rsa-doc/usage.html#generating-keys """ def __init__(self, number=1024): """ :param number: 公鑰、私鑰 """ self.pubkey, self.privkey = rsa.newkeys(number) def rsaEncrypt(self, text): """ :param test: str :return: bytes """ content = text.encode('utf-8') crypto = rsa.encrypt(content, self.pubkey) return crypto def rsaDecrypt(self, text): """ :param text:bytes :return: str """ content = rsa.decrypt(text, self.privkey) con = content.decode('utf-8') return con def savePem(self, path_name, text): """ :param path_name: 保存路徑 :param text: str :return:bytes """ if "PEM" in path_name.upper(): path_name = path_name[:-4] with open('{}.pem'.format(path_name), 'bw') as f: f.write(text.save_pkcs1()) def readPem(self, path_name, key_type): """ :param path_name: 密鑰文件 :param key_type:類型 :return: """ if 'pubkey' in key_type: self.pubkey = rsa.PublicKey.load_pkcs1(path_name) else: self.privkey = rsa.PublicKey.load_pkcs1(path_name) return True def sign(self, message, priv_key=None, hash_method='SHA-1'): """ 生成明文的哈希簽名以便還原后對照 :param message: str :param priv_key: :param hash_method: 哈希的模式 :return: """ if None == priv_key: priv_key = self.privkey return rsa.sign(message.encode(), priv_key, hash_method) def checkSign(self, mess, result, pubkey=None): """ 驗證簽名:傳入解密后明文、簽名、公鑰,驗證成功返回哈希方法,失敗則報錯 :param mess: str :param result: bytes :param pubkey: :return: str """ if None == pubkey: pubkey = self.privkey try: result = rsa.verify(mess, result, pubkey) return result except: return False class USE_DES: """ des(key,[mode], [IV], [pad], [pad mode]) key:必須正好8字節 mode(模式):ECB、CBC iv:CBC模式中必須提供長8字節 pad:填充字符 padmode:加密填充模式PAD_NORMAL or PAD_PKCS5 """ def __init__(self, key, iv): if not isinstance(key, bytes): key = bytes(key, encoding="utf8") if not isinstance(iv, bytes): iv = bytes(iv, encoding="utf8") self.key = key self.iv = iv def encrypt(self, text): """ DES 加密 :param text: 原始字符串 :return: 加密后字符串,bytes """ if not isinstance(text, bytes): text = bytes(text, "utf-8") secret_key = self.key iv = self.iv k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) en = k.encrypt(text, padmode=PAD_PKCS5) return en def descrypt(self, text): """ DES 解密 :param text: 加密后的字符串,bytes :return: 解密后的字符串 """ secret_key = self.key iv = self.iv k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) de = k.decrypt(text, padmode=PAD_PKCS5) return de.decode() class USE_DES3: """ new(key, mode, *args, **kwargs) key:必須8bytes倍數介于16-24 mode: iv:初始化向量適用于MODE_CBC、MODE_CFB、MODE_OFB、MODE_OPENPGP,4種模式 ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB``長度為8bytes ```MODE_OPENPGP```加密時8bytes解密時10bytes 未提供默認隨機生成 nonce:僅在 ``MODE_EAX`` and ``MODE_CTR``模式中使用 ``MODE_EAX``建議16bytes ``MODE_CTR``建議[0, 7]長度 未提供則隨機生成 segment_size:分段大小,僅在 ``MODE_CFB``模式中使用,長度為8倍數,未指定則默認為8 mac_len: 適用``MODE_EAX``模式,身份驗證標記的長度(字節),它不能超過8(默認值) initial_value:適用```MODE_CTR```,計數器的初始值計數器塊。默認為**0**。 """ def __init__(self, key): self.key = key self.mode = DES3.MODE_ECB def encrypt(self, text): """ 傳入明文 :param text:bytes類型,長度是KEY的倍數 :return: """ if not isinstance(text, bytes): text = bytes(text, 'utf-8') x = len(text) % 8 text = text+b'\0'*x cryptor = DES3.new(self.key, self.mode) ciphertext = cryptor.encrypt(text) return ciphertext def decrypt(self, text): cryptor = DES3.new(self.key, self.mode) plain_text = cryptor.decrypt(text) st = str(plain_text.decode("utf-8")).rstrip('\0') return st
IDE Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。