解密(SWIFT)
问题描述:
这里进行加密使用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
然后我的代码返回解密的字符串。 这是什么问题? 可以任何一个请
答
- base64是不加密,它是一种编码。
- 长度不正确忽略括号内的括号,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。我得到了我的答案。 –
'('和')'无效Base64字符 – Hamish
也不需要使用'NSData'的初始化程序,因为之后您只需转换为'Data' - 只需使用'Data'的初始化程序。如果你不打算通过任何选项,你也不需要包含'options:'参数。你也可以在'String'的初始化程序中说'encoding:.utf8'。 – Hamish
有效的base64字符串中的字符数需要是4的倍数,但是您的第一个字符串(带去除括号的括号)有165个字符,这就是为什么'NSData.init(base64Encoded:options:)'无法解码它。参见[RFC-4648](https://tools.ietf.org/html/rfc4648)。 – OOPer