У меня есть класс MCrypt на Java (в приложении для Android), он работает хорошо, но мне нужно перевести его в Swift 4.
Здесь мой класс на Java
public class MCrypt {
private String SecretKey = "0pw3av67$979cdxf";
private Cipher cipher;
private String iv = "xe95bmad7x5432p8";
private IvParameterSpec ivspec = new IvParameterSpec(this.iv.getBytes());
private SecretKeySpec keyspec = new SecretKeySpec(this.SecretKey.getBytes(), "AES");
public MCrypt() {
try {
this.cipher = Cipher.getInstance("AES/CBC/NoPadding");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e2) {
e2.printStackTrace();
}
}
public byte[] encrypt(String str) throws Exception {
if (str != null) {
if (str.length() != 0) {
try {
this.cipher.init(1, this.keyspec, this.ivspec);
return this.cipher.doFinal(padString(str).getBytes());
} catch (Exception e) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[encrypt] ");
stringBuilder.append(e.getMessage());
throw new Exception(stringBuilder.toString());
}
}
}
throw new Exception("Empty string");
}
public byte[] decrypt(String str) throws Exception {
if (str != null) {
if (str.length() != 0) {
try {
this.cipher.init(2, this.keyspec, this.ivspec);
return this.cipher.doFinal(hexToBytes(str));
} catch (Exception e) {
System.out.println(e);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[decrypt] ");
stringBuilder.append(e.getMessage());
throw new Exception(stringBuilder.toString());
}
}
}
throw new Exception("Empty string");
}
public static String bytesToHex(byte[] bArr) {
if (bArr == null) {
return null;
}
int length = bArr.length;
String str = "";
for (int i = 0; i < length; i++) {
StringBuilder stringBuilder;
if ((bArr[i] & 255) < 16) {
stringBuilder = new StringBuilder();
stringBuilder.append(str);
//stringBuilder.append(AppEventsConstants.EVENT_PARAM_VALUE_NO);
stringBuilder.append(Integer.toHexString(bArr[i] & 255));
str = stringBuilder.toString();
} else {
stringBuilder = new StringBuilder();
stringBuilder.append(str);
stringBuilder.append(Integer.toHexString(bArr[i] & 255));
str = stringBuilder.toString();
}
}
return str;
}
public static byte[] hexToBytes(String str) {
if (str == null || str.length() < 2) {
return null;
}
int length = str.length() / 2;
byte[] bArr = new byte[length];
for (int i = 0; i < length; i++) {
int i2 = i * 2;
bArr[i] = (byte) Integer.parseInt(str.substring(i2, i2 + 2), 16);
}
return bArr;
}
private static String padString(String str) {
int length = 16 - (str.length() % 16);
for (int i = 0; i < length; i++) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str);
stringBuilder.append(' ');
str = stringBuilder.toString();
}
return str;
}}
Вы можете использовать его так:
String testst = "03e91bc1d6c14ad806832f98cf567830561460c565c9f1db426be13e86007c53d8171e1e7d7265c24ad84a0d3c4d346c59bd676ed3f2b2a6c4bde44b541c6a9697c63244c84483817b59e3dd3ac9bd76b9665b1495df06ab64939644221e58bfbf3624cc06af1679833ad8f7430a6314e3eb0a449c59a1f9ea093fc670bd7abab73f0f9ce7e1f74de6a34f4e4bbde6a8c4a44befffbdb020382730c2f99fdcc54319478168150d188d482306c6cc15252b21fc4c569d25cf5d2135b03612c73cd4f066b97b08a8bcd3f82f3158dcd692c33752d3fd0d85f22c841bf4b7ab8adeb9963bc16702baa38e041bbdab9bd7bc786fd5330d3a9d277dbe0ef331e1e5db6a4fc56b19210f694d1be6bc7939027da7fed1b8c412780daf93c033149bb2a90fcda46a8f54edaee3316622e7ec84d3ea831c724607614584aa2b7b882181d4291d0b1a2c73d34a41778125a7a44f7a";
String mastring = new String(new MCrypt().decrypt(teststring));
Результат равен
{"tempsnews":false,"imagenews":"","comments":"","relatednews":"","rnews":"","banned":"","banneduk":"","bannedus":"","bannedca":"","bannedau":"","bannedfr":"","bannedeg":"","bannedsa":"","bannedma":"","bannedsportfr":"","bannedbefr":"","bannedae":"","bannedflashbn":"","bannedglobal":"","bannedhmo":"","bannedng":"","bannednigeria":""}
Для быстрого использования я использую CryptoSwift (https://github.com/krzyzanowskim/CryptoSwift) и начинаю работать над функцией расшифровкиС первого шага это выглядит проще, чем в Java, но я не могу заставить его работать. Это мой метод в Swift:
func aesDecrypt(encryptedString: String,key: String, iv: String) throws -> String {
let input: [UInt8] = Array(encryptedString.utf8)
let decrypted: Array<UInt8> = try AES(key: Array(key.utf8), blockMode: CBC(iv: Array(iv.utf8)), padding: .noPadding).decrypt(input)
let decryptedData = Data(decrypted)
return String(bytes: decryptedData.bytes, encoding: .utf8) ?? "Could not decrypt"
}
, и вы можете вызвать как htaht:
var strencrypted = "03e91bc1d6c14ad806832f98cf567830561460c565c9f1db426be13e86007c53d8171e1e7d7265c24ad84a0d3c4d346c59bd676ed3f2b2a6c4bde44b541c6a9697c63244c84483817b59e3dd3ac9bd76b9665b1495df06ab64939644221e58bfbf3624cc06af1679833ad8f7430a6314e3eb0a449c59a1f9ea093fc670bd7abab73f0f9ce7e1f74de6a34f4e4bbde6a8c4a44befffbdb020382730c2f99fdcc54319478168150d188d482306c6cc15252b21fc4c569d25cf5d2135b03612c73cd4f066b97b08a8bcd3f82f3158dcd692c33752d3fd0d85f22c841bf4b7ab8adeb9963bc16702baa38e041bbdab9bd7bc786fd5330d3a9d277dbe0ef331e1e5db6a4fc56b19210f694d1be6bc7939027da7fed1b8c412780daf93c033149bb2a90fcda46a8f54edaee3316622e7ec84d3ea831c724607614584aa2b7b882181d4291d0b1a2c73d34a41778125a7a44f7a"
var k = "0pw3av67$979cdxf" // 16 Bit Key
var iv = "xe95bmad7x5432p8" // 16 Bit Vector
do {
let deccc = try aesDecrypt(encryptedString: strencrypted, key: k, iv: iv)
print(deccc)
} catch {
print('error')
}
Я что-то упустил где-то, но где! Заранее спасибо