尝试通过小型编码测试打开开发者选项

Trying to open developer options with small coding test

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

问题如下:

Create a .txt file (saved in a specific location) having the hexadecimal representation of the SHA-256 checksum of the decimal representation of the max value of an 8-byte signed integer shifted right by a value of 0x1a and XOR-ed with the hex value CafeBabe.

我的代码是:

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

更新:

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

开发人员确认 0xcafebabe 是应该使用的。在 Eclipse 中,尽管 0xCafeBabe 将给出与 0xcafebabe.

相同的结果

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

a0946923280760e172171605e3c85d096ffa39dfbc308161b05b93e77120e453

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

披露:我是 Scelight.

的作者

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


Java

中的解决方案

having the hexadecimal representation of the SHA-256 checksum of...

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

the max value of an 8-byte signed integer

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

long a = Long.MAX_VALUE;

shifted right by a value of 0x1a

a >>= 0x1a;

and XOR-ed with the hex value CafeBabe.

您需要使用 long 类型的值 0xcafebabe。但请注意,如果您使用值 0xcafebabe,那是一个 int 类型的常量,如果您将其转换为 long,则符号位将用于扩展它:

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

所以使用 long 常量:

a ^= 0xcafebabeL;

目前的结果:

a = 134033261889

...having the hexadecimal representation of the SHA-256 checksum of the decimal representation of...

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

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

关于String.getBytes()的注释:是的,它returns字符串的字节使用平台的默认字符集。但是由于字符串只包含数字(可选负号,但在我们的例子中它是正号),所以没问题。在关键任务应用程序中,应指定编码,如下所示:(""+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);
    }
}

在"compact"模式下的完整运行可用代码:

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))))

和 "compact" 一行:

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

可以在 Go Playground.

上尝试 Go 解决方案