CrackMe.apk
Download file
package org.apache.commons.codec.digest;
import com.google.common.base.Ascii;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.codec.Charsets;
public class Sha2Crypt {
private static final int ROUNDS_DEFAULT = 5000;
private static final int ROUNDS_MAX = 999999999;
private static final int ROUNDS_MIN = 1000;
private static final String ROUNDS_PREFIX = "rounds=";
private static final Pattern SALT_PATTERN = Pattern.compile("^\\$([56])\\$(rounds=(\\d+)\\$)?([\\.\\/a-zA-Z0-9]{1,16}).*");
private static final int SHA256_BLOCKSIZE = 32;
static final String SHA256_PREFIX = "$5$";
private static final int SHA512_BLOCKSIZE = 64;
static final String SHA512_PREFIX = "$6$";
public static String sha256Crypt(byte[] bArr) {
return sha256Crypt(bArr, (String) null);
}
public static String sha256Crypt(byte[] bArr, String str) {
if (str == null) {
str = SHA256_PREFIX + B64.getRandomSalt(8);
}
return sha2Crypt(bArr, str, SHA256_PREFIX, 32, MessageDigestAlgorithms.SHA_256);
}
private static String sha2Crypt(byte[] bArr, String str, String str2, int i, String str3) {
boolean z;
int i2;
byte b;
byte[] bArr2;
int i3;
byte[] bArr3 = bArr;
String str4 = str;
int i4 = i;
int length = bArr3.length;
if (str4 != null) {
Matcher matcher = SALT_PATTERN.matcher(str4);
if (matcher == null || !matcher.find()) {
throw new IllegalArgumentException("Invalid salt value: " + str4);
}
if (matcher.group(3) != null) {
i2 = Math.max(1000, Math.min(ROUNDS_MAX, Integer.parseInt(matcher.group(3))));
z = true;
} else {
i2 = 5000;
z = false;
}
String group = matcher.group(4);
byte[] bytes = group.getBytes(Charsets.UTF_8);
int length2 = bytes.length;
MessageDigest digest = DigestUtils.getDigest(str3);
digest.update(bArr3);
digest.update(bytes);
MessageDigest digest2 = DigestUtils.getDigest(str3);
digest2.update(bArr3);
digest2.update(bytes);
digest2.update(bArr3);
byte[] digest3 = digest2.digest();
int length3 = bArr3.length;
while (length3 > i4) {
digest.update(digest3, 0, i4);
length3 -= i4;
}
digest.update(digest3, 0, length3);
for (int length4 = bArr3.length; length4 > 0; length4 >>= 1) {
if ((length4 & 1) != 0) {
digest.update(digest3, 0, i4);
} else {
digest.update(bArr3);
}
}
byte[] digest4 = digest.digest();
MessageDigest digest5 = DigestUtils.getDigest(str3);
for (int i5 = 1; i5 <= length; i5++) {
digest5.update(bArr3);
}
byte[] digest6 = digest5.digest();
byte[] bArr4 = new byte[length];
int i6 = 0;
while (i6 < length - i4) {
System.arraycopy(digest6, 0, bArr4, i6, i4);
i6 += i4;
}
System.arraycopy(digest6, 0, bArr4, i6, length - i6);
MessageDigest digest7 = DigestUtils.getDigest(str3);
for (int i7 = 1; i7 <= (digest4[0] & 255) + Ascii.DLE; i7++) {
digest7.update(bytes);
}
byte[] digest8 = digest7.digest();
byte[] bArr5 = new byte[length2];
MessageDigest messageDigest = digest;
int i8 = 0;
while (i8 < length2 - i4) {
System.arraycopy(digest8, 0, bArr5, i8, i4);
i8 += i4;
}
System.arraycopy(digest8, 0, bArr5, i8, length2 - i8);
MessageDigest messageDigest2 = messageDigest;
int i9 = 0;
while (i9 <= i2 - 1) {
messageDigest2 = DigestUtils.getDigest(str3);
int i10 = i9 & 1;
if (i10 != 0) {
bArr2 = bytes;
i3 = 0;
messageDigest2.update(bArr4, 0, length);
} else {
bArr2 = bytes;
i3 = 0;
messageDigest2.update(digest4, 0, i4);
}
if (i9 % 3 != 0) {
messageDigest2.update(bArr5, i3, length2);
}
if (i9 % 7 != 0) {
messageDigest2.update(bArr4, i3, length);
}
if (i10 != 0) {
messageDigest2.update(digest4, i3, i4);
} else {
messageDigest2.update(bArr4, i3, length);
}
digest4 = messageDigest2.digest();
i9++;
bytes = bArr2;
}
byte[] bArr6 = bytes;
StringBuilder sb = new StringBuilder(str2);
if (z) {
sb.append(ROUNDS_PREFIX);
sb.append(i2);
sb.append("$");
}
sb.append(group);
sb.append("$");
if (i4 == 32) {
B64.b64from24bit(digest4[0], digest4[10], digest4[20], 4, sb);
B64.b64from24bit(digest4[21], digest4[1], digest4[11], 4, sb);
B64.b64from24bit(digest4[12], digest4[22], digest4[2], 4, sb);
B64.b64from24bit(digest4[3], digest4[13], digest4[23], 4, sb);
B64.b64from24bit(digest4[24], digest4[4], digest4[14], 4, sb);
B64.b64from24bit(digest4[15], digest4[25], digest4[5], 4, sb);
B64.b64from24bit(digest4[6], digest4[16], digest4[26], 4, sb);
B64.b64from24bit(digest4[27], digest4[7], digest4[17], 4, sb);
B64.b64from24bit(digest4[18], digest4[28], digest4[8], 4, sb);
B64.b64from24bit(digest4[9], digest4[19], digest4[29], 4, sb);
B64.b64from24bit((byte) 0, digest4[31], digest4[30], 3, sb);
b = 0;
} else {
B64.b64from24bit(digest4[0], digest4[21], digest4[42], 4, sb);
B64.b64from24bit(digest4[22], digest4[43], digest4[1], 4, sb);
B64.b64from24bit(digest4[44], digest4[2], digest4[23], 4, sb);
B64.b64from24bit(digest4[3], digest4[24], digest4[45], 4, sb);
B64.b64from24bit(digest4[25], digest4[46], digest4[4], 4, sb);
B64.b64from24bit(digest4[47], digest4[5], digest4[26], 4, sb);
B64.b64from24bit(digest4[6], digest4[27], digest4[48], 4, sb);
B64.b64from24bit(digest4[28], digest4[49], digest4[7], 4, sb);
B64.b64from24bit(digest4[50], digest4[8], digest4[29], 4, sb);
B64.b64from24bit(digest4[9], digest4[30], digest4[51], 4, sb);
B64.b64from24bit(digest4[31], digest4[52], digest4[10], 4, sb);
B64.b64from24bit(digest4[53], digest4[11], digest4[32], 4, sb);
B64.b64from24bit(digest4[12], digest4[33], digest4[54], 4, sb);
B64.b64from24bit(digest4[34], digest4[55], digest4[13], 4, sb);
B64.b64from24bit(digest4[56], digest4[14], digest4[35], 4, sb);
B64.b64from24bit(digest4[15], digest4[36], digest4[57], 4, sb);
B64.b64from24bit(digest4[37], digest4[58], digest4[16], 4, sb);
B64.b64from24bit(digest4[59], digest4[17], digest4[38], 4, sb);
B64.b64from24bit(digest4[18], digest4[39], digest4[60], 4, sb);
B64.b64from24bit(digest4[40], digest4[61], digest4[19], 4, sb);
B64.b64from24bit(digest4[62], digest4[20], digest4[41], 4, sb);
b = 0;
B64.b64from24bit((byte) 0, (byte) 0, digest4[63], 2, sb);
}
Arrays.fill(digest8, b);
Arrays.fill(bArr4, b);
Arrays.fill(bArr5, b);
messageDigest2.reset();
digest7.reset();
Arrays.fill(bArr3, b);
Arrays.fill(bArr6, b);
return sb.toString();
}
throw new IllegalArgumentException("Salt must not be null");
}
public static String sha512Crypt(byte[] bArr) {
return sha512Crypt(bArr, (String) null);
}
public static String sha512Crypt(byte[] bArr, String str) {
if (str == null) {
str = SHA512_PREFIX + B64.getRandomSalt(8);
}
return sha2Crypt(bArr, str, SHA512_PREFIX, 64, MessageDigestAlgorithms.SHA_512);
}
}
Download file