-
Notifications
You must be signed in to change notification settings - Fork 1
/
decrypt.java
122 lines (116 loc) · 4.67 KB
/
decrypt.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import java.security.MessageDigest;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.util.Base64;
import java.io.File;
import java.io.RandomAccessFile;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class decrypt {
private static Map<String, byte[]> salt_hash = new HashMap<>();
public static void main(String[] args) {
if (args.length < 1) {
System.out.println("Usage: java decrypt <encoded_string>");
return;
}
try {
String key = getHash("crushftp", true, "SHA", "", "", false);
Cipher dcipher = Cipher.getInstance("DES");
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
dcipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] dec = Base64.getDecoder().decode(args[0]);
byte[] utf8 = dcipher.doFinal(dec);
System.out.println(new String(utf8, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getHash(String key, boolean base64, String method, String salt_data, String user_salt, boolean sha3_keccak_mode) throws Exception {
byte[] salt_bytes = new byte[0];
if (salt_data != null && !salt_data.equals("") && (new File(salt_data)).exists()) {
String salt_key = String.valueOf((new File(salt_data)).lastModified());
salt_bytes = salt_hash.get(salt_key);
if (salt_bytes == null) {
RandomAccessFile raf = new RandomAccessFile(new File(salt_data), "r");
salt_bytes = new byte[(int)raf.length()];
raf.read(salt_bytes);
raf.close();
salt_hash.put(salt_key, salt_bytes);
}
}
method = method.toUpperCase();
if (method.equals("MD4")) {
MessageDigest mD4 = MessageDigest.getInstance("MD4");
byte[] b = key.getBytes("UnicodeLittleUnmarked");
mD4.update(b, 0, b.length);
if (base64)
return Base64.getEncoder().encodeToString(mD4.digest());
return new String(mD4.digest());
}
MessageDigest md = null;
if (method.startsWith("SHA3")) {
md = MessageDigest.getInstance("SHA-3-224");
} else {
md = MessageDigest.getInstance(method);
}
if (user_salt.trim().length() > 0) {
if (user_salt.startsWith("!!")) {
key = key + user_salt.substring(2);
} else if (user_salt.startsWith("!")) {
key = user_salt.trim().substring(1) + key;
} else {
key = key + user_salt.trim();
}
byte[] b = key.getBytes(System.getProperty("crushftp.hash.encoding", "UTF8"));
int cut_amount = Integer.parseInt(System.getProperty("crushftp.hash.cut", "0"));
byte[] b2 = b;
if (cut_amount > 0)
b2 = Arrays.copyOfRange(b, cut_amount - 1, b.length + 1);
md.update(b2);
} else {
byte[] b = key.getBytes(System.getProperty("crushftp.hash.encoding", "UTF8"));
md.update(b);
}
if (salt_bytes.length > 0) {
md.update(salt_bytes);
}
if (method.equals("MD5")) {
String hash = (new BigInteger(1, md.digest())).toString(16).toLowerCase();
while (hash.length() < 32)
hash = "0" + hash;
return hash;
}
if (method.equals("SHA512")) {
String hash = (new BigInteger(1, md.digest())).toString(16).toLowerCase();
while (hash.length() < 128)
hash = "0" + hash;
return hash;
}
if (method.equals("SHA256")) {
String hash = (new BigInteger(1, md.digest())).toString(16).toLowerCase();
while (hash.length() < 64)
hash = "0" + hash;
return hash;
}
if (method.equals("SHA3")) {
return bytesToHex(md.digest()).toLowerCase();
}
if (base64)
return Base64.getEncoder().encodeToString(md.digest());
return new String(md.digest(), "UTF8");
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}