异或的运算方法是一个二进制运算:
1^1=0
0^0=0
1^0=1
0^1=1
两者相等为0,不等为1.
对于一个字符来说,都可以用二进制码来表示.如A:01000001
字符的异或就是对每一位进行二进制运算.
用于加密算法时,假设你要加密的内容为A,密钥为B,则可以用异或加密:
C=A^B
在数据中保存C就行了.
用的时候:
A=B^C
即可取得原加密的内容,所以只要知道密钥,就可以完成加密和解密.
#include <stdio.h>
main()
{
char a[]="MyPassword"; /*要加密的密码*/
char b[]="cryptographic"; /*密钥*/
int i;
/*加密代码*/
for(i=0;a[i]!='\0';i++)
a[i]=a[i]^b[i];
printf("You Password encrypted: %s\n",a);
/*解密代码*/
for(i=0;a[i]!='\0';i++)
a[i]=a[i]^b[i];
printf("You Password: %s\n",a);
}
iOS 中的加密方式
iOS 中的加密方式
1 加密方式主要有: Base64,MD5,RSA,DES,AES,钥匙串存储,Cookie
2 各加密方式的比较
2.1 Base64
2.1.1 基本原理:采用64个基本的 ASCII 值对数据进行重新编码.
2.1.2 实现步骤
> 将需要编码的数据拆分成字节数组
> 以3个字节为一组
> 按顺序排列24位数据,再将这24位数据均分为4组.
> 再在每组的最高位前补2个0,称为一个字节.
> 在最后一个字节不足的时候末尾填0
> 在最后编码完成的时候末尾添加1到2个=号
注:Base64的字符包括大/小写a—z,0—9,以及+/
Base64加密后还可以进行解密
2.2 MD5(数字签名)
2.2.1 原理:将任意长度是字节串转化为特定长度的长整数.
注:转换是将字节串转换而不是字符串转换.
谨记:MD5加密是不可解密的,因此用 MD5加密的程序进行密码验证的时候,只是验证加密之后的字符串比较,而不知道用户的密码.
2.2.2 使用
> 使用步骤很简单,但是单纯的 MD5加密是不安全的,常用一下方法
> MD5加盐:所谓的盐值就是一个字符串.即将用户的密码和盐值拼接之后再加密.
> 时间戳/动态密码:即在进行 MD5加密的时候讲时间和密码结合之后再加密,故可以做到相同的加密方式,形同的密码等加密之后的值是不同的
注:时间戳/动态密码加密要求客户端和服务器端的时间要相同.
> 时间戳/动态密码加密的实现步骤:首先,第一次用 hmac MD5加密.其次,将加密后的值和当前时间的字符串进行拼接.最后,将拼接后的值再次用 hmac MD5进行加密.
服务器端接收到密码之后要计算当前时间和上一分钟的值和密码进行比较
2.3 DES
2.3.1 原理:它是一种分组加密算法,它是以64位为分组对数据进行加密.同时 DES 也是一种对称加密算法(加密和解密用同一算法).它的密钥长度是56位(每一个第8位用作奇偶校验),密钥可以是任意的56位的数,而且可以任意的改变.
补充:
DES对64(bit)位的明文分组M进行操作,M经过一个初始置换IP置换成m0,将m0明文分成左半部分和右半部分m0=(L0,R0),各32位长。然后进行16轮完全相同的运算,这些运算被称为函数f,在运算过程中数据与密匙结合。经过16轮后,左,右半部分合在一起经过一个末置换,这样就完成了。在每一轮中,密匙位移位,然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的32位数据,在将其置换换一次。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次,就实现了。
解密过程:在经过所有的代替、置换、异或盒循环之后,你也许认为解密算法与加密算法完全不同。恰恰相反,经过精心选择的各种操作,获得了一个非常有用的性质:加密和解密使用相同的算法。DES加密和解密唯一的不同是密匙的次序相反。如果各轮加密密匙分别是K1,K2,K3….K16那么解密密匙就是K16,K15,K14…K1
2.4 钥匙串存储(SSKeychain 第三方框架)
2.4.1 使用原理:可以在钥匙串中直接写入明文密码.
注:要给写入的密码一个标示符,以便于取出密码.
2.5 Cookie
2.5.1 是一个网络信息块,用来存储信息
2.5.2 Cookie 会自动登录,会将用户的数据自动发给服务器.
注: Cookie 中的信息保存在NSHTTPCookieStorage中.
2.6 AES
2.6.1 原理:是一个对称加密算法.加长了 DES 加密的长度. AES设计有三个密钥长度:128,192,256位三种. AES算法主要包括三个方面:轮变化、圈数和密钥扩展.
具体原理: http://blog.sina.com.cn/s/blog_4b957026010006kf.html
2.6.2 首先获取要加密的字符串
其次加密(AESCrypt类中)
2.7 RSA
2.7.1 原理:它是一种非对称加密方法,需要两个秘钥公钥和私钥.公钥和私钥是一对,如果用公钥进行加密,就只能用私钥进行解密,如果用私钥进行加密,那么久只能用公钥进行解密.
工作流程:接收方获取一对密钥,让后将其中一个密钥发送给发送方,发送方用接收方发过来的密钥进行加密之后,再讲密码发给接收方,由于其中一个密钥只能由另外一个密钥进行解密,而另外一个密钥在接收方手中并没有在网络中发送,故可以保证很安全.
2.7.2 获取公钥和私钥的步骤:
> 找出两个很大的质数:A 和B
> C = A*B
> D = (A-1)*(B-1)
> 找出整数 E,E 与 D 互质.
> 找出整数 F,使得 E*F/D 余数为1
> 计算后得 E 是公钥, F 是私钥.
> N 负责公钥和私钥之间的联系,其公式如下(对 X 进行加密)
加密:(X^E)%N = Y
解密:(Y^E)%N = X
转载于:https://my.oschina.net/u/3135213/blog/861584