大卖网逆向分析params参数之加密算法分析

文章主要分析APP加密算法,先通过jadx打开APK找到加密类,因b方法无可读性,再用JEB打开转化为有一定可读性的伪代码。经分析发现使用android.util.Base64.encodeToString加密,通过复制类到JAVA环境测试,按JEB代码逻辑处理后加密结果与APP一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前文章已经找到了params参数的生成位置,这里分析下加密算法

使用jadx打开APK,打开加密类,如下

 发现这个b方法没有可读性,使用JEB打开,如下

 按TAB转化下,发现具有一定可读性,但是也是伪代码,代码直接扔到JAVA里是跑不起来的。

稍微分下可以得到使用了android.util.Base64.encodeToString(v6_1, 0);加密,注意这里的v6_1和入参arg6是不一样的,将android.util.Base64这个类复制到JAVA环境测试下,如下

'123456'签名出来是MTIzNDU2,实际应该是H4sIAAAAAAAAADM0MjYxNQMAYdNyCQYAAAA=

 这个b方法对入参进行了处理后再base64加密导致,照着JEB里面代码逻辑扣下,如下

 这个123456加密结果就和APP一致了。APP结果可以hook输出看下。具体不难,自己练练手吧。

纯技术交流,请勿用于非法用途,如有权益问题可以发私信联系我删除.

### ECC 加密算法的具体运算过程 #### 1. 参数选择 为了实施 ECC 加密,首先需要选定一条定义于特定有限域上的椭圆曲线以及该曲线上的一点作为基点 \( G \)[^1]。 对于实际应用而言,通常会选择如下参数: - **\( p \)**:一个质数,用于指定有限域 GF(p),即所有操作都在模 \( p \) 的情况下执行。 - **a, b**:两个系数,用来描述椭圆曲线方程的形式 \( y^2 = x^3 + ax + b \mod p \)。 - **G (Base Point)**:位于所选椭圆曲线上的已知点,也称为生成元。 - **n**:子群阶数,表示从基点出发通过加法能够到达的最不同点的数量;它是一个非常的整数。 这些参数共同构成了公开的系统参数集合,在整个通信过程中保持不变并被双方知晓[^2]。 #### 2. 密钥对生成 私钥 \( d_A \) 是一个小于 n 的随机正整数。对应的公钥 \( Q_A \) 则由下述方式计算得出: \[Q_A=d_AG\] 这里 \( Q_A \) 表示用户的公钥,而 \( d_A \) 即为其私钥。此步骤利用了椭圆曲线上的标量乘法特性——给定两点很容易求得它们相加的结果,但如果只知道其中一个点及其倍数,则很难反推出另一个原始点的位置关系[^3]。 #### 3. 数据加密流程 假设发送者想要向接收者传递消息 M ,则按照以下步骤完成加密处理: - 发送者选取临时私钥 k 并据此算出相应的公共组件 K=kG; - 计算共享秘密 S=[d_B]K 或等价形式 S=[k]Q_B (其中 B 方持有私钥 d_B 及其对应公钥 Q_B),这一步骤依赖于双方面预先协商好的对方公钥信息; - 将明文转换成适合编码到椭圆曲线上的格式 Pm; - 使用上述得到的秘密值S 对Pm 进行某种掩蔽变换 C=Pm+S*G 得到最终的密文C; - 同时附带传输额外的信息如 K 给接收端以便解码验证。 ```python def ecc_encrypt(public_key_QB, message_point_Pm): import random # 假设已经选择了合适的椭圆曲线参数和基点G curve_params = {'p': ..., 'a': ..., 'b': ...} base_point_G = ... # 随机选择临时私钥k temp_private_key_k = random.randint(1, n-1) # 计算公共组件K=kG public_component_K = scalar_multiply(temp_private_key_k, base_point_G) # 获取接收者的公钥QB receiver_public_key_QB = public_key_QB # 计算共享秘密S=[k]QB shared_secret_S = scalar_multiply(temp_private_key_k, receiver_public_key_QB) # 应用共享秘密对消息进行掩蔽变换获得密文C ciphertext_C = add_points(message_point_Pm, multiply_point(shared_secret_S, base_point_G)) return (public_component_K, ciphertext_C) # 辅助函数: 实现椭圆曲线上点的加法、倍增及标量乘法 def add_points(P, Q): ... def double_point(P): ... def scalar_multiply(k, P): ... ``` #### 4. 解密过程 当接收到包含有附加信息 K 和密文 C 的数据包后,接收方可依据自身持有的私钥 \( d_B \) 来恢复原消息: - 接收者先重新构建相同的共享秘密 S'=[d_B]K; - 然后再逆向移除之前施加过的掩蔽效果从而还原初始的消息点位置 Pm'=C-S'*G; - 最终将所得坐标映射回原来的消息空间内读取出真正的内容M。 ```python def ecc_decrypt(private_key_dB, received_data): public_component_K, ciphertext_C = received_data # 根据自己的私钥dB重建共享秘密S' reconstructed_shared_secret_S_prime = scalar_multiply(private_key_dB, public_component_K) # 移除掩蔽获取原文本点Pm' original_message_point_Pm_prime = subtract_points(ciphertext_C, multiply_point(reconstructed_shared_secret_S_prime, base_point_G)) # 映射回消息空间内的真实内容M decrypted_message_M = map_to_original_space(original_message_point_Pm_prime) return decrypted_message_M # 辅助函数: 完成减法操作和其他必要的映射工作 def subtract_points(C, masked_value): ... def map_to_original_space(point_on_curve): ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liberty888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值