iOS逆向攻防之密码学基础及RSA数学原理、Base64编码

直接上密码学入门级知识部分,今天的内容如下:

1、密码学概述
2、离散对数问题
3、欧拉函数、欧拉定理、费马小定理
4、模反元素&公式推导
5、迪菲赫尔曼密钥交换
6、终端演示:RSA加密
7、证书生成
8、base64编码

一、密码学概述与发展历史


1、密码学的概述

密码学是指研究信息加密,破解密码的一门技术科学。

2、密码学的主要发展历史:

密码学的起源可追溯至2000年前,而当今的密码学是以数学为基础的。

密码学的起源:相传古罗马名将凯撒大帝为了防止别人截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表。这样,如果不知道密码本,即使截获一段信息也看不懂。密码学也正是在编码与破译的斗争实践中逐步发展起来的。

·从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学发展的十分缓慢,因为设计者基本上靠经验,没有运用数学原理。

·在1976以前,所有的加密方法都是同一种模式:加密和解密使用同一种算法。在交互数据的时候,彼此通信的双方就必须把规则告诉对方,否则无法解密。那么加密和解密的规则(简称 密钥【mì yuè】),它的保护就显得尤其重要。传递密钥成了最大的隐患。这种加密方式称为对称加密算法

·1976年,两位美国计算机学家迪菲(Bailey Whitfield Diffie)、赫尔曼(Martin Edward Hellman)提出了一种崭新构思,可以在不传递密钥的情况下,完成密钥交换。这被称为“迪菲-赫尔曼密钥交换(英语:Diffie–Hellman key exchange,缩写为D-H)”算法,开启了密码学研究的新方向。

·1977年三位麻省理工学院的数学家罗纳德·李维斯特Ron Rivest)、阿迪·萨莫尔Adi Shamir)和伦纳德·阿德曼Leonard Adleman)一起设计了一种算法,可以实现非对称加密。这个算法用他们三个人的姓氏首字母命名,叫做RSA算法

二、离散对数问题


