ios - iOS Swift 4:如何使用 DES-ECB-PKCS5Padding 执行加密/解密?
问题描述
我想在 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 代码相同,请参见此处的屏幕截图:
推荐阅读
- node.js - 在 MongoDB 中,如何根据另一个字段有条件地更新具有不同值的文档
- visual-studio-code - Visual Studio 代码导入自定义 css 和 js 扩展
- php - 如何在 PHP 中理解这个算法
- mongodb - Teiid Spring Boot:如何将特定的 MongoDB 集合公开为 OData 实体?
- php - 根据输入,使用 PHP 创建 TABLE
- c# - 无法添加脚本组件“HealthDisplay”,因为找不到脚本类
- android - 以网格布局的响应式卡片
- jupyter-notebook - 一个 jupyter 笔记本单元需要很长时间
- apache-kafka-connect - 有没有办法删除debezium mysql连接器的现有任务并用新任务替换它
- python - 在 Pandas 中计算累积发生次数并随时间绘制