【问题标题】:Trying to open developer options with small coding test尝试通过小型编码测试打开开发人员选项
【发布时间】:2023-03-10 17:50:01
【问题描述】:

我正在尝试打开一个名为 Scelight 的程序的开发者模式。该程序在让您进入之前进行了一些测试。

问题如下:

创建一个 .txt 文件(保存在特定位置),其 SHA-256 校验和的十六进制表示是 8 字节有符号整数的最大值的十进制表示,右移值 0x1a 和 XOR-用十六进制值 CafeBabe 编辑。

我的代码是:

long a = 9223372036854775807L;
a = a >> 0x1a;
long hex2 = 0xcafebabe;
long out4 = a ^ hex2;

更新:

使用 Eclipse 和 Java 编写此代码。建议开发者使用。

开发人员确认应该使用0xcafebabe。在 Eclipse 中,虽然0xCafeBabe 会给出与0xcafebabe 相同的结果。

结果,这给了我-136549677759,然后我将其放入 .txt 文件并保存。不幸的是,这不正确,因为开发者选项不可用。

a0946923280760e172171605e3c85d096ffa39dfbc308161b05b93e77120e453

这是-136549677759 的结果,它不起作用。我相信我们正在寻找最终结果的校验和。

【问题讨论】:

  • 我也想补充一下。我在某个地方完全错过了什么吗?我知道文件中的文本会改变该文件的校验和。
  • 另外,这可能是对说明的误解;您应该采用 max value 的 SHA-256 校验和还是其余计算的校验和?
  • 您已跳过 SHA-256 步骤。此外,不清楚您是否需要最大 int64 或 uint64,因此请尝试两者。此外,还不清楚您是否需要仅对数字 0xCAFEBABE 进行异或运算,或者对其位模式重复 8 次,因此也请尝试这两种方法。另外,还不清楚最终结果是应该格式化为十进制数字、十六进制数字还是只是一串字节,所以三种都试一下。

标签: java bitwise-operators sha256


【解决方案1】:

披露:我是Scelight 的作者。

事先说明:问题陈述不要求你使用Java,任何编程语言都可以。


Java 中的解决方案

具有...的 SHA-256 校验和的十六进制表示

我们需要计算某事物的 SHA-256 校验和,并且校验和必须使用十六进制数字表示。十六进制表示中的大小写(小写或大写字母)无关紧要。

8字节有符号整数的最大值

这是Long.MAX_VALUE = (1L<<63)-1 = 9223372036854775807L

long a = Long.MAX_VALUE;

右移值 0x1a

a >>= 0x1a;

并与十六进制值 CafeBabe 进行异或运算。

您需要使用long 类型的值,即0xcafebabe。但请注意,如果使用值0xcafebabe,即为int 类型的常量,如果将其转换为long,则会使用符号位对其进行扩展:

System.out.printf("%x", (long)0xcafebabe); // Prints ffffffffcafebabe

所以使用long 常量:

a ^= 0xcafebabeL;

目前的结果:

a = 134033261889

...具有...的十进制表示的 SHA-256 校验和的十六进制表示

SHA-256 校验和(省略异常处理!):

byte[] result = MessageDigest.getInstance("SHA-256").digest((""+a).getBytes());

关于String.getBytes() 的注意事项:是的,它使用平台的默认字符集返回字符串的字节。但由于字符串只包含数字(可选负号,但在我们的例子中是正号),没关系。在任务关键型应用程序中应指定编码,如下所示:(""+a).getBytes(StandardCharsets.UTF_8)

以及十六进制表示:

for (byte b : result) {
    System.out.printf("%02x",b);
}

注意"%02x"格式字符串,一个字节的十六进制表示必须是2个十六进制数字,如果等于或小于0xf,首先是0

输出的前 8 个字符(修剪,如果你想要完整的输出,至少运行代码):

e0dd2851...

完整的可运行代码:

public static void main(String[] args) throws Exception {
    long a = Long.MAX_VALUE;
    a >>= 0x1a;
    a ^= 0xcafebabeL;

    byte[] result = MessageDigest.getInstance("SHA-256").digest(("" + a).getBytes());
    for (byte b : result) {
        System.out.printf("%02x", b);
    }
}

“紧凑”模式下的完整可运行代码:

for (byte b : MessageDigest.getInstance("SHA-256")
        .digest(Long.toString((Long.MAX_VALUE >> 0x1a ^ 0xcafebabeL)).getBytes()))
    System.out.printf("%02x", b);

Go 中的解决方案

Go 中的解决方案更短:

a := int64(math.MaxInt64)
a >>= 0x1a
a ^= 0xcafebabe
fmt.Printf("%x", sha256.Sum256([]byte(fmt.Sprint(a))))

还有“紧凑”的单线:

fmt.Printf("%x", sha256.Sum256([]byte(fmt.Sprint(int64(1<<63-1)>>0x1a^0xcafebabe))))

可以在Go Playground 上试用 Go 解决方案。

【讨论】:

  • 哇。感谢您的精彩回答!刚刚看了一下检查器选项卡。这条路才刚刚开始。
猜你喜欢
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
相关资源
最近更新 更多