· 7 years ago · Nov 07, 2018, 06:32 PM
1func decrypt(encryptedText: String, keys :String) -> String{
2 let encryptedData = encryptedText.data(using: .utf16LittleEndian)
3 let derivedKey = generateDerivedKey(keyString: keys)
4 let key = Array(derivedKey[0..<32])
5 let iv = Array(derivedKey[32..<48])
6 let keyData = Data(bytes: key, count: key.count)
7 let ivData = Data(bytes: iv, count: iv.count)
8 let decryptedData = testDeCrypt(data: encryptedData!, keyData: keyData, ivData: ivData, operation: kCCDecrypt)
9
10 return String(bytes: decryptedData, encoding: .unicode)!
11}
12
13func generateDerivedKey(keyString :String) -> [Int8] {
14 let salt: [UInt8] = [0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76]
15 var key = [UInt8](repeating: 0, count: 48)
16 CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2), keyString, keyString.utf8.count, salt, salt.count, CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA1), 1000, &key, 48)
17 let derivedKey : [Int8] = key.map {Int8(bitPattern: $0)}
18
19 return derivedKey
20}
21
22func testDeCrypt(data: Data, keyData: Data, ivData: Data, operation: Int) -> Data {
23 assert(keyData.count == Int(kCCKeySizeAES128) || keyData.count == Int(kCCKeySizeAES192) || keyData.count == Int(kCCKeySizeAES256))
24 var decryptedData = Data(count: data.count)
25 var num_bytes_decrypted: size_t = 0
26 let operation = CCOperation(operation)
27 let algoritm = CCAlgorithm(kCCAlgorithmAES)
28 let options = CCOptions(kCCOptionPKCS7Padding)
29 let cryptoStatus = keyData.withUnsafeBytes {keyDataBytes in
30 ivData.withUnsafeBytes {ivDataBytes in
31 data.withUnsafeBytes {dataBytes in
32 decryptedData.withUnsafeMutableBytes {decryptedDataBytes in
33 CCCrypt(operation, algoritm, options, keyDataBytes, keyData.count, ivDataBytes, dataBytes, data.count, decryptedDataBytes, decryptedData.count, &num_bytes_decrypted)
34 }
35 }
36 }
37 }
38 if cryptoStatus == CCCryptorStatus(kCCSuccess) {
39 decryptedData.count = num_bytes_decrypted
40 return decryptedData
41 } else {
42 return Data()
43 }
44}
45
46public static String aesDecrypt(String text, String key) {
47 byte[] decValue = null;
48 try {
49 byte[] salt = new byte[] { 0x49, 0x76, 0x61, 0x6E, 0x20, 0x4D,
50 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 };
51 SecretKeyFactory factory = SecretKeyFactory
52 .getInstance("PBKDF2WithHmacSHA1");
53 PBEKeySpec pbeKeySpec = new PBEKeySpec(key.toCharArray(), salt,
54 1000, 384);
55
56 Key secretKey = factory.generateSecret(pbeKeySpec);
57 byte[] keys = new byte[32];
58 byte[] iv = new byte[16];
59 System.arraycopy(secretKey.getEncoded(), 0, key, 0, 32);
60 System.arraycopy(secretKey.getEncoded(), 32, iv, 0, 16);
61
62 SecretKeySpec secretSpec = new SecretKeySpec(keys, "AES");
63
64 AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
65 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
66
67 try {
68 cipher.init(Cipher.DECRYPT_MODE, secretSpec, ivSpec);
69 } catch (InvalidKeyException e) {
70
71 } catch (InvalidAlgorithmParameterException e) {
72 }
73
74 org.apache.commons.codec.binary.Base64 decoder = new org.apache.commons.codec.binary.Base64();
75 byte[] decodedValue = decoder.decode(text.getBytes());
76
77 decValue = cipher.doFinal(decodedValue);
78
79 } catch (Exception e) {
80 }
81
82 if (decValue != null) {
83 return new String(decValue, Charset.forName("UTF_16LE"));
84 } else {
85 return null;
86 }
87}