讨论:一种基于状态位图的SPIHT算法(1)

 
今天在维普下载了一篇SPIHT算法改进的论文,(耿兴云,《基于改进SPIHT的静态图像编码》,电脑知识与技术:学术交流-2007年5期),我根据该文提出的改进算法,用Matlab来实现,却发现改进算法的程序运行速度比原算法还要慢,希望有兴趣的朋友进来看看,评论一下原因。文章指出SPIHT 算法有两个缺点:

(1)忽略了基于同频带内相邻小波系数值往往相近的兄弟相关性。SPIHT算法中采用的零树结构依然存在一些冗余信息,因为对于每个量化门限,尤其是初始门限,最低频子带内的所有系数都被编码。至少需输出每点的像素信息和集合信息.即对所有根节点的系数都进行独立编码。

(2)最低频子带系数并非同时都是重要的,SPIHT中,当排序扫描过程利用集合链表LIP和LIS确定小波系数重要性时.仅有一小部分比特用于编码重要信息.尤其在低比特率下:必然导致恢复图像质量的下降。

于是作者就引入提升小波变换、重新定义零树结构、改进扫描编码顺序,利用了LZC算法的状态位图思想,具体方法是:

(1)兄弟相关性的假设
在父节点系数值一般大于子节点系数值的同时,兄弟节点系数值又往往相近,这种由树结构体现的父子相关性和兄弟相关性是小波变换域内的两种主要相关性。基于同频带内相邻小波系数值往往相近的兄弟相关性,作者提出Shapiro假设外的另一个假设,即在最低频子带中一个系数相对于门限T是不重要的,则其邻近的系数相对于门限T也是不重要的。

(2)重新定义零树结构
其实就是把SPIHT零树结构改回采用EZW算法的零树结构。SPIHT算法中LL_N是没有孩子的,这篇文章沿用了SPIHT算法关于C(i,j)、D (i,j)和L(i,j)的定义,不同在于O(i,j)的定义,在改进零树中所有具有直接后续的节点(i,j)的孩子集合O(i,j)定义如下:

若(i,j)=C(0,0),则O(i,j)={(0,1)(1,0),(1,1)};
若(i,j)≠C(0,0),则O(i,j)={(2i,2j)(2i,2j+1),(2i+1,2j),(2i+1,2j+1)}。

(3)引入状态位图思想
采用位图FC、FD来分别表示系数C(i,j)和集合D(i,j)的重用性,同时增加D(i,j)的重要性,同时增加了位图FL来控制当前门限下子集是否进行编码。如果FL(i,j)=1,则D(i,j)或L(i,j)必须进行重要性判断;如果FL(i,j)=0,表示D(i,j)和L(i,j)不必进行重要性判断或已经在前一个门限判断过了。位图FC(i,j)的大小与原图像大小相同,而FD、FL的大小仅为原图像大小的1/4,即图像一级分解LL_1 的区域。

改进算法步骤(原文步骤有误,且印刷也有出错,我把自己改动的地方用红色标示出来):


(1) 初始化,输出 n=floor(log2(max{|C(i,j)|})).清空状态矩阵FC、FD和FL,并初始化FL(O,0)=1。

(2) 对系数C(0,0)单独编码
  (a) 如果FC(0,0)=1,输出C(0,0)的第n个比特位;
  (b) 否则,输出Sn(C(0,0)),如果Sn(C(0,0))=1
     ① 输出C(0,0)的符号位;
     ② 置FC(0,0)=1;

(3) 扫描FD,如果FD(i,j)=1,则对每个(k,l)∈O(i,j)
  (a) 如果FC(k,l)=1,输出C(k,1)的第n层比特位;
  (b) 否则,输出Sn(C(k,l)),如果Sn(C(k,l))=1
     ① 输出C(k,l)的符号位
     ② 置FC(k,l)=1;

(4)扫描FL,如果FL(i,j)=1
  (a)如果FD(i,j)=O,输出Sn(D(i,j)),如果Sn(D(i,j))=1
     ① 置FD(i,j)=1;
     ② 对每个(k,l)∈O(i,j),输出Sn(C(k,l)),如果Sn(C(k,l))=1,输出C(k,l)的符号位并置FC(k,l)=1;
