2017-02-23 49 views
2

這裏進行加密使用Base64編碼字符串 - >解密(SWIFT)

(ew0KICAiTmV3c0dyYXBoIjogWw0KICAgIHsNCiAgICAgICJEYXRlIjogIjA0LUZlYiIsDQogICAgICAiTmV3c1Njb3JlIjogNTAuMCwNCiAgICAgICJUYWJsZU5hbWUiOiAiTmV3c0dyYXBoIg0KICAgIH0sDQogICAge) 

,這裏是擴展方法解密

extension String 
{ 
    func fromBase64() -> String 
    { 
     let data = NSData.init(base64Encoded: self, options: []) ?? NSData() 
     return String(data: data as Data, encoding: String.Encoding.utf8) ?? "" 
    } 
} 

有一個在我的文本視圖沒有輸出字符串,但你會得到相同的字符串解密輸出 - >https://www.base64decode.org

但是,如果我從加密的字符串取得子串 - >

ew0KICAiTmV3c0dyYXBoIjogWw0KICAgIHsNCiAgICAgICJEYXRlIjogIjA0LUZlYiIsDQogICAgICAiTmV3c1Njb3JlIjogNTAuMCwNCiAgICAgICJUYWJsZU5hbWUiOiAiTmV3c0dyYXBoIg0KICAgIH0sDQog 

然後我的代碼返回解密的字符串。 這是什麼問題? 可以任何一個請

+2

'('和')'無效Base64字符 – Hamish

+1

也不需要使用'NSData'的初始化程序,因爲之後您只需轉換爲'Data' - 只需使用'Data'的初始化程序。如果你不打算通過任何選項,你也不需要包含'options:'參數。你也可以在'String'的初始化程序中說'encoding:.utf8'。 – Hamish

+3

有效的base64字符串中的字符數需要是4的倍數,但是您的第一個字符串(帶去除括號的括號)有165個字符,這就是爲什麼'NSData.init(base64Encoded:options:)'無法解碼它。參見[RFC-4648](https://tools.ietf.org/html/rfc4648)。 – OOPer

回答

1
  1. base64是不加密,它是一種編碼。
  2. 長度不正確忽略括號內的括號,Base64編碼必須是4個字符的倍數。

實施例:

刪除最後的字符來創建有效的長度。

首先將Base64字符串解碼爲Data,然後編碼爲aUTF-8字符串。

let base64 = "ew0KICAiTmV3c0dyYXBoIjogWw0KICAgIHsNCiAgICAgICJEYXRlIjogIjA0LUZlYiIsDQogICAgICAiTmV3c1Njb3JlIjogNTAuMCwNCiAgICAgICJUYWJsZU5hbWUiOiAiTmV3c0dyYXBoIg0KICAgIH0sDQogICAg" 
let decodedData = Data(base64Encoded: base64)! 
let decodedString = String(data: decodedData, encoding: .utf8) 
print(decodedString!) 

結果:

 
{ 
    "NewsGraph": [ 
    { 
     "Date": "04-Feb", 
     "NewsScore": 50.0, 
     "TableName": "NewsGraph" 
    }, 

這似乎是在問題Base64編碼字符串是不完整的,已被截斷。

+0

謝謝Zaph。我得到了我的答案。 –