本帖最后由 who4who 于 2019-8-22 09:01 编辑
我在三个程序中碰到了该加密算法,它应该是一种有名字的加密算法,但我不知道它叫什么名字。
下面是我重建的代码。请各位帮看一看,该算法名称是什么?
[C] 纯文本查看 复制代码
#include <stdint.h>
#include <string.h>
typedef struct {
int head[2];
int body[256];
} box_t;
/**
* @brief 扩展密钥,初始化盒
* @param[out] pb 密盒指针
* @param[in] p_key 密钥指针
* @param[in] l_key 密钥长度
*/
static void InitKeyBox(box_t *pb, const uint8_t *p_key, size_t l_key) {
{ // 初始化得 {{0,0}, {0,1,...,255}}
pb->head[0] = 0;
pb->head[1] = 0;
for (int i = 0; i < 256; ++i)
pb->body[i] = i;
}
{ // 乱序 pb->body[]
int x = 0; // 下标于 pb->body[]
int k = 0; // 下标于 p_key[]
for (int i = 0; i < 256; ++i) {
int bi = pb->body[i];
x = (uint8_t)(bi + p_key[k] + x); // 算出另一处
pb->body[i] = pb->body[x];
pb->body[x] = bi; // 交换 i 和 x 两处
k = (k + 1 < l_key ? k + 1 : 0); // k 循环下移
}
}
}
/**
* @brief 用密盒异或处理数据
* @param[in,out] pb 密盒指针
* @param[in,out] p_dat 数据缓冲
* @param[in] l_dat 数据长度
*/
static void XorWithBox(box_t *pb, uint8_t *p_dat, size_t l_dat) {
int x = pb->head[0];
int y = pb->head[1];
for (size_t i = 0; i < l_dat; ++i) {
int dx, dy;
// 准备下标
x = (uint8_t)(x + 1);
y = (uint8_t)(y + pb->body[x]);
// 准备数据
dx = pb->body[x];
dy = pb->body[y];
// 交换 x 和 y 两处
pb->body[x] = dy;
pb->body[y] = dx;
// 异或
p_dat[i] ^= pb->body[(uint8_t)(dx + dy)];
}
pb->head[0] = x;
pb->head[1] = y;
}
/**
* @brief 加密或解密数据
* @param[in] p_key 密钥
* @param[in,out] p_dat 数据缓冲
* @param[in] l_dat 数据长度
*/
void UnknownAlgorithm(const char *p_key, uint8_t *p_dat, size_t l_dat) {
box_t box = {0};
InitKeyBox(&box, (const uint8_t *)p_key, strlen(p_key));
XorWithBox(&box, p_dat, l_dat);
}
|