# Cryptographic/Compression Algorithms

## 加密/压缩算法

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS红队专家）</strong></a><strong>！</strong></summary>

支持HackTricks的其他方式：

* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF版本的HackTricks**，请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>

## 识别算法

如果您在代码中**使用移位、异或和多个算术运算**，很可能是**加密算法**的实现。以下将展示一些**无需逆向每个步骤即可识别所使用算法**的方法。

### API函数

**CryptDeriveKey**

如果使用此函数，可以通过检查第二个参数的值来找到**正在使用的算法**：

![](/files/67rppD8uzbv8FEm8L27J)

在此处查看可能算法及其分配值的表格：<https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id>

**RtlCompressBuffer/RtlDecompressBuffer**

压缩和解压给定的数据缓冲区。

**CryptAcquireContext**

从[文档](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta)中得知，**CryptAcquireContext**函数用于获取特定加密服务提供商（CSP）中特定密钥容器的句柄。**返回的句柄用于调用使用所选CSP的CryptoAPI函数**。

**CryptCreateHash**

启动数据流的哈希处理。如果使用此函数，可以通过检查第二个参数的值来找到**正在使用的算法**：

![](/files/YPS1QLZK4DRRkCLxLBBw)

在此处查看可能算法及其分配值的表格：<https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id>

### 代码常量

有时很容易识别算法，因为它需要使用特殊且独特的值。

![](/files/zotIaPV3KXmdfoI2cPdE)

如果您在Google中搜索第一个常量，您会得到以下结果：

![](/files/O42A1815JdQ1zvdTA4kt)

因此，您可以假设反编译的函数是**sha256计算器**。\
您可以搜索任何其他常量，您可能会得到（可能）相同的结果。

### 数据信息

如果代码没有任何重要的常量，可能是**从.data部分加载信息**。\
您可以访问该数据，**将第一个双字组合在一起**，并像前面的部分一样在Google中搜索：

![](/files/EY1ANmv9NEB10KeWU6QJ)

在这种情况下，如果您搜索**0xA56363C6**，您会发现它与**AES算法的表**相关联。

## RC4 **（对称加密）**

### 特征

由3个主要部分组成：

* **初始化阶段/**：创建一个值表，从0x00到0xFF（总共256字节，0x100）。这个表通常称为**替换盒**（或SBox）。
* **混淆阶段**：将在之前创建的表中循环（再次循环0x100次）并使用**半随机**字节修改每个值。为了创建这些半随机字节，使用RC4**密钥**。RC4**密钥**可以是**1到256字节的长度**，但通常建议长度超过5字节。通常，RC4密钥长度为16字节。
* **XOR阶段**：最后，明文或密文与之前创建的值**进行异或**。加密和解密的函数是相同的。为此，将对创建的256字节执行**多次循环**。在反编译的代码中，通常会识别为\*\*%256（模256）\*\*。

{% hint style="info" %}
**要在反汇编/反编译的代码中识别RC4，您可以检查大小为0x100的2个循环（使用密钥），然后将输入数据与在2个循环中创建的256个值进行XOR，可能使用%256（模256）**
{% endhint %}

### **初始化阶段/替换盒：**（注意计数器使用的数字256以及如何在256个字符的每个位置写入0）

![](/files/KD1ngWVAnQiWSItlQVej)

### **混淆阶段：**

![](/files/bZdB6S5RcE18vamJoT2O)

### **XOR阶段：**

![](/files/i8oPeMurGlB6DcOpPepW)

## **AES（对称加密）**

### **特征**

* 使用**替换盒和查找表**
* 可以**通过特定查找表值**（常量）来区分AES。*请注意，**常量**可以**存储**在二进制文件中**或动态创建**。*
* **加密密钥**必须是**16的倍数**（通常为32字节），通常使用16字节的**IV**。

### SBox常量

![](/files/fd25KIXuoP2tvBOCqvmk)

## Serpent **（对称加密）**

### 特征

* 很少发现某些恶意软件使用它，但有例外（Ursnif）
* 可以根据其长度（非常长的函数）轻松确定算法是否为Serpent。

### 识别

请注意以下图像中使用的常量**0x9E3779B9**（请注意，此常量也用于其他加密算法，如**TEA** - Tiny Encryption Algorithm）。\
还请注意**循环的大小**（**132**）以及**反汇编**指令和**代码示例**中的**XOR操作数量**：

![](/files/w4Tz54mN5M3Mdwmw3IXb)

如前所述，此代码可以在任何反编译器中显示为**非常长的函数**，因为其中**没有跳转**。反编译的代码可能如下所示：

![](/files/W08OpbR20NsWi08XaRj7)

因此，可以通过检查**魔术数字**和**初始XOR**，查看**非常长的函数**，并将一些**指令**与**实现**（如左移7位和左旋转22位）进行**比较**，来识别此算法。

## RSA **（非对称加密）**

### 特征

* 比对称算法更复杂
* 没有常量！（难以确定自定义实现）
* KANAL（加密分析器）无法显示RSA的提示，因为它依赖于常量。

### 通过比较识别

![](/files/R4LJyy2hxIvj1qkr3iIq)

* 在第11行（左侧）有一个`+7) >> 3`，与第35行（右侧）的`+7) / 8`相同
* 第12行（左侧）检查`modulus_len < 0x040`，第36行（右侧）检查`inputLen+11 > modulusLen`

## MD5和SHA（哈希）

### 特征

* 3个函数：初始化、更新、完成
* 相似的初始化函数

### 识别

**初始化**

您可以通过检查常量来识别它们。请注意，sha\_init具有MD5没有的1个常量：

![](/files/8O7oMfTJanFT9qXhUmLN)

**MD5变换**

请注意使用更多常量

![](/files/npqarRTL1zIyHhVCzusA)

## CRC（哈希）

* 由于其功能是查找数据中的意外更改，因此更小且更有效
* 使用查找表（因此您可以识别常量）

### 识别

检查**查找表常量**：

![](/files/X9c76aWqUXkMvh9MP7hz)

CRC哈希算法如下：

![](/files/iFZA1vrTM8Zn6mOIMGkF)

## APLib（压缩）

### 特征

* 无法识别的常量
* 您可以尝试在Python中编写算法并在线搜索类似的内容

### 识别

图表相当大：

![](/files/NI6bJIrKbf0aq32NAwlh)

检查**3个比较以识别它**：

![](/files/uiC7XtdOV7r3doQgb3LM)

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS红队专家）</strong></a><strong>！</strong></summary>

支持HackTricks的其他方式：

* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF版本的HackTricks**，请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hacktricks.xsx.tw/crypto-and-stego/cryptographic-algorithms.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
