iOS Swift 4: Как выполнить шифрование / дешифрование с помощью DES-ECB-PKCS5Padding? - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу выполнить шифрование / дешифрование с помощью DES-ECB-PKCS5Padding в iOS Swift.

У меня есть код с Серверная сторона (скорее всего, в ActionScript), чтобы помочь в следующем:

private static const type:String='simple-des-ecb';

public static function encrypt(txt:String, salt:String): String
{
    var key:ByteArray = Hex.toArray(Hex.fromString(salt));
    var data:ByteArray = Hex.toArray(Hex.fromString(txt));
    var pad:IPad = new PKCS5;
    var mode:ICipher = Crypto.getCipher(type, key, pad);
    pad.setBlockSize(mode.getBlockSize());
    mode.encrypt(data);
    data.position = 0;
    return Base64.encodeByteArray(data);
}

public static function decrypt(txt:String, salt:String): String
{
    var key:ByteArray = Hex.toArray(Hex.fromString(salt));
    var data:ByteArray = Base64.decodeToByteArray(txt);
    var pad:IPad = new PKCS5;
    var mode:ICipher = Crypto.getCipher(type, key, pad);
    pad.setBlockSize(mode.getBlockSize());
    try
    {
        mode.decrypt(data);
    }
    catch (e:Error)
    {
        trace(e.message);
        trace(e.getStackTrace());
    }
    return Hex.toString(Hex.fromArray(data));
}

Я пытался ответить взаимностью вышеупомянутые функции в Swift , но я не могу получить желаемые результаты

MyКод Swift выглядит следующим образом:

func encrypt(text: String, salt: String) -> String {

    let strHexKey = hexFromString(string: salt)
    let key = strHexKey.hexaBytes

    let strHexData = hexFromString(string: text)
    let data = strHexData.hexaBytes

    let cryptor = Cryptor(operation: .encrypt, algorithm: .des, options: .PKCS7Padding, key: key, iv: Array<UInt8>())
    let cipherText = cryptor.update(byteArray: data)?.final()

    let strBase64 = cipherText!.data.base64EncodedString()

    return strBase64

}

func decrypt(text: String, salt: String) -> String {

    let strHexKey = hexFromString(string: salt)
    let key = arrayFrom(hexString: strHexKey)

    let data = text.fromBase64()?.data(using: .utf8)

    let cryptor = Cryptor(operation: .decrypt, algorithm: .des, options: .PKCS7Padding, key: key, iv: Array<UInt8>())
    let cipherText = cryptor.update(data: data!)!.final()

    return (cipherText?.hexa)!

}

Я использовал https://github.com/iosdevzone/IDZSwiftCommonCrypto для библиотеки Cryptor.

1 Ответ

0 голосов
/ 29 декабря 2018

Код Swift

Преобразование кода ActionScript в Swift может выглядеть следующим образом:

func encrypt(text: String, salt: String) -> String? {
    let key = Array(salt.utf8)
    let bytes = Array(text.utf8)
    let cryptor = Cryptor(operation: .encrypt, algorithm: .des, options: [.ECBMode, .PKCS7Padding], key: key, iv:[UInt8]())
    if let encrypted = cryptor.update(byteArray: bytes)?.final() {
        return Data(encrypted).base64EncodedString()
    }
    return nil
}

func decrypt(text: String, salt: String) -> String? {
    let key = Array(salt.utf8)
    let bytes = [UInt8](Data(base64Encoded: text)!)
    let cryptor = Cryptor(operation: .decrypt, algorithm: .des, options: [.ECBMode, .PKCS7Padding], key: key, iv:[UInt8]())
    if let decrypted = cryptor.update(byteArray: bytes)?.final() {
        return String(bytes: decrypted, encoding: .utf8)
    }
    return nil
}

Быстрый тест

В комментариях, которые вы использовали в качестве тестового примера, с текстом dimusco@yopmail.com и солью: 123456 .Это будет называться так:

let salt = "123456"
if let encrypted = self.encrypt(text: "dimusco@yopmail.com", salt: salt) {
    print ("encrypted: " + encrypted)
    if let decrypted = self.decrypt(text: encrypted, salt: salt) {
        print ("decrypted: " + decrypted)
    }
}

Правильный вывод будет:

encrypted: +rptz3Ss8zh2j0VXN7CICsi2jkzYoAPx
decrypted: dimusco@yopmail.com

Я не знаю, где вы получили свой результат eLnJvMUKApg = от, но это неправильно.Кроме того, код ActionScript, который вы цитируете в своем вопросе, даст результат + rptz3Ss8zh2j0VXN7CICsi2jkzYoAPx .

Сравнить с ActionScript

Flex

Вы можете скачать бесплатный Flex SDK здесь:

https://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip

as3crypto Library

Кажется, что цитируется ActionScriptиспользовать библиотеку as3crypto, которую можно скачать отсюда:

https://code.google.com/archive/p/as3crypto/

Flex зависит от установленной среды Java.Кажется, он не работает с последней версией Java из коробки, но вы можете использовать Java 1.6, например.

Вы можете создать небольшую программу ActionScript, которая вызывает подпрограммы as3crypto.Если файл называется, например, Main.as, его можно скомпилировать с помощью следующей команды:

flex_sdk_4.6/bin/mxmlc Main.as

В результате получается файл Main.swf, который можно выполнить с помощью плагина Flash в браузере.

Результат

Результат кода ActionScript такой же, как и код Swift, см. Здесь этот снимок экрана:

Comparison with ActionScript Code

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...