Класс MCrypt AES / CBC / NoPadding от Java (Android) до Swift 4 - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть класс 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')
    }

Я что-то упустил где-то, но где! Заранее спасибо

...