奇数密码加扰算法

信息安全 密码 密码破解 编码
2021-08-20 20:40:14

我正在研究一个具有我以前从未见过的密码加扰算法的应用程序。我生成了几个密码(允许的最大长度为 8 个字符),得到以下结果:

password:     0  0  0  0  0  0  0  3
scrambled:    W1 U6 W1 U6 W1 U6 W1 X2

password:     0  0  0  0  0  0  0  2
scrambled:    W1 U6 W1 U6 W1 U6 W1 M7

password:     0  0  0  0  0  0  0  1
scrambled:    W1 U6 W1 U6 W1 U6 W1 F2

password:     0  0  0  0  0  0  0  0
scrambled:    W1 U6 W1 U6 W1 U6 W1 U6

password:     1  2  3  4  5  6  7  8
scrambled:    H9 G6 B5 G3 F8 Q7 X8 O9

加扰显然是可逆的。我在想更糟的是我可以生成一个字典映射,但我认为会有一种更聪明的方法来解决这个问题。

有没有人遇到过这样的事情?

更新

更多价值并指出:

  • 0 行为与其他角色完全不同
  • @ 也值得注意(在每个位置都保持不变)
  • 算法不能或不会处理少于 3 个字符的密码
4  4  4  4  4  4  4  4
A2 S5 K9 G3 Y6 U0 M4 E8

3  3  3  3  3  3  3  3
L4 Z5 B5 R1 R5 F7 H6 X2

2  2  2  2  2  2  2  2
W6 G6 S0 C0 K4 U3 C8 M7

1  1  1  1  1  1  1  1
H9 N6 F6 J8 D3 J0 B0 F2

1  0  0  0  0  0  0  3
H9 U6 W1 U6 W1 U6 W1 X2

a  b  a  b  a  b  a  b
H1 E3 B8 W6 Z4 S0 X1 K4

b  b  b  b  b  b  b  b
S8 E3 O2 W6 G6 S0 C0 K4

a  a  a  a  a  a  a  a
H1 L3 B8 H5 Z4 D7 X1 Z8

A  B  C
N6 C0 L0

B  B  B  B  B  B  B  B
M7 Y1 I1 Q5 A5 I9 S8 E3

A  B  A  B  A  B  A  B
B0 Y1 V6 Q5 T3 I9 R0 E3

A  A  A  A  A  A  A  A
B0 F2 V6 B4 T3 X5 R0 T7

A  A  A  A  A  A  A
J0 B0 F2 V6 B4 T3 X5

A  A  A  A  A  A
D3 J0 B0 F2 V6 B4

A  A  A  A  A
J8 D3 J0 B0 F2

A  A  A  A
F6 J8 D3 J0

A  A  A
N6 F6 J8

@  @  @  @
M2 M2 M2 M2

#  #  #  #
P2 B9 F3 T4

*  *  *  *
A9 A1 U7 Q9

!  !  !  !
Z4 D7 X1 Z8

使用蛮力方法解扰这些密码的一般规则:

在长度为 L 的字符串中,位置 N 处的给定字符将始终具有相同的值。

IE:在 8 个字符长的密码中,如果第一个字符是 A,它将始终以相同的方式编码。

注意:我已经想出了解密这些密码的“蛮力”方法,但我很想知道用于加密密码的算法。如果有人有扭转这类事情的经验,我会喜欢一些关于如何从这里开始的提示。

2个回答

这个序列:

a  b  a  b  a  b  a  b
H1 E3 B8 W6 Z4 S0 X1 K4

b  b  b  b  b  b  b  b
S8 E3 O2 W6 G6 S0 C0 K4

a  a  a  a  a  a  a  a
H1 L3 B8 H5 Z4 D7 X1 Z8

告诉有一个密钥被用来打乱输入密码,很像 XOR,除了 XOR 的大多数使用会以十六进制输出,而这个输出是 base36?

这个序列

A  B  A  B  A  B  A  B
B0 Y1 V6 Q5 T3 I9 R0 E3

A  A  A  A  A  A  A  A
B0 F2 V6 B4 T3 X5 R0 T7

