guoma 发表于 2024-12-24 23:48:30

咸阳电视台JS源码求助

本帖最后由 guoma 于 2024-12-25 00:38 编辑

js源码:
<script type="text/javascript" src="http://www.xybtv.com/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="http://www.xybtv.com/js/pc/crypto-js.js"></script>
<script>
vid = 'xyzh';//location.href.split('html?id=');;
n=[];
n['xyzh'] = 157309; //咸阳综合
n['xygg'] = 157314; //咸阳公共

secretKey = 'ji0e3G8RR/JrBULhyaJUdg==';
$.ajax({
            type:"get",
            url:"http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id="+n,
            dataType:"jsonp",
            success:function(data){
                  address = data.address;
                address= decryptByAES(data.address,secretKey)
                  location.href = "http://dsk.cc/p/video.html?id=http:"+address;
                  }
   })
function decryptByAES(cipherText,keyInBase64Str) {
    let key = CryptoJS.enc.Base64.parse(keyInBase64Str);
    let decrypted = CryptoJS.AES.decrypt(cipherText, key, {
          mode: CryptoJS.mode.ECB,
      });
    return decrypted.toString(CryptoJS.enc.Utf8);
}
</script>
以上源码在本地运行可以,传到网络上获取不到完整数据,播放地址?号后的数据丢失,请高手指教:什么原因?如何解决?
php代码可获得AES-256-ECB加密数据,不知如何解密?并请高手完善:
<?php
$id = isset($_GET['id'])?$_GET['id']:'xyzh';
$n=[
   'xyzh'=> 157309, //咸阳综合
   'xygg'=> 157314, //咸阳公共
   ];
$d = file_get_contents("http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id=".$n[$id]);
$address =json_decode(str_replace(["(", ")"], "",$d))->address;
echo $address;
?>

kof97zip 发表于 2024-12-24 23:48:31

<?php
$id = isset($_GET['id'])?$_GET['id']:'xyzh';
$n=[
   'xyzh'=> 157309, //咸阳综合
   'xygg'=> 157314, //咸阳公共
   ];
header("Location: https:".openssl_decrypt(json_decode(str_replace(["(", ")"], "",file_get_contents("http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id=".$n[$id])))->address,"AES-128-ECB",base64_decode('ji0e3G8RR/JrBULhyaJUdg=='),0),true,302);
?>

k7y 发表于 2024-12-24 23:58:19

以下是google AI 最新的模型给出的答案


这段 PHP 代码看起来确实是用于获取一个 API 返回的加密数据,然后尝试解码并输出地址信息。但是,它实际上并没有进行 AES-256-ECB 加密。 它只是从一个 URL 获取 JSON 数据,然后提取其中的 address 字段。
让我来分解一下:
$id = isset($_GET['id'])?$_GET['id']:'xyzh';
这行代码从 URL 参数中获取 id 的值。如果 URL 中没有 id 参数,则默认使用 'xyzh'。
$n = [...]
这定义了一个关联数组 $n,将字符串 ID 映射到数字 ID。
$d = file_get_contents("http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id=".$n[$id]);
这行代码的关键部分。它使用 file_get_contents() 函数从指定的 URL 获取内容。
URL 包含一个参数 id,其值来自数组 $n,对应于 $id 的值。
重点:这里只是从 API 获取数据,没有加密操作。
$address = json_decode(str_replace(["(", ")"], "",$d))->address;
str_replace(["(", ")"], "",$d): 这段代码把 API 返回的数据中的左右括号 ( 和 ) 去掉。之所以需要这么做,是因为有些 API 返回的 JSON 数据可能会被包装在括号里,导致 json_decode 失败。
json_decode(...): 这行代码使用 json_decode() 函数将 JSON 格式的字符串 $d 解析为 PHP 对象。
->address: 这行代码从解析后的 PHP 对象中提取 address 属性的值。
echo $address;
这行代码将提取到的 address 值输出到页面。
没有加密,只有 API 数据获取和 JSON 解析
所以,你的代码并没有涉及到任何 AES-256-ECB 加密。它只是从一个 API 获取 JSON 数据,提取其中的 address 字段,并输出。
如果需要解密 AES-256-ECB 加密的数据,你需要:
获取密钥 (key) 和初始化向量 (IV): 通常,加密数据的解密需要一个密钥和一个初始化向量(IV)。这些信息必须与加密时使用的一致。
确定加密数据: 你需要明确哪个数据是经过 AES-256-ECB 加密的。
使用解密函数: PHP 提供了 openssl_decrypt() 函数,可以用来解密数据。
示例解密代码(假设数据已 Base64 编码,并且你已知密钥和 IV):
<?php
$encrypted_data_base64 = "YOUR_ENCRYPTED_DATA_IN_BASE64"; //替换为你实际的加密数据
$key = "YOUR_AES_KEY_HERE"; // 替换为你的AES密钥
//$iv = "YOUR_IV_HERE";   // ECB模式不需要IV

