本帖最后由 supzhang 于 2022-5-10 14:34 编辑
目的:
获取鉴权,从而获取到频道回放地址、获取各频道节目表、获取各频道组播地址
另外:获取鉴权,只是第一步,如果你想要获取回放地址,播放回放、获取频道组播地址等就需要额外的工作了。
这里只是获取鉴权(每个人的密钥可能都不同),其他的内容都可以从网上查找。
流程:
通过抓包,查看电信鉴权获取方式为1、GET http://182.138.3.142:8082/EDS/js ... XX@ITV&Action=Login
获取到下一步用到的HOSTxxxxxxxxxxx为自己的ID,
2、POST http://HOST/EPG/jsp/authLoginHWCTC.jsp
提交UserID获取到 EncryptToken
3、POST http://HOST/EPG/jsp/ValidAuthenticationHWCTC.jsp
提交 UserID,Authenticator,STBVersion,STBID,EncryptToken,mac地址...其他无所谓
获取到鉴权的cookies {'JSESSIONID': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}UserToken,stbid
获取鉴权:
通过上面获取到的信息,即可请求节目表以及频道列表,以及回放地址
其中最主要的一个参数为 Authenticator
查看到电信IPTV相关的文档获取其鉴权的方式:
随机8位数+$+TOKEN+$+USERID+$+STBID+$ip+$+mac+$$CTC
使用3DES加密 参数为:ECB PKCS7,使用对应的密钥对上面的字符串进行加密获取。
查看网上其他地方的密钥都是00000000,等很简单的,经测试都是不对的,解密失败。
后来写了个脚本测试了下,所有的8位数,结果让我大吃一惊,获取到了175个8位数字的密钥(测试过其他朋友,有的是128个)
用这些密钥去加密,结果,全部正确!随便拿一个去加密,都可以获取到鉴权,没有问题。
看了下3DES加密的介绍,如果密钥位数少了,与DES安全性相同
。但实在是没弄明白,为什么会有175个密钥,DES加密安全性有这么差吗?
下面是查找KEY及解密的python代码! 需要自己先找到自己的Authenticator
另:
3DES加密,密钥使用的是24位,如果不够,后面就补0
如果大家找不到密钥,可以给我发个你抓的包(或者直接给我你的Authenticator),我试下。
其他地区的及运营商的,如果需要也可以发过来测试下,应该都差不多。
mail:31849627@qq.com
个人不太懂加密,只是借用了网上的加密解密脚本修改了下。有不对的地方欢迎大家指正。
- #-*- coding:utf-8 -*-
- #用来加密及解密四川电信鉴权的3DES加密
- from Crypto.Cipher import DES3
- Authenticator = ''
- #需要解密的字符串,即:Authenticator 值
- #key的值,查找key时不需要输入
- key = ''
- BS = DES3.block_size
- def pad(s):
- p = s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
- return p
- def unpad(s):
- p = s[0:-ord(s[-1])]
- return p
- class prpcrypt(): #加密解密方法
- def __init__(self,key):
- self.key = key + '0'* (24-len(key))
- self.mode = DES3.MODE_ECB
- def encrypt(self, text): #加密文本字符串,返回 HEX文本
- text = pad(text)
- cryptor = DES3.new(self.key, self.mode)
- x = len(text) % 8
- if x != 0:
- text = text + '\0' * (8 - x)
- self.ciphertext = cryptor.encrypt(text)
- return self.ciphertext.hex()
- def decrypt(self, text):
- cryptor = DES3.new(self.key, self.mode)
- de_text = bytes.fromhex(text)
- plain_text = cryptor.decrypt(de_text)
- return plain_text.replace(b'\x08',b'').decode('utf-8')
- def find_key(text):
- keys = []
- print('开始测试00000000-99999999所有八位数字')
- for x in range(100000000):
- key = '%08d'%x
- if x % 500000 == 0:
- print('已经搜索至:-- %s -- '%(key))
- pc = prpcrypt(key)
- try:
- e = pc.decrypt(text)
- print('已经找到key:%s,解密后为:%s'%(key,e))
- keys.append(key)
- except Exception as e:
- pass
- print('解密完成!共查找到 %s 个密钥,分别为:%s'%(len(keys),keys))
- #查找KEY
- find_key(Authenticator)
- #下面的用来解密
- #pr = print(prpcrypt().decrypt(Authenticator))
复制代码
请不要胡乱输入以及粘贴、复制等方式灌水
请尊重作者、并共同维护网站的正常阅读,否则账户将会被限制发帖、回帖,并且积分可能会被清零,站内短信以及阅读权限等都会受到影响,谢谢。
具体限制方式:https://www.right.com.cn/forum/thread-8307840-1-1.html
|