A  A  A  A  A  A  A
J0 B0 F2 V6 B4 T3 X5

A  A  A  A  A  A
D3 J0 B0 F2 V6 B4

让我觉得不同长度的字符串有不同的键。

所以,我猜算法采用明文'a',采用'a'(97)的ascii值将其转换为base36(2P),将其与键中的相应值进行异或并给出H1的base36值.

编辑:它似乎不是base36。无论使用哪种编码方案,我仍然猜测它使用 XOR。这将有助于解释零的行为,因为零与 X 异或总是 X。

如果这是真的,则该过程是可逆的,并且可以找到密钥,从而无需暴力破解或制作查找表。

我将要提出的许多技巧都需要过度使用扰码器。它们不是字典攻击,但它们确实包含大量密码加扰以收集数据。如果您的目标是在没有针对该功能的太多测试探针的情况下做到这一点,或者您无法做到这一点,那么我真的没有太多技巧。

整数

整数很容易使用,任何实现自己加扰的人都可能对整数进行操作,而不是字符串。找到两个符号标记( 、 等)和整数之间的对应关系J8可能D9是至关重要的。由于所有数字和字母都被表示,因此可以使用26*20=260不同的标记。260舒适地接近256,这可能表明令牌只是字节的编码。

直观的方法是解释Xn10*X+n,其中X是字母 X 的索引和0 到 9 之间的整数。这由对应于整数n的标记排除,对于一个字节来说太大了。以类似的方式可以排除其他几种编码,至少这些简单的线性组合:Z8258

b = 10*X + n
b = 10*(26-X) + n
b = (26-X) + 26*n
b = 10*(26-X) + (9-n)
b = (26-X) + 26*(9-n)

为了排除我们所做的编码猜测,知道什么令牌出现在打乱中是非常有帮助的。如果令牌是字节的编码,那么应该有260-256=4永远不会出现的令牌。找到这些标记可以提供有价值的提示。如果所有令牌确实在某个时候出现,那也是一个有价值的提示。

盒子

密码('AAA', 'AAAA', 'AAAAA' ...)为我们提供了有用的信息。我们可以通过观察推断,单个符号的加扰函数是一个函数f(symbol, integer) -> token,其中整数i是密码长度和符号索引的总和。例如。f(A, 4+1) = f(A, 3+2) = J8. 通常f(symbol, length + index)对于所有长度和索引都是恒定的。

A  A  A  A
F6 J8 D3 J0

A  A  A
N6 F6 J8

由于密码限制为 8 个符号,因此我们有8+8 = 16不同的加扰函数g_n(symbol) -> token要查找。这些函数是否依赖于整数“n”(即length + index)很难从可用数据中确定。这些功能g_n可以实现为查找表,并且完全不遵循任何模式。

@

这个@角色让我很困惑,但也许是为了识别乱码的电子邮件地址。电子邮件地址比 8 个符号长,并且可能暗示加扰也适用于更长的输入,这反过来表明函数g_n 依赖n(惰性定理,没有人制作超过 16 个随机查找表)

构建查找表

这可以通过简单地加扰所有密码来完成aa...abb...b... ^^...^,并使用长度和位置的关系来决定g_n加扰结果属于哪个函数。该数据还将有助于找出令牌对数据进行编码的内容和方式。

看着桌子

如果我们为所有长度为 8 的重复字母密码构建表,即。aaaaaaaa, bbbbbbb, 等等。我们可以将加扰的结果可视化为 8x26 图像。人类擅长看图像,因此最简单的东西(例如线性)很容易从图像中看到。在图像中寻找水平、垂直、方形或对角线伪影可以说明用于加密密码的算法。这种方法非常有机,需要一些脚本/编程技能。

我的可视化方法如下:

  • 为所有 8 个重复 ASCII 字符(或字节,如果可能)的密码生成打乱
  • 使用一些简单的方案(例如线性组合)将标记转换为字节
  • 将字节保存为二进制文件 bytes.gray
  • 使用ImageMagick convert实用程序:convert -size 8x256 -depth 8 bytes.gray bytes.png
  • 查看图像并尝试找到模式