gpt4 book ai didi

java - 这个加密函数是可逆的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:39:43 33 4
gpt4 key购买 nike

我目前正在应对一个小挑战,试图弄清楚一个未命名的加密算法是如何工作的。原始算法如下所示:

public final String a(byte[] original)
{
this.a = original.length;
byte[] solution = new byte[8];

int i = 0;

int base = 13;

for (int si = 0; si < 8; si++)
{
for (int oi = 0; oi < a; oi++)
{
byte current = original[oi];

solution[i] = ((byte)(solution[i] + (current ^ base)));
base = (base ^ i) + solution[i];

i = (i + 1) % 8;
}
}
char[] result = new char[8];
for (int n = 0; n < 8; n++) {
result[n] = ((char)((solution[n] & 0x3F) + 48));
}
return String.valueOf(result);
}

因此,作为 byte[] 数组传递给此函数的每个字符串都将被编码为 8 字符的有点神秘的文本。我发现了其他关于此的事情:

  • char[] 结果 中的编码字符总是 具有值在48111 之间的文字 ( 0x3F + 48).
  • 解码时,第一步是减去48,然后撤销&操作。由于 0x3F 等于二进制表示 111111,原始字节的值是 4 种可能性之一:
    • 00xxxxxx:缺失的2位均为0。
    • 01xxxxxx:两者的低地址位为一。
    • 10xxxxxx:两者的高地址位为一。
    • 11xxxxxx:他们两个是一个。

意思是,它可能是四个字符之一。我最初考虑过反转算法,但我想问你这种算法是否可行。我试过了,走到了这一步:

public static String b(String encrypted) {

byte[][] matrix = new byte[4][20];
byte[] word = encrypted.getBytes();

for(int i = 0; i < 4; i++) {

for(int j = 0; j < word.length; j++) {

byte tmp = (byte)(word[i] - 48);
matrix[i][j] = (byte)(tmp + i);
}
}

}

我目前减去 48 并将所有 4 种可能性插入二维数组。但是我一直在解决嵌套的 for 循环,尤其是变量 ibase 很难找到。我所拥有的唯一信息是加密的单词以及原始单词的长度为 20 个字面值 MAX(因此是 [4][20] 维度)。

加密对我来说并不熟悉,这让我无法寻找该算法的名称。

如果可以逆转这个算法,我的下一步是什么?

最佳答案

不,在一般情况下这显然是不可逆的。

输出中实际上有 40 位信息(八个字节,每个字节 5 位 -- & 0x1F 将每个字节限制为 5 位)。这意味着只有 240 种可能的输出;可能的输入远不止于此。

如果对输入有一些限制——例如,如果已知其长度很短——则可能对此做出一些推断。但是,您没有说明任何限制,所以……

关于java - 这个加密函数是可逆的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45496715/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com