/
/
onCrackmeClicked中的Java源码生成密钥的算法如下:
MessageDigest sha1
=
MessageDigest.getInstance(
"SHA1"
);
String s
=
"检测到你改签名了,你得把这个过了,不然就不让你继续。"
;
byte[] sigHash
=
new byte[] {(byte)
0x6d
,(byte)
0xf2
,(byte)
0x47
,(byte)
0xa8
,(byte)
0xe0
,(byte)
0xc8
,(byte)
0x3a
,(byte)
0xb3
,(byte)
0xde
,(byte)
0x58
,(byte)
0x85
,(byte)
0x1e
,(byte)
0x17
,(byte)
0xc3
,(byte)
0xa9
,(byte)
0x50
,(byte)
0xd6
,(byte)
0x97
,(byte)
0x26
,(byte)
0x1d
};
/
/
这是APK签名的SHA1
byte[] seeda
=
(
"这是计算密钥用的seed"
+
s
+
"随便加个salt香不香"
).getBytes(
"UTF-8"
);
Random rnd
=
new Random(seeda.length
+
sigHash.length);
for
(
int
i
=
0
; i <
100
; i
+
+
) {
int
x
=
rnd.nextInt(seeda.length);
int
y
=
rnd.nextInt(seeda.length);
byte b
=
seeda[x];
seeda[x]
=
seeda[y];
seeda[y]
=
(byte)(b ^ sigHash[i
%
sigHash.length]);
}
sha1
=
MessageDigest.getInstance(
"SHA1"
);
byte[] b
=
sha1.digest(seeda);
byte[] buf
=
new byte[
32
];
for
(
int
i
=
0
; i < buf.length; i
+
+
) {
buf[i]
=
(byte)(b[i
%
b.length] ^ sigHash[i
%
sigHash.length] ^ rnd.nextInt());
}
/
/
将buf转成
16
进制的小写字符串就是密钥了。