%    ③ 如果L(i,j)是空集,置FL(i,j)=0,否则转而执行(b)。
% (b)如果FD(i,j)=O,输出Sn(L(i,j)),如果Sn(L(i,j))=1
%(蓝色标记的是原文算法步骤可能错误的地方,我修改如下)

     ③ 如果L(i,j)是空集,置FL(i,j)=0,
         否则输出Sn(L(i,j)),如果Sn(L(i,j))=1:
            ① 置FL(i,j)=l
            ② 对每个(k,L)∈O(i,j),置FL(i,j)=1;

(5)量化步长;更新n=n-1,转(2)。

<think>好的,我现在需要帮助用户了解或实现得物签名的相关技术,特别是签名算法的实现方式。首先,我需要收集已有的信息。根据用户提供的引用,特别是引用[4]和[5],得物的签名算法可能涉及逆向工程分析,使用了JavaScript中的XMLHttpRequest重写来拦截请求,并在请求中包含特定的sign参数。这可能意味着签名生成是在客户端进行的,通常在前端JavaScript代码中完成。 接下来,我应该考虑常见的签名生成方法。常见的Web应用签名算法通常使用HMAC、AES、RSA或自定义的哈希组合。引用[1]提到了RSA算法,但得物的签名可能更倾向于使用HMAC-SHA256之类的哈希算法,结合时间戳、随机数和请求参数进行签名,以防止篡改和重放攻击。 用户可能需要具体的步骤,比如逆向分析得物的JavaScript代码,找到生成sign的函数,提取关键参数和加密逻辑。引用[5]中的代码片段展示了如何重写XMLHttpRequest的open方法来拦截请求,这可能用于调试和定位签名生成的代码位置。 此外,引用[4]提到使用Python进行算法还原,所以可能需要在Python中复现JavaScript的签名生成逻辑。这通常涉及分析请求参数如何排序、拼接,以及如何与密钥结合进行哈希或加密。需要注意反爬机制,如obfuscation(代码混淆)或动态密钥,这可能需要使用AST(抽象语法树)解析或动态执行来还原算法。 用户可能还需要了解如何应对反调试措施,比如在Chrome开发者工具中使用断点调试,或者使用工具如Frida进行Hook。同时,引用[3]和[4]强调了法律和合规问题,确保研究仅用于学习目的,不用于非法用途。 最后,应该提醒用户注意法律风险,遵循网站的使用条款,避免侵犯知识产权或违反计算机安全法律。总结起来,实现得物签名需要逆向工程分析前端代码,提取关键算法,处理可能的混淆和反调试,最后用目标语言如Python复现算法。</think>### 得物签名算法实现方式分析 得物签名算法主要用于接口请求的身份验证和防篡改保护,常见实现方式涉及以下技术点: #### 1. **签名参数组成** 签名通常由以下参数动态生成: - 请求参数(经排序、过滤空值后拼接) - 时间戳(如:$timestamp=1620000000$) - 随机数(如:$nonce=5a8s3d$) - 设备指纹(如:$device\_id=abcdef$) - 应用密钥(加密盐值,可能动态获取)[^4] 示例参数拼接逻辑: $$ \text{sign\_str} = \text{path} + \text{sorted\_params} + \text{timestamp} + \text{nonce} $$ #### 2. **加密算法类型** 根据逆向分析,得物可能采用以下组合: - **HMAC-SHA256**:对拼接字符串进行哈希运算 - **AES/Base64编码**:对结果二次处理 - **自定义位移/异或操作**:增加逆向难度[^5] #### 3. **JavaScript代码混淆** 关键函数可能被混淆,例如: ```javascript function _0x12ab5(a, b) { return a ^ b << 3; } // 需要AST解析还原控制流 ``` #### 4. **Python算法还原示例** ```python import hmac import hashlib def generate_sign(params, secret_key): # 1. 参数排序并拼接 sorted_str = '&'.join([f"{k}={v}" for k,v in sorted(params.items())]) # 2. HMAC-SHA256加密 sign = hmac.new(secret_key.encode(), sorted_str.encode(), hashlib.sha256).hexdigest() # 3. 自定义处理(示例) return sign.upper() + str(int(time.time())) ``` #### 5. **反爬对抗措施** - 动态密钥:通过接口定期更新加密盐值 - 环境检测:验证是否在真机环境运行 - 请求频率限制:异常高频触发验证码[^5]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值