Swift Biginteger xor криптиране/декриптиране

Нов съм в Swift, сега просто искам да преведа java xor код за криптиране/декриптиране на 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 "";
    }
}

И аз търсих много за криптиране на swift xor и опитах отговора във връзките по-долу:

XOR криптиране в Swift IOS

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

Swift Simple XOR криптиране

Но всички те не могат да получат същия шифрован низ в сравнение с моя Java код, сега моят Java код беше активен и няма начин да го променя.

Мислех, че може да е причинено от шестнадесетичния, но в swift не мога да намеря никъде за swift xor шестнадесетичен.

Така че това, от което се нуждая, е, че swift кодът може да получи точно същия криптиран низ като 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