iOS Swift 4:如何使用DES-ECB-PKCS5P进行加密/解密?

iOS Swift 4:如何使用DES-ECB-PKCS5P进行加密/解密?,ios,encryption,cryptography,swift4,Ios,Encryption,Cryptography,Swift4,我想在iOS Swift中使用DES-ECB-PKCS5Padding执行加密/解密 我有一些来自服务器端的代码(很可能是ActionScript中的代码)可以提供帮助,如下所示: private static const type:String='simple-des-ecb'; public static function encrypt(txt:String, salt:String): String { var key:ByteArray = Hex.toArray(Hex.f

我想在iOS Swift中使用DES-ECB-PKCS5Padding执行加密/解密

我有一些来自服务器端的代码(很可能是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));
}
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)!

}
我曾尝试在Swift中对上述函数进行交互,但无法获得预期的结果

我的Swift代码如下:

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));
}
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)!

}
func加密(text:String,salt:String)->String{
设strHexKey=hexFromString(string:salt)
let key=strHexKey.hexaBytes
让strHexData=hexFromString(string:text)
让数据=strHexData.hexaBytes
让cryptor=cryptor(操作:.encrypt,算法:.des,选项:.PKCS7Padding,key:key,iv:Array())
设cipherText=cryptor.update(byteArray:data)?.final()
设strBase64=cipherText!.data.base64EncodedString()
返回strBase64
}
func解密(text:String,salt:String)->String{
设strHexKey=hexFromString(string:salt)
let key=arrayFrom(hextstring:strHexKey)
让数据=text.fromBase64()?.data(使用:.utf8)
让cryptor=cryptor(操作:。解密,算法:。des,选项:。PKCS7Padding,key:key,iv:Array())
让cipherText=cryptor.update(数据:data!)!.final()
返回(密文?.hexa)!
}

我一直在使用加密库。

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
}
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)
    }
}
快速测试

在作为文本测试用例使用的注释中dimusco@yopmail.com盐:123456。这将被称为:

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
}
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:

as3crypto库

引用的ActionScript似乎使用了一个名为as3crypto的库,可从此处下载:

Flex依赖于已安装的Java环境。它似乎不适用于最新版本的Java开箱即用,但您可以使用Java1.6作为示例

您可以创建一个调用as3crypto例程的小ActionScript程序。如果文件名为Main.as,则可使用以下命令对其进行编译:

flex_sdk_4.6/bin/mxmlc Main.as
然后,输出为Main.swf文件,可通过浏览器中的Flash插件执行

结果

ActionScript代码的结果与Swift代码相同,请参见以下屏幕截图:


能否提供服务器端生成的输入和输出示例?@arash Text-dimusco@yopmail.com . 盐-123456。Output-eLnJvMUKApg=@arash有什么消息吗?你提供IV,但是,你应该使用@kelalaka如何提供IV?ActionScript代码片段没有提到IV的使用