$encrypted_data = base64_decode($encrypted_data_base64);

// ECB模式不需要IV
$decrypted_data = openssl_decrypt($encrypted_data, 'AES-256-ECB', $key, OPENSSL_RAW_DATA );

if ($decrypted_data !== false) {
    echo "Decrypted Data: " . $decrypted_data;
} else {
    echo "Error decrypting data.";
}
?>
Use code with caution.
PHP
请注意:
ECB 模式的弱点: AES-256-ECB 模式由于其自身的特性,容易遭受攻击,尤其是在加密结构化的数据时。在实际开发中,请尽量避免使用 ECB 模式,考虑使用更安全的模式如 CBC、CTR 或 GCM。
密钥安全: 请务必妥善保管密钥,不要将密钥直接嵌入代码或泄露给未经授权的人员。
错误处理: 在实际代码中,你应该添加适当的错误处理,例如检查 openssl_decrypt() 的返回值,并处理解密失败的情况。
总结:
你的原始 PHP 代码并没有进行 AES 加密或解密。如果你需要解密 AES 加密的数据,你需要提供正确的密钥、加密数据,并使用 openssl_decrypt() 函数。请确保你了解加密模式(ECB 的不安全性)并且妥善保管你的密钥。

guoma 发表于 2024-12-25 00:04:49

k7y 发表于 2024-12-24 23:58
以下是google AI 最新的模型给出的答案

$decrypted_data = openssl_decrypt($encrypted_data, 'AES-256-ECB', $key, OPENSSL_RAW_DATA );解密不了。

k7y 发表于 2024-12-25 00:21:09

问题分析:
JavaScript 部分:
本地运行成功,网络运行失败: 这通常是由于跨域问题引起的。你本地运行时,直接打开 HTML 文件,没有跨域问题。但是,当你将 HTML 文件上传到服务器上后,JavaScript 代码会尝试从 api.juyun.tv 这个不同的域名获取数据,浏览器会阻止这种跨域请求,从而导致无法获取数据。
播放地址 ? 号后数据丢失: 这是因为 location.href 会对 URL 中的特殊字符(例如 ? )进行编码,这会导致部分数据丢失。
PHP 部分:
可以获取 JSON 数据: 你使用 file_get_contents 从 API 获取 JSON 数据是正确的。
JSON 解析和数据提取: 你使用 json_decode 和对象属性访问来提取 address 是正确的。
openssl_decrypt 解密失败: 这是因为,正如我们之前讨论的,API 返回的 address 数据本身是经过 AES 加密的,在 客户端(JavaScript) 使用 CryptoJS.AES.decrypt 解密,而不是在 服务端(PHP) 解密。
JavaScript 代码中解密逻辑正确:
decryptByAES 函数使用 CryptoJS 的逻辑是正确的,可以解密 address 数据。
解决方案:
1. 解决 JavaScript 跨域问题:
JSONP: 你在代码中使用了 dataType:"jsonp",这意味着你已经使用了 JSONP 来解决跨域问题。JSONP 的原理是利用 <script> 标签的 src 属性不受同源策略限制的特性,通过动态创建 <script> 标签来跨域获取数据。
* 确保 API 支持 JSONP: 检查 http://api.juyun.tv/juxian/api/is_pay_tv.jsp 接口是否支持 JSONP 回调,并且在响应中返回正确的 JSONP 数据格式(通常是 callback({"data":"value"}) 格式)。你可以尝试在浏览器直接访问该接口,看看返回的数据格式。
* 设置 callback 参数: 如果 API 需要一个特定的回调函数名作为参数,可以在 url 中设置 callback 参数: url:"http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id="+n + "&callback=myCallback", 同时修改 success 回调函数。
$.ajax({
       type:"get",
       url:"http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id="+n + "&callback=myCallback",
       dataType:"jsonp",
      jsonpCallback: 'myCallback',
       success:function(data){
         address = data.address;
         address= decryptByAES(address,secretKey)
         location.href = "http://dsk.cc/p/video.html?id=http:"+address;
       }
   });
Use code with caution.
JavaScript
2. 解决 JavaScript 播放地址 ? 号后数据丢失问题:
使用 encodeURIComponent(): 使用 encodeURIComponent() 对 address 进行编码,这样 ? 等特殊字符就不会被浏览器转义,从而导致数据丢失。
location.href = "http://dsk.cc/p/video.html?id=http:"+encodeURIComponent(address);
Use code with caution.
JavaScript
3. PHP 代码中解密逻辑:
移除 openssl_decrypt: openssl_decrypt 解密应该在客户端(JavaScript)进行,你已经在 JavaScript 代码中正确地实现了 AES 解密。 PHP 代码只需要获取原始的 address 数据。
* 增加 id 参数判断: 在获取数据之前判断 id 的有效性,避免错误的 id 导致错误,或未定义错误。
<?php
$id = isset($_GET['id']) ? $_GET['id'] : 'xyzh';
$n = [
   'xyzh' => 157309, // 咸阳综合
   'xygg' => 157314, // 咸阳公共
];

