您的当前位置:首页正文

伪加密算法:Base64

来源:华拓网

做过网络通信的iOSer对Base64都不会很陌生,涉及加密的数据通常会在传输之前做一次Base64转换,一般形式如下Base64(DES/AES(Data)),所以有些iOSer就把Base64当作加密算法的一种,甚至一些在线工具也直接称呼Base64为加密/解密,实际上这误会可大了,本篇回答以下三个问题:

  1. Base64为什么不是一种加密算法?
  2. 如果不是加密算法,Base64有什么用?
  3. iOS开发中如何使用Base64

Base64编码过程

要回答第一个问题,首先来看看Base64的编码过程,这里以字符串 “1234”为例,经过Base64编码后,结果为"MTIzNA==",也是一个字符串,过程如下:

Base64编码过程
可见,经过6位分组后,原字符串已经被另一组字符替换,转换后的数值不是与ASCII码做对应,而是与Base64码表[A~Za~z0~9+/]的下标对应,刚好为64个字符。
了解了编码过程,解码就很容易了,按编码过程,反向运算,就能得到原始字符串,由于Base64的算法是公开的,任何人了解算法后,可以毫无障碍的获得原始信息,所以说Base64是种加密算法实在是一种误解。

Base64的作用

iOS中使用Base64

苹果已经提供了原生的API,用Swift做Base64编码:

import Foundation
let str = "1234"
let utf8str = str.data(using: String.Encoding.utf8)
let base64Encoded = utf8str?.base64EncodedString(options: NSData.Base64EncodingOptions.init(rawValue: 0))

NSData.Base64EncodingOptions 有四个可选值:

作用
lineLength64Characters 编码结果按照64个字符长度进行等分换行,默认换行符为\r\n
lineLength76Characters 编码结果按照76个字符长度进行等分换行
endLineWithCarriageReturn 编码结果换行时使用回车符\r
endLineWithLineFeed 编码结果换行时使用回车符\n

可以组合使用:

NSData.Base64EncodingOptions.init(rawValue: NSData.Base64EncodingOptions.lineLength76Characters.rawValue | NSData.Base64EncodingOptions.endLineWithCarriageReturn.rawValue)

编码结果按76个字符换行,换行符为\r。

解码方法如下:

let decodedData = NSData(base64Encoded: base64Encoded!, options: NSData.Base64DecodingOptions.init(rawValue: 0))

let decodedString = NSString(data: decodedData! as Data, encoding: String.Encoding.utf8.rawValue)! as String

思考题:
编码过程中,6位补8位的规则是什么,是高位补0还是低位,为什么?经过深入思考的结果才是自己的哦,欢迎你的留言👏