#encryption #hash #sha #lower-case #crypto

df1t-cyph

使用无外部加密库的坚实基础结构顺序算法制作的简化Rust加密算法

4个版本

0.2.1 2024年1月24日
0.2.0 2024年1月24日
0.1.1 2024年1月24日
0.1.0 2024年1月24日

#370加密学


用于 wardenx-core

MIT/Apache

300KB
1K SLoC

df1t-cyph

仅仅是一个不遵循加密标准的简单Rust加密算法。其名称的字面意思为 这是啥密文!

注意:此项目仅为实验目的,强烈不建议将其视为严肃的加密解决方案。

这个玩意是如何工作的?

和其他加密算法一样,它接受一个字符串和一个最大16字符的盐作为参数。

这是df1t-cyph的beta版本,存在一些限制

  • 准确性尚未测试,这意味着您可能会得到不一致的结果。
  • df1t-encrypt只接受字母(大小写)和固定数字。

加密

df1t-encrypt 函数通过6个阶段生成最终结果

  • 输入解析
  • 第一级映射
  • 混合和切换
  • 数学转换
  • 数据交换 第二级映射
  • 结果排列

输入解析

在这个阶段,函数将尝试将传入的参数解析为长度相同的连续向量。

参数扩展

首先,比较两个参数的长度,较短的将自身扩展,直到满足较长的参数长度。

例如,以 "superpassword" 作为密码和 "somesalt" 作为盐。显然,盐比密码短5个字符。扩展后,它应该看起来像这样: "somesaltsomes"

如果两个参数长度相同,则此步骤将被跳过。

向量转换

简单地说,两个参数将被分割成向量

password_parse

第一级映射

在这里,函数将运行迭代过程,遍历内部库中的数组,这些数组代表每个字符及其映射的等效字符,并将结果返回为新向量。

eqv

相同的过程将应用于盐向量,但使用不同的等效字符以获得独特的映射。

混合和切换

获得盐和密码的映射版本后,大致如下所示

slt

切换函数将这两个参数作为参数,并根据以下标准进行混合

  • 如果元素(盐和密码)的第一个字符不相等,则取盐字符。
  • 如果元素的第二个字符不相等,则取密码字符。
  • 如果两个字符相等,则交换它们。
  • 如果两个字符相等,则第二对不忽略。

以下是可视化解释。

expl

数学变换

数值变换

在这个级别,混合向量的元素将被拆分以获得单个字符元素向量,例如。

["d","S","n","U","n","P","E","E"]

因此,另一轮迭代将在之前的lib上运行以获取等效的mx_as数字。

mx

迭代结果应该如下所示

[145, 654, 879, 147, 963, 123, 412]

矩阵表示

在这里,该函数将向量转换为n*n矩阵。首先,它通过找到最后一个向量的平方根来计算矩阵的n,然后检查n*n实际上是否等于向量长度,如果不是,则将n加1。

sqrt

按照此路径会导致获取额外的空元素,因为它只有28个元素来填充一个36的矩阵。因此,空元素将被填充为101

mtrx

向量变换

矩阵根据以下表示被拆分为三个主要向量

vecs

之后,矩阵长度将添加到三个向量的每个元素中

数据交换(第二级映射)

在我们使用第一个映射级别的固定参考时,现在我们将使用ceaser substitution通过一组约70个不同的字符作为参考,使其变得更具动态性。

ceaser交换如下

  • 对于绿色向量,向右移动绿色向量长度 + 2
  • 对于红色向量,向右移动红色向量长度
  • 对于蓝色向量,向右移动蓝色向量长度 + 红色向量长度 + 1

最后,每个向量将连接成一个字符串。

结果排列

该函数将结果连接成一个单个字符串。 原始密码长度 + 绿色向量 + 红色向量 + 蓝色向量

  • 原始密码长度通过相同的ceaser交换过程进行移动,移动距离为142。然而,长度将需要在解密阶段使用。

对于连接,函数将在每个元素之间添加$,以便使其可解析用于解密。

无运行时依赖