Swift Biginteger xor шифрование / дешифрование

Я новичок в Swift, теперь я просто хочу перевести код java xor encrypt / decrypt в Swift, который используется для транзакций между сервером и клиентом. Ниже приведен код Java xor:

public static String encrypt(String password, String key) {
    if (password == null)
        return "";
    if (password.length() == 0)
       return "";

    BigInteger bi_passwd = new BigInteger(password.getBytes());

    BigInteger bi_r0 = new BigInteger(key);
    BigInteger bi_r1 = bi_r0.xor(bi_passwd);

    return bi_r1.toString(16);
}

public static String decrypt(String encrypted, String key) {
    if (encrypted == null)
        return "";
    if (encrypted.length() == 0)
        return "";

    BigInteger bi_confuse = new BigInteger(key);

    try {
        BigInteger bi_r1 = new BigInteger(encrypted, 16);
        BigInteger bi_r0 = bi_r1.xor(bi_confuse);

        return new String(bi_r0.toByteArray());
    } catch (Exception e) {
        return "";
    }
}

И я много искал о быстром шифровании xor и попробовал ответить по ссылкам ниже:

Шифрование XOR в Swift IOS

https://coderwall.com/p/timkvw/simple-xor-encryption-and-decryption-in-swift-playground-code.

Быстрое простое шифрование XOR

Но все они не могут получить одну и ту же зашифрованную строку по сравнению с моим Java-кодом, теперь мой Java-код работает, и нет возможности его изменить.

Я думал, что это может быть вызвано шестнадцатеричным числом, но быстро я не могу найти нигде о быстром xor шестнадцатеричном.

Итак, что мне нужно, так это то, что быстрый код может получить ту же зашифрованную строку, что и вставленный мной Java-код, зашифрованная строка, сгенерированная моим клиентом Java, может быть расшифрована в моем клиенте iOS.

Большое спасибо тем, кто может мне помочь! Я занимаюсь этим целый день!

Еще раз спасибо.


person tommy    schedule 13.07.2017    source источник


Ответы (1)


Решено, ниже приведен код.

На основе отличной работы https://github.com/lorentey/BigInt

func encrypt(str:String, key:BigUInt)->String
{
    let value = BigUInt(str.data(using: String.Encoding.utf8)!)
    let encrypt = key ^ value
    return String(encrypt, radix: 16)
}

func decrypt(str:String, key:BigUInt)->String
{
    let value = BigUInt(str, radix: 16)!
    let decrypt = key ^ value
    return String(data: decrypt.serialize(), encoding: String.Encoding.utf8)!
}

Еще раз спасибо всем, кто внес свой вклад в библиотеку BigInt, поэтому код выглядит таким простым.

person tommy    schedule 15.07.2017
comment
У вас есть версия Swift 4? - person Ahmet Akkök; 04.06.2018