伪加密算法: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的作用

看到这里,你会疑问,这样的编码有什么用?
Base64真正的作用不是将字符串转换为另一个字符串,而是将任意二进制转换为字符串,这个字符串的范围还很小,只有64个,这就为那些只能传输字符串的协议传输数据带来方便,比如http,通过一些字符的替换,还可以避免特殊字符的冲突。

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还是低位,为什么?经过深入思考的结果才是自己的哦,欢迎你的留言👏

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容