if (isset($n[$id])) {
    $url = "http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id=" . $n[$id];
    $d = file_get_contents($url);
    if ($d !== false) {
       $data = json_decode(str_replace(["(", ")"], "", $d), true);
       if (isset($data['address'])) {
          $address = $data['address'];
         echo $address;
      } else {
             echo "Error: address data not found";
      }
    } else {
          echo "Error: Failed to fetch data from API";
    }
} else {
    echo "Error: Invalid ID provided";
}
?>
Use code with caution.
PHP
修改后的代码:
JavaScript:
<script type="text/javascript" src="http://www.xybtv.com/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="http://www.xybtv.com/js/pc/crypto-js.js"></script>
<script>
vid = 'xyzh';//location.href.split('html?id=');;
n=[];
n['xyzh'] = 157309; //咸阳综合
n['xygg'] = 157314; //咸阳公共

secretKey = 'ji0e3G8RR/JrBULhyaJUdg==';
$.ajax({
    type:"get",
    url:"http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id="+n + "&callback=myCallback",
    dataType:"jsonp",
    jsonpCallback: 'myCallback',
    success:function(data){
      address = data.address;
      address= decryptByAES(address,secretKey)
      location.href = "http://dsk.cc/p/video.html?id=http:"+encodeURIComponent(address);
    }
});
function decryptByAES(cipherText,keyInBase64Str) {
    let key = CryptoJS.enc.Base64.parse(keyInBase64Str);
    let decrypted = CryptoJS.AES.decrypt(cipherText, key, {
          mode: CryptoJS.mode.ECB,
      });
    return decrypted.toString(CryptoJS.enc.Utf8);
}
</script>
Use code with caution.
Html
PHP:
<?php
$id = isset($_GET['id']) ? $_GET['id'] : 'xyzh';
$n = [
   'xyzh' => 157309, // 咸阳综合
   'xygg' => 157314, // 咸阳公共
];

if (isset($n[$id])) {
    $url = "http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id=" . $n[$id];
    $d = file_get_contents($url);
    if ($d !== false) {
       $data = json_decode(str_replace(["(", ")"], "", $d), true);
       if (isset($data['address'])) {
          $address = $data['address'];
         echo $address;
      } else {
             echo "Error: address data not found";
      }
    } else {
          echo "Error: Failed to fetch data from API";
    }
} else {
    echo "Error: Invalid ID provided";
}
?>
Use code with caution.
PHP
总结:
JavaScript:
确保使用 JSONP 来处理跨域问题。
使用 encodeURIComponent() 对 URL 参数进行编码。
PHP:
PHP 代码仅用于获取未解密的原始 address 数据。
增加 id 参数判断,防止错误。

guoma 发表于 2024-12-25 00:34:49

谢谢kof97zip,原来是我将解密模式搞错了。

Joewm 发表于 2024-12-25 00:44:10

<?php
$id = isset($_GET['id']) ? $_GET['id'] : 'xyzh';
$n = [
    'xyzh' => 157309, // 咸阳综合
        'xygg' => 157314, // 咸阳公共
];

// 获取数据
$d = file_get_contents("http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id=" . $n[$id]);
$address = json_decode(str_replace(["(", ")"], "", $d))->address;

// 解密函数
function decryptByAES($cipherText, $keyInBase64Str) {
    $key = base64_decode($keyInBase64Str); // 将 Base64 编码的密钥解码
    $cipherText = base64_decode($cipherText); // 解码密文
    $decrypted = openssl_decrypt($cipherText, 'AES-128-ECB', $key, OPENSSL_RAW_DATA); // 使用 AES-128-ECB 解密
    return $decrypted;
}

$secretKey = 'ji0e3G8RR/JrBULhyaJUdg=='; // 密钥
$decryptedAddress = decryptByAES($address, $secretKey); // 解密地址

// 调试信息
if ($decryptedAddress === false) {
    echo "解密失败,可能是密钥或密文有误。";
} else {
    header("Location: " . $decryptedAddress); // 重定向到解密后的地址 exit(); // 确保脚本停止执行
}
?>

这是AI给的代码,可以解密,但是无法播放

5915566 发表于 2024-12-25 06:52:37

学习学习学习学习

iptver 发表于 2024-12-25 09:47:46

本帖有解密高手,mark备份

cdsqnbylwhf 发表于 2024-12-25 12:17:49

不懂帮顶,期待大佬的新作品
页: [1]
查看完整版本: 咸阳电视台JS源码求助