[英]iOS Swift 4:How to perform encryption/decryption with DES-ECB-PKCS5Padding?
我想在iOS Swift中使用DES-ECB-PKCS5Padding執行加密/解密。
我有一些來自Server Side的代碼(很可能是在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 Library。
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 = from,但這是錯的。 您在問題中引用的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代碼相同,請參見此屏幕截圖:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.