先看下面一个取模运算的例子(取模运算叫做时钟运算,我们也常称为取余数运算,运算符为'mod',简写为'%'

如果取一个质数n做模数,比如n=17,再找一个小于n的质数m,比如m=3,则有一个数学的规律:如果3的k次方,满足当k是小于17的正整数的时候,比如k在1~16中间取,满足 m ^ k % n 的结果在1~(n-1)中间随机的时候(这个随机是分别对应,不会重复!),m就称为n的原根。

3为17的原根

3 ^ 1  % 17 = 3;
3 ^ 2  % 17 = 9;
3 ^ 3  % 17 = 10;
3 ^ 4  % 17 = 13;
3 ^ 5  % 17 = 5;
3 ^ 6  % 17 = 15;
3 ^ 7  % 17 = 11;
3 ^ 8  % 17 = 16;
3 ^ 9  % 17 = 14;
3 ^ 10  % 17 = 8;
3 ^ 11  % 17 = 7;
3 ^ 12  % 17 = 4;
3 ^ 13  % 17 = 12;
3 ^ 14  % 17 = 2;
3 ^ 15  % 17 = 6;
3 ^ 16  % 17 = 1;

...

m ^ k % n = r;(上面m=3,k递增,n为17,结果r就在1~(17 -1)范围内取值)

根据上面的例子思考:比如让你完成填空 3 ^ k mod 17 = 12;(m为正整数),那么m的值可以取13;

因为3的13次方模17等于12,k可以取值为13,但是k还可以取其他的值,使3的k次方模17等于12,这个等式从左边推理:3 ^ 13 mod 17 等于12,但是这个等式反过来推k的值,就是不确定的一个值,k=13只是其中的一个值,密码学中要通过这个等式来推出确定的k的值(比如逆推出k=13),就会非常的难,并且难度会随着取模的质数(例子中17这个数)的增大而增加,这个问题就是离散对数问题。如果取模的质数k(例子中是17这个数)非常大,长达几百位,那么就算你知道整个表达式的结果和算法,在比较有限的时间内,想要反推k的值,基本是不可能的。

三、欧拉函数及欧拉定理


1、欧拉函数

质数的概念:只能被1和自己整除的正整数,比如2,3,5,7,11...
互质关系:如果两个正整数,除了1之外,没有其他公因数,我们就称这两个数是互质关系。

那么问题来了,思考一下:
给定任意正整数n,请问在小于等于n的正整数之中,有多少个与n能构成互质关系?

如:

计算8的欧拉函数,小于等于8的数1、2、3、4、5、6、7、8中和8互质的有1,3,5,7
所以:φ(8) = 4;
计算7的欧拉函数,小于等于7的数1、2、3、4、5、6、7中和7互质的有1,2,3,4,5,6
所以:φ(7) = 6;
计算6的欧拉函数,小于等于6的数1、2、3、4、5、6中和6互质的有1、5
所以:φ(6) = 2;
计算5的欧拉函数,小于等于5的数1、2、3、4、5中和5互质的有1,2,3,4
所以:φ(5) = 4;

计算56的欧拉函数
φ(56)= φ(8) * φ(7) = 4 * 6 = 24;

计算这个值的方式叫做欧拉函数,使用:φ(n)表示

欧拉函数特点:
一、当n是质数的时候,φ(n) = n - 1;
二、如果n可以分解成两个互质的整数之积,如n = A * B;(A和B互质),则: 
   φ(A * B) = φ(A) * φ(B);
   
根据以上两点能得到:
如果N是两个质数P1和P2的乘积,则:
φ(N) = φ(P1) * φ(P2) = (P1 - 1) * (P2 - 1);

所以上面φ(56)= φ(8) * φ(7) = 4 * 6 = 24;

2、欧拉定理

如果两个正整数m和n互质,那么m的φ(n)次方减去1,可以被n整除。

欧拉定理公式:

欧拉定理公式.png

3、费马小定理

费马小定理属于欧拉定理的特殊情况:

如果两个正整数 m 和 n 互质,并且  n 为质数!那么φ(n)的结果就是 n - 1 ;

费马小定理公式:

费马小定理公式.png

四、模反元素&公式推导


1、模反元素

如果两个正整数 e 和 x 互质,那么一定可以找到整数 d , 使得ed - 1 被 x 整除,那么 d 就是 e 对于 x 的 “模反元素”

模反元素公式:

模反元素公式.png

2、公式推导

公式转换.png
模反元素公式转换.png

根据上面模反元素的性质,e 是和 x 互质;

如果x == φ(n), 也就是 e 和 φ(n)互质;

套入模反元素的公式推理就能得出最后的公式:

最终公式.png

到这里我提醒一下:m 经过一系列变换仍然能够还原成 m ,只需要满足两个条件,这两个条件是公式转化的必要条件

1、m 和 n 互质
2、e 和 φ(n)互质

推理的过程中 d 是 e 对于 x 的模反元素,x = φ(n)的时候满足公式转化, 所以 d 也是 e 对于 φ(n) 的模反元素;但是由于 d 是 模反元素,所以上述两个条件中的第一个条件,m 和 n 即使没有互质关系,该等式一样可以成立,但是需要需要满足另外一个条件 m < n;具体验证可自行验证一下(数学家验证过的定理)

所以得到了最终的公式及满足公式的条件


公式:

最终公式.png

条件:

1、 m 小于 n 
2、 e 和 φ(n) 互质


五、迪菲赫尔曼秘钥交换


1、密钥交换原理图及流程示意图(实质上就是拆分了欧拉定理)

RSA原理.png
RSA原理示意图.png

2、RSA算法

m ^ e mod n = c    加密
c ^ d mod n = m    解密

公钥:n 和 e ,主要是 e 
私钥:n 和 d ,主要是 d
明文:m
密文:c

3、RSA算法说明

1、n会非常大,长度一般为1024个二进制位。(目前人类已经分解的最大整数,232个十进制位,768个二进制位)

2、由于需要计算出φ(n),所以根据欧拉函数的特点,最简单的方式n由两个质数相乘得到,质数p1,p2

φ(n) = (p1 - 1) * (p2 - 1);

3、最终由φ(n)得到 e 和 d。

总共生成6个数字:p1、p2、n、φ(n)、 e 、 d

4、RSA安全问题

除了公钥用到了 n 和 e,其余的四个数字是不公开的。
目前破解RSA得到d的方式如下:
1、要想求出私钥d。由于e * d = φ(n) * k + 1 ; 必须要知道e 和 φ(n);
2、e 是知道的,但是要得到 φ(n),必须知道 p1和p2;
3、由于n = p1 * p2; 只有把 n 因式分解才能算出来; 但是因为 n 非常大,分解成两个质数的难度不言而喻,和暴力破解差不多,只能不断的去尝试。

5、RSA延伸应用思考

由于RSA原理算法推导,最开始就有一个条件,就是 m < n, 尽管n会取非常大,但是理论上仍然会限制RSA加密的使用,所以RSA加密不适用于加密非常非常大的数据,效率比较低,一般结合其他加密方式来加密关键部分的数据。比如加密key,数字签名

六、终端演示:RSA加密


一、终端加密指令OpenSSL使用RSA:
由于Mac系统内置OpenSSL(开源加密库),所以我们直接在终端上使用命令来玩RSA,OpenSSL公开库中RSA算法常用命令主要有三个:

命令1:genrsa  -> 生成并输入一个RSA私钥
命令2:rsautl  -> 使用RSA密钥进行加密、解密、签名和验证等运算
命令3:处理RSA密钥的格式转换等问题

1、生成RSA私钥,密钥长度为1024bit,私钥文件名为private.pem

openssl genrsa -out private.pem 1024

2、从私钥中提取公钥

openssl rsa -in private.pem -pubout -out public.pem

3、将私钥private.pem转化成为明文private.txt文件

openssl rsa -in private.pem -text -out private.txt

4、通过公钥文件public.pem加密明文文件message.txt,生成enc.txt

openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt

5、通过私钥文件private.pem解密公钥加过密的文件enc.txt并生成解密之后的文件dec.txt

openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt

二、终端加密实践实例

实例我在里面加入了各步骤的注释含义

步骤1. cd到一个文件夹下
battleMage:~ battleMage$ cd /Users/fightmaster/Desktop/RSA密码学MacDown 

步骤2. 生成私钥并输出一个叫private.pem的私钥文件
battleMage:RSA密码学MacDown battleMage$ openssl genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
.++++++
..................++++++
e is 65537 (0x10001)

步骤3. 根据私钥提取一个公钥,并输出一个叫public.pem的公钥文件
battleMage:RSA密码学MacDown battleMage$ openssl rsa -in private.pem -pubout -out public.pem
writing RSA key

步骤4. 输出查看私钥文件
battleMage:RSA密码学MacDown battleMage$ cat private.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDNjQhpiI36VDchXNvdTREfqoyEw2gG+Z8XHyz+4QJ0Bh7WCo2B
q8s72LoqXMcH/0Pxn67zb5sbFTwC1MtK6sZ9a4F6y72LMRKa6emMAuBnvX6k2AsN
7JulkYmfZ8czvtJPGhIYON84dWH5L1uvvV6jzR/Y855m5953oLAPgdmsEwIDAQAB
AoGAVbfUpD3gB16LRwx0W8tBstTqmIrsnMwIPhowJ3IqFbxfq57m+AZuUFzG9deO
4JTg/qg6yyXlptuqFPwscueJMhC6d5cPddmz6wADuu3FS03C7dnyiDOeaQ8ejIzI
yVPWaQChtHWp0kSTCGwAW4WgB7BOvR4SH1SLVMnH6OoYjmECQQDy2aYrYuJFy+qM
VVsueWijT29IO/evRvv0ap9KRcPRkXZi8/yN7W+eakMgM0Nm0pzc4Rdd05c53lc8
VNi30fg5AkEA2K5Y1irEaN74kSWOxEBk98SUN2ZOZxVCp/jEePPTb5aQv49dEvP1
VEktDD8wgHpUdOC3iT9hN8Oabv2cy7POqwJBAOo3XdtEUGTuiXT1Ma6961xuVS5+
n6BNvtx5JM32QSjSuTIwjKi5kchgRgM9TclSYXVqJiYY1yY5uTr3vdhzyokCQFWY
Ye2QjXAkDKtB2+j4yyn5VNehqX0dL+ys3+gr4a1mHB4gIxNWneZC1fHNkHpgWLan
ArnL+LqPoZUQyHzLtesCQGtwhl/NOGeW0vrvqg99Qpb6Pi2hV5oS2bHfImBkJeOx
cTTcyaGL0oTMB5tfh1VnwmgIk6DRjZcIp4prHV3JBQ0=
-----END RSA PRIVATE KEY-----

步骤5. 输出查看公钥文件
battleMage:RSA密码学MacDown battleMage$ cat public.pem
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNjQhpiI36VDchXNvdTREfqoyE
w2gG+Z8XHyz+4QJ0Bh7WCo2Bq8s72LoqXMcH/0Pxn67zb5sbFTwC1MtK6sZ9a4F6
y72LMRKa6emMAuBnvX6k2AsN7JulkYmfZ8czvtJPGhIYON84dWH5L1uvvV6jzR/Y
855m5953oLAPgdmsEwIDAQAB
-----END PUBLIC KEY-----

步骤6.生成并输出文件名为private.txt的私钥txt文件
battleMage:RSA密码学MacDown battleMage$ openssl rsa -in private.pem -text -out private.txt
writing RSA key

步骤7.查看私钥private.txt文件中的内容
battleMage:RSA密码学MacDown battleMage$ cat private.txt
Private-Key: (1024 bit)
modulus:
    00:cd:8d:08:69:88:8d:fa:54:37:21:5c:db:dd:4d:
    11:1f:aa:8c:84:c3:68:06:f9:9f:17:1f:2c:fe:e1:
    02:74:06:1e:d6:0a:8d:81:ab:cb:3b:d8:ba:2a:5c:
    c7:07:ff:43:f1:9f:ae:f3:6f:9b:1b:15:3c:02:d4:
    cb:4a:ea:c6:7d:6b:81:7a:cb:bd:8b:31:12:9a:e9:
    e9:8c:02:e0:67:bd:7e:a4:d8:0b:0d:ec:9b:a5:91:
    89:9f:67:c7:33:be:d2:4f:1a:12:18:38:df:38:75:
    61:f9:2f:5b:af:bd:5e:a3:cd:1f:d8:f3:9e:66:e7:
    de:77:a0:b0:0f:81:d9:ac:13
publicExponent: 65537 (0x10001)
privateExponent:
    55:b7:d4:a4:3d:e0:07:5e:8b:47:0c:74:5b:cb:41:
    b2:d4:ea:98:8a:ec:9c:cc:08:3e:1a:30:27:72:2a:
    15:bc:5f:ab:9e:e6:f8:06:6e:50:5c:c6:f5:d7:8e:
    e0:94:e0:fe:a8:3a:cb:25:e5:a6:db:aa:14:fc:2c:
    72:e7:89:32:10:ba:77:97:0f:75:d9:b3:eb:00:03:
    ba:ed:c5:4b:4d:c2:ed:d9:f2:88:33:9e:69:0f:1e:
    8c:8c:c8:c9:53:d6:69:00:a1:b4:75:a9:d2:44:93:
    08:6c:00:5b:85:a0:07:b0:4e:bd:1e:12:1f:54:8b:
    54:c9:c7:e8:ea:18:8e:61
prime1:
    00:f2:d9:a6:2b:62:e2:45:cb:ea:8c:55:5b:2e:79:
    68:a3:4f:6f:48:3b:f7:af:46:fb:f4:6a:9f:4a:45:
    c3:d1:91:76:62:f3:fc:8d:ed:6f:9e:6a:43:20:33:
    43:66:d2:9c:dc:e1:17:5d:d3:97:39:de:57:3c:54:
    d8:b7:d1:f8:39
prime2:
    00:d8:ae:58:d6:2a:c4:68:de:f8:91:25:8e:c4:40:
    64:f7:c4:94:37:66:4e:67:15:42:a7:f8:c4:78:f3:
    d3:6f:96:90:bf:8f:5d:12:f3:f5:54:49:2d:0c:3f:
    30:80:7a:54:74:e0:b7:89:3f:61:37:c3:9a:6e:fd:
    9c:cb:b3:ce:ab
exponent1:
    00:ea:37:5d:db:44:50:64:ee:89:74:f5:31:ae:bd:
    eb:5c:6e:55:2e:7e:9f:a0:4d:be:dc:79:24:cd:f6:
    41:28:d2:b9:32:30:8c:a8:b9:91:c8:60:46:03:3d:
    4d:c9:52:61:75:6a:26:26:18:d7:26:39:b9:3a:f7:
    bd:d8:73:ca:89
exponent2:
    55:98:61:ed:90:8d:70:24:0c:ab:41:db:e8:f8:cb:
    29:f9:54:d7:a1:a9:7d:1d:2f:ec:ac:df:e8:2b:e1:
    ad:66:1c:1e:20:23:13:56:9d:e6:42:d5:f1:cd:90:
    7a:60:58:b6:a7:02:b9:cb:f8:ba:8f:a1:95:10:c8:
    7c:cb:b5:eb
coefficient:
    6b:70:86:5f:cd:38:67:96:d2:fa:ef:aa:0f:7d:42:
    96:fa:3e:2d:a1:57:9a:12:d9:b1:df:22:60:64:25:
    e3:b1:71:34:dc:c9:a1:8b:d2:84:cc:07:9b:5f:87:
    55:67:c2:68:08:93:a0:d1:8d:97:08:a7:8a:6b:1d:
    5d:c9:05:0d
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDNjQhpiI36VDchXNvdTREfqoyEw2gG+Z8XHyz+4QJ0Bh7WCo2B
q8s72LoqXMcH/0Pxn67zb5sbFTwC1MtK6sZ9a4F6y72LMRKa6emMAuBnvX6k2AsN
7JulkYmfZ8czvtJPGhIYON84dWH5L1uvvV6jzR/Y855m5953oLAPgdmsEwIDAQAB
AoGAVbfUpD3gB16LRwx0W8tBstTqmIrsnMwIPhowJ3IqFbxfq57m+AZuUFzG9deO
4JTg/qg6yyXlptuqFPwscueJMhC6d5cPddmz6wADuu3FS03C7dnyiDOeaQ8ejIzI
yVPWaQChtHWp0kSTCGwAW4WgB7BOvR4SH1SLVMnH6OoYjmECQQDy2aYrYuJFy+qM
VVsueWijT29IO/evRvv0ap9KRcPRkXZi8/yN7W+eakMgM0Nm0pzc4Rdd05c53lc8
VNi30fg5AkEA2K5Y1irEaN74kSWOxEBk98SUN2ZOZxVCp/jEePPTb5aQv49dEvP1
VEktDD8wgHpUdOC3iT9hN8Oabv2cy7POqwJBAOo3XdtEUGTuiXT1Ma6961xuVS5+
n6BNvtx5JM32QSjSuTIwjKi5kchgRgM9TclSYXVqJiYY1yY5uTr3vdhzyokCQFWY
Ye2QjXAkDKtB2+j4yyn5VNehqX0dL+ys3+gr4a1mHB4gIxNWneZC1fHNkHpgWLan
ArnL+LqPoZUQyHzLtesCQGtwhl/NOGeW0vrvqg99Qpb6Pi2hV5oS2bHfImBkJeOx
cTTcyaGL0oTMB5tfh1VnwmgIk6DRjZcIp4prHV3JBQ0=
-----END RSA PRIVATE KEY-----

步骤8. 生成一个示例message.txt的需要加密的内容文件,编辑message.txt文件,随意填写一个示例文本,比如"密码123456"
battleMage:RSA密码学MacDown battleMage$ vi message.txt

步骤9. 将message.txt文件通过公钥public.pem文件加密生成并输出enc.txt文件
battleMage:RSA密码学MacDown battleMage$ openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt

步骤10. 输出enc.txt加密后的文件(看起来是乱码)
battleMage:RSA密码学MacDown battleMage$ cat enc.txt
n?9M?^?>???Nɏh?ϩ!?8{?]??????
                            ??R룁'??3?D?6i??^
?k6'?
F?>2?s>??Xx1?&\ٰ?x?
???? ?!m?2+'?x

步骤11、通过私钥private.pem文件解密enc.txt文件,并输出解密后的dec.txt文件
battleMage:RSA密码学MacDown battleMage$ openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
battleMage:RSA密码学MacDown battleMage$ 


上述步骤分别得到的结果是:
步骤2:得到的私钥文件private.pem


步骤2:得到的私钥文件private.png

步骤3:从私钥中提取出来的公钥文件public.pem

步骤3:从私钥中提取出来的公钥文件public.png

步骤6:输出查看的私钥txt文件 private.txt

步骤6:输出查看的私钥txt文件 private.txt .png

步骤8:生成一个需要加密的message.txt文件,编辑内容为"密码123456"

步骤8:生成一个需要加密的message.txt文件.png

步骤9:message.txt通过公钥文件public.pem加密并输出对应的加密文件enc.txt

步骤9:message.txt通过公钥文件public.pem加密并输出对应的加密文件enc.png

步骤11:通过私钥private.pem解密之前加密的密文enc.txt,并生成解密后的文件dec.txt

步骤11:通过私钥private.pem解密之前加密的密文enc.txt,并生成解密后的文件dec.png

七、证书生成


如果我们想要使用RSA算法,那么我们需要对应的证书文件,但是在项目开发中,苹果是不允许我们直接使用pem证书的,我们要生成对应的crt文件
需要多次填写证书的信息,比如下面的国家,省,市,组织信息,邮箱Email,还有证书额外的密码

/Users/fightmaster/Desktop/RSA密码学MacDown/终端操作演示文件

步骤1:根据私钥private.pem生成一个RSA证书请求文件
battleMage:终端操作演示文件 battleMage$ openssl req -new -key private.pem -out rsacert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:CN
State or Province Name (full name) []:hubei
Locality Name (eg, city) []:WuHan
Organization Name (eg, company) []:BattleMage
Organizational Unit Name (eg, section) []:battleMage.com
Common Name (eg, fully qualified host name) []:battleMage.com
Email Address []:1273937502@qq.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456

步骤2:根据.csr请求文件,申请.crt证书文件
battleMage:终端操作演示文件 battleMage$ openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
Signature ok
subject=/C=CN/ST=hubei/L=WuHan/O=BattleMage/OU=battleMage.com/CN=battleMage.com/emailAddress=1273937502@qq.com
Getting Private key

步骤3:生成p.p12文件,及设置p.p12文件打开的密码(密码可以不设置)
battleMage:终端操作演示文件 battleMage$ openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
Enter Export Password:
Verifying - Enter Export Password:
battleMage:终端操作演示文件 battleMage$ 

终端演示生成文件如下

步骤1,生成的证书请求文件.png
步骤2,根据请求文件申请的证书文件.png
步骤3,根据证书文件导出的p.p12文件.png

八、base64编码


base64只是一种编码方案,根据base64对照表将任意的二进制进行编码;base64主要是为了查看二进制,只是二进制的一种表现形式

base64 总共 65种字符,0 ~ 9,a ~ z,A ~ Z 还有'+','/'和'=',将二进制以每6个为一组进行编码;

base64编码表中只有64个字符,编码表中不包含'=','='是隐含的第65个字符,'='是用来补足最后拆成6位不足的

比如原二进制
0101 1000 0101 0101 0001
经过base64以6位为分割,变成
010110 000101 010100 01
不足6位后都补0,变成
010110 000101 010100 010000
因为存储的时候,内存需要对齐,所以可能最后几个补齐的位置为
010110 000101 010100 010000 000000 000000

后面的这种形式的'000000'就会被替换为'=';所以base64编码一般都很明显,最后几位一般都是'=';

下面是base64位编码表:

base64编码表.png

iOS中OC使用base64的代码示例如下

1、base64编码

- (NSString *)customBase64Encode:(NSString *)encodeText {
    NSData * data = [encodeText dataUsingEncoding:NSUTF8StringEncoding];
    NSString * tempStr = [data base64EncodedStringWithOptions:0];
    return tempStr;
}

2、base64解码

- (NSString *)customBase64Decode:(NSString *)decodeText {
    NSData * data = [[NSData alloc] initWithBase64EncodedString:decodeText options:(0)];
    NSString * tempStr = [data base64EncodedStringWithOptions:0];
    return tempStr;
}

今天就到这里,看完有收获,点个赞谢谢啦~

溪浣双鲤的技术摸爬滚打之路

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容