iOS swift 4 :How to perform encryption/decryption with DES-ECB-PKCS5Padding?

标签 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.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 中实现上述功能,但我无法获得想要的结果

我的 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 库。

最佳答案

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 和 salt: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 sdk:

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

as3crypto 库

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

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

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

您可以创建一个调用 as3crypto 例程的小型 ActionScript 程序。如果文件被称为例如Main.as,可以通过以下命令编译:

flex_sdk_4.6/bin/mxmlc Main.as

然后输出为 Main.swf 文件,可以在浏览器中使用 Flash 插件执行该文件。

结果

ActionScript 代码的结果与 Swift 代码相同,请看这里的截图:

Comparison with ActionScript Code

关于iOS swift 4 :How to perform encryption/decryption with DES-ECB-PKCS5Padding?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53920267/

相关文章:

ios - 绑定(bind)到命令的 TapGestureRecognizer 中数据刷新的空引用异常

ios - 容器 View Controller 中的自定义 topLayoutGuide 长度

c# - 如何在 iOS 上使用 Xamarin 未公开的方法?

java - 为什么远程服务器上的签名验证比设备上的签名验证更安全?

java - 使用 Cipher 和 Base64.Encoder 加密字符串时,目标字符集是什么?

java - 充气城堡 PQC XMSS 签名 : NullPointerException after retrieving SecretKey from KeyStore

java - 使用 Java 解密 3Des 中的值

ios - og:url元标记是什么?

php - PHP 和 MySQL 中的高性能加密/解密

.net - 使用 .NET 加密和解密数字