2020.06.04编辑

前言

对于加密算法这个概念我的确不太清楚,虽然我知道加密算法存在的意义,但是这并不妨碍我不知道加密算法具体都有哪些。所以今天这篇文章就是了大家一起学习开发中哪些加密算法。

在学习加密算法之前,我们先给自己提出三个问题:什么是加密算法?为什么用加密算法?怎么用加密算法?

接下来,让我们带着这些问题开始今天的学习之旅吧!

正文

1. 什么是加密算法?为什么用加密算法?

据说,公元前400年,古希腊人就发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格码”密码机,密码学在战争中起到非常重要的作用。

就算是在那些谍战的电视剧和电影中,我们也可以感受到信息安全和保密的重要性,正所谓牵一发而动全身,信息泄露在生活中的任何一方面都有可能给当事人或集体造成巨大的打击。密码学的存在就是为了提高数据的保密性、保证数据的完整性还有用于身份验证,可以校验双方的真实性。(看到这里是不是有点点熟悉的感觉,其实这也是HTTPS的特点。)

那么加密算法就是应用密码学的一种可以进行数据加密的算法。其中有些可以解密,有些不可解密。

2. 怎么用加密算法?

不同类型的加密算法使用方法也不一样,加密算法通常分为两大类:“对称式”和“非对称式”。

2.1 对称式加密

对称加密算法 是应用较早的加密算法,又称为 共享密钥加密算法。在对称加密算法中,使用的密钥只有一个,发送和接收双方都使用这个密钥数据进行加密解密。这就要求加密和解密方事先都必须知道密钥是什么。

1.数据加密过程:在对称加密算法中,数据发送方明文(原始数据)和加密密钥一起经过特殊加密处理,生成复杂的加密密文进行发送。

2.数据解密过程:数据接收方收到密文后,如果想要读取原始数据,就需要使用加密使用的密钥及相同算法的逆算法对加密的密文进行解密,才能让密文恢复成可读明文

2.2 非对称式加密

非对称加密算法 又称为 公开密钥加密算法。它和对称加密算法不同的是它需要两个密钥,一个称为公开密钥(public key),即公钥,一个称为私有密钥(private key),就是我们常说的私钥

因为加密和解密使用的是两个不同的密钥,所以这种算法叫做 非对称加密算法。

1.数据加密过程:数据发送方将明文经过某种协定好的密钥特殊加密处理,生成复杂的加密密文进行发送。

2.数据解密过程:数据接收方收到密文后,使用对应的另一种密钥对加密的密文进行解密,将密文解密成原始数据。

注意:

如果使用公钥对数据进行加密,只有对应的私钥才能进行解密。

如果使用私钥对数据进行加密,就得用对应的公钥进行解密。

3.常见的加密算法

3.1 MD5算法(加密不可逆)

MD5就是Message-Digest Algorithm 5(信息-摘要算法),因为使用的是哈希函数,所以也被译为哈希算法。它的典型应用就是对一段信息产生信息摘要,以防止被篡改。严格来说,MD5不是一种加密算法而是摘要算法,因为无论是多长的输入,MD5总是会出输出长度固定为128bit的一个字符串。128bit就是128个0和1的二进制位,而在实际应用开发中,通常是以16进制输出的,所以正好就是32位的16进制,说白了也就是32个16进制的数字。MD5是一种不可逆算法,具有很高的安全性。

iOS MD5加密的方法如下:

#import <CommonCrypto/CommonDigest.h>
- (NSString *)md5:(NSString *)str
{const char *cStr = [str UTF8String];unsigned char digest[CC_MD5_DIGEST_LENGTH];//CC_MD5_DIGEST_LENGTH = 16CC_MD5(cStr, strlen(cStr), digest); // This is the md5 callNSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];return output;
}

其中%02x是格式控制符:x表示以16进制输出,02表示不足两位,前面补0。

从代码中我们可以看出result是个字符数组,为什么我们定义容量为16呢?因为前面也讲到了MD5算法输出是128bit,一个字符是一个字节是8个bit,那么128 / 8 = 16,所以需要16个char,所以result的容量是16。

那么为什么输出的格式一定是%02x呢?因为前面也讲到了MD5算法通常是以16进制输出的,所以就是把128个二进制的字节转换为16进制表示,每4位二进制对应一位16进制的元素,就需要32个16进制的元素,如果元素全部是0,放到char的数组中,正常是不会输出,如00001111,用%x就是16进制输出就得到f的值,就会丢失0,最后8位二进制数只表示成了1位16进制,但如果以%02x表示则输出结果是0f,正好是转换的正确结果。

所以以上就是char[16]和%02x的来历。

至于人们说的16位MD5加密,其实是这样的:举例如果产生的MD5加密字符串是:01234567abcdefababcdefab76543210,则16位的MD加密字符是abcdefababcdefab,也就是只是截取了中间的16位。实际上这个操作已经不是MD5加密算法所包括的,而应当是对MD5加密算法结果的二次处理。其它的64位和大小写什么的,都属于对MD5算法结果的二次处理。因为MD5算法产生的结果就是128bit,128个二进制数字。

3.2 SHA1算法(加密不可逆)

SHA1就是Secure Hash Algorithm 1(安全散列算法),它基于MD5,加密后的数据长度更长,对于长度小于位的消息,SHA 1会产生一个160bit的消息摘要,比MD5多32bit,因此,SHA1比MD5的安全性更强,但是运算速度就比MD5慢了。

基于MD5、SHA1的信息摘要特性以及不可逆(一般而言),可以被应用在检查文件完整性、数字签名等场景。

使用方法和MD5一样,将CC_MD5变成CC_SHA1就可以啦!

#import <CommonCrypto/CommonDigest.h>
- (NSString*)sha1:(NSString *)str{const char *cStr = [str UTF8String];//使用对应的CC_SHA1,CC_SHA256,CC_SHA384,CC_SHA512的长度分别是20,32,48,64uint8_t digest[CC_SHA1_DIGEST_LENGTH];//使用对应的CC_SHA256,CC_SHA384,CC_SHA512CC_SHA1(cStr, strlen(cStr), digest);NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)[output appendFormat:@"%02x", digest[i]];return output;
}

3.3 HMAC算法

HMAC是Hash-based Message Authentication Code(哈希运算消息认证码),HMAC运算利用哈希算法(MD5、SHA1等),以一个密钥一个消息为输入,生成一个消息摘要作为输出。该算法用于登录可以实现类似QQ设备锁的功能。

HMAC发送方和接收方都有key进行计算,而没有这把key的第三方,就无法计算出正确的散列值,这样就可以防止数据被篡改。

#import <CommonCrypto/CommonHMAC.h>
/*!@enum       CCHmacAlgorithm@abstract   Algorithms implemented in this module.@constant   kCCHmacAlgSHA1        HMAC with SHA1 digest@constant   kCCHmacAlgMD5          HMAC with MD5 digest@constant   kCCHmacAlgSHA256    HMAC with SHA256 digest@constant   kCCHmacAlgSHA384    HMAC with SHA384 digest@constant   kCCHmacAlgSHA512    HMAC with SHA512 digest@constant   kCCHmacAlgSHA224    HMAC with SHA224 digest*/
- (NSString *)hmacMd5:(NSString *)str key:(NSString *)key {const char *cStr = [str UTF8String];const char *kStr = [key UTF8String];unsigned char digest[CC_MD5_DIGEST_LENGTH];CCHmac(kCCHmacAlgMD5, kStr, strlen(kStr), cStr, strlen(cStr), digest);NSMutableString* output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++) {[output appendFormat:@"%02x", digest[i]];}return output;
}

3.4 AES/DES/3DES算法

3.4.1 DES算法

DES是Data Encryption Standard(数据加密标准),是一种对称分组密钥算法。它的密钥是一个64bit(也就是8个字节)的数据,每8位(一个字节)用作奇偶校验位,实际使用到的长度是56位,加密解密都是用同一算法。DES是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥的人才能解读由DES加密算法加密的密文数据。因此,破译DES就是搜索密钥的编码。对于56位长度的密钥来说,如果用穷举法来搜索的话,运算次数是次。

DES有两种工作模式:ECB和CBC。

将数据64位也就是8个字节进行分组对数据加密,从而得到一段或几段8个字节的密文,最后按照他们的顺序将计算得到的数据连在一起,各段数据之间互不影响,解密和加密是一样的,这是DES的ECB(电子密本方式)的工作模式。(注意:DES加密解密时要求数据长度必须从是8个字节的倍数,因此当长度不足的时候必须先进行数据填充,这里使用的填充算法根据系统的不同可能略有不同。)另一种工作模式CBC(密文分组链接方式)是在每一段加密或者解密的过程中都要与前一段的结果做一次异或操作。同时CBC模式定义了一个特殊的8字节key(初始化向量),用来和第一段的结果做异或时用。这种机制使得加密的各段数据之间有了联系。

CBC的加密步骤如下:
1、首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据长度不是8字节的整数倍,先进行数据填充)
2、第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1
3、第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2
4、之后的数据以此类推,得到Cn
5、按顺序连为C1C2C3......Cn即为加密结果。

CBC的解密步骤如下:
1、首先将数据按照8个字节一组进行分组得到C1C2C3......Cn
2、将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)
3、将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2
4、之后依此类推,得到Dn
5、按顺序连为D1D2D3......Dn即为解密结果。

注意:解密的结果并不一定是我们原来的加密数据,可能还含有你补得位,一定要把补位去掉才是原来的数据。)

#import <CommonCrypto/CommonCryptor.h>
//DES算法的CBC模式
- (NSString *)des:(NSString *)str key:(NSString *)key andiv:(NSString *)iv
{NSData *strData = [str dataUsingEncoding:NSUTF8StringEncoding];NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];//这个iv 是DES加密的初始化向量,可以用和密钥一样的MD5字符NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];NSInteger bufferLength = (strData.length / 1024 + 1) * 1024;unsigned char *buffer = (unsigned char *)malloc(bufferLength);memset(buffer, 0, sizeof(char) * bufferLength);size_t numBytesEncrypted = 0;CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,//加密模式 kCCDecrypt 代表解密kCCAlgorithmDES,//加密方式kCCOptionPKCS7Padding,//填充算法keyData.bytes, //密钥字符串kCCKeySizeDES,//加密位数ivData.bytes,//初始化向量strData.bytes,//明文strData.length,buffer, bufferLength,&numBytesEncrypted);NSString *ciphertext = nil;if (cryptStatus == kCCSuccess) {NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];ciphertext = [data base64EncodedStringWithOptions:0];return ciphertext;} else {return nil;}
}

3.4.2 3DES算法

3DES是Triple Data Encryption Algorithm(三重数据加密算法)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。

是DES向AES过渡的加密算法,它使用3条64位(实际上只用到了56位)的密钥对数据进行三次加密,是DES的一个更安全的变形,它是以DES为基本模块,通过组合分组方法设计出分组加密算法。

假如 Ek() 和 Dk() 分别代表DES的加密和解密过程。k 代表DES使用的密钥,P 代表明文,C 代表密文。

3DES的加密过程可表示为

C = Ek3(Dk2(Ek1(P))):用密钥1加密,然后用密钥2解密,然后用密钥3加密。

P = Dk1(Ek2(Dk3(C))):用密钥3解密,然后用密钥2加密,然后用密钥1解密。

注意:这里可以k1=k3,但不能k1=k2=k3(如果相等的话就成了DES算法了)。

3.4.3 AES算法(需要密钥才能解密)

AES是Advanced Encryption Standard(高级加密标准),又称Rijndael加密法。它采用对称分组密码体制,密钥长度的最少支持为128位,192位,256位,分组长度128位,算法应用于各种硬件和软件实现。这种加密算法是美国联邦政府采用的区块加密标准。微信小程序中的加密传输就是使用的AES加密算法。

AES本身就是为了取代DED的,它具有更好的安全性、效率和灵活性。

在上图中各个部分的作用:

明文P:没有经过加密的数据。

密钥K:用来加密明文的密码,在对称加密中,加密和解密的密钥是相同的,所以密钥要保证安全,如果一旦密钥泄漏了,那么数据就基本上不存在安全性了。

AES加密函数:设AES加密函数为E,则C = E(K,P),其中K为密钥,C为密文。所以通过加密函数E,可以把明文+密钥生成密文。

密文C:经过加密处理后的数据。

AES解密函数:如加密函数一样,设AES解密函数为D,则P = D(C,P),也就是说,可以通过解密函数D,将密文+密钥生成明文。

3.5 RSA算法(公钥加密,私钥解密)

RSA算法是一种非对称加密算法。因为在1977年由 Ron Rivest 和 Adi Shamir 以及 Leonard Adleman一起提出的,所以他们三人姓氏开头字母组成了RSA。

RSA是目前最具影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA是第一个能同时用于加密和数字签名的算法。它能够抵抗到目前为止已知的所有密码共计。已被ISO推荐为公钥数据加密标准。

RSA 加密算法 基于一个十分简单的数论事实:将两个大 素数 相乘十分容易,但想要对其乘积进行 因式分解 却极其困难,因此可以将 乘积 公开作为 加密密钥。

3.6 ECC算法

ECC是Error Correcting Code(错误检查和纠正),它也是一种非对称加密算法。主要优势是某些情况下,它比其他的方法使用更小的密钥,比如RSA加密算法,提供相当的或者更高等级的安全级别。不过有一个缺点就是加密和解密操作的实现比其他机制时间上。相比于RSA算法,这个算法对CPU的消耗更严重些。

未完待续。

对加密算法这部分还不是很明白,如果有大牛看见这篇文章还请指导我一下。感恩。

参考文章:

iOS 使用HMAC

iOS DES、3DES加密

iOS开发之Objective-c的AES加密和解密算法的实现

iOS开发-AES加密

iOS 加密算法之MD5加密使用相关推荐

  1. IOS开发之MD5加密和钥匙串的使用-oc

    IOS开发之MD5加密和钥匙串的使用-oc 源码在我的主页,md5加密是用户登录安全的一个保障.不可逆的,可以暴力破解的. // // ViewController.m // MD5演练 // // ...

  2. ios android md5加密,iOS中使用MD5加密

    在iOS中使用MD5加密较简单,需要引入头文件CommonCrypto/CommonDigest.h,我们单独新建一个用于MD5加密的类Encryption,此类继承NSObject. Encrypt ...

  3. IOS(objective-c)实现md5加密(32位小写)的工具类

    我们编程中,md5加密是个经常会用到的功能.下面是我封装好的一个实现字符串md5加密的工具类. MD5Util.h #import <Foundation/Foundation.h>@in ...

  4. iOS简单MD5加密

    iOS简单的MD5加密 1.引入头文件 #import <CommonCrypto/CommonDigest.h> 2.在controller中写一个加密方法,使用的时候调用 #pragm ...

  5. 网站功能小Demo——学习MD5加密的一点心得

    生活在数字信息化时代,我们每天接触最多的就是网络,其中包括我们在各大形形色色的网站注册的账户.从而网络安全变得极其重要,毕竟涉及到自身的账户信息安全以及财产安全.那么网站在建设的过程中时如何做到保护信 ...

  6. 安卓中的对称加密,非对称加密,MD5加密的算法

    转自:http://blog.csdn.net/fengkaungdewoniu/article/details/52846025 安卓中使用的加密算法可以说有三种:对称加密.非对称加密,及MD5加密 ...

  7. iOS开发中MD5加密算法的实现

    一.MD5算法简介 MD5的全称是Message Digest Algorithm 5(消息摘要算法第五版),是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.在90年代初由MIT L ...

  8. md5 ios java代码_IOS端與Java端MD5加密方法

    關於NSString的MD5加密,這不難,在網上可以搜到很多算法,主要是跟后台的統一會出問題,對同一段字符串,ios和java加密后的結果可能不一樣,很坑爹.現在貼一下ios端和后台java的代碼. ...

  9. IOS端与Java端MD5加密方法

    关于NSString的MD5加密,这不难,在网上可以搜到很多算法,主要是跟后台的统一会出问题,对同一段字符串,ios和java加密后的结果可能不一样.现在贴一下ios端和后台java的代码. java ...

最新文章

  1. 女朋友羞辱我一线程序员35岁后没出路?该回二线发展!我没忍住,吼她两句!我错了吗?...
  2. Oracle CRS的管理与维护
  3. linux qt creator git,Building Qt Creator from Git/zh
  4. ie6 ie7 绝对定位 相对定位 层被遮住
  5. 《时间管理:如何充分利用你的24小时》—让你时间发挥最大效用
  6. @Mock与@InjectMocks的区别
  7. 搭建hadoop开发环境--基于xp+cygwin
  8. 【待补】Wireshark+BLE dongle: BLE数据包捕获以及分析
  9. java中native的详解
  10. Spring【DAO模块】就是这么简单
  11. 贪吃蛇Python版 源码+代码分析
  12. AEMDA: Inferring miRNA-disease associations based on deep autoencoder
  13. Java学习意见 (来自CSDN 网友wlh86618 )
  14. hadoop安装-redhat
  15. C++上机报告 利用公式计算π=4(1-1/3+1/5-1/7+1/9-...)的近似值,直到括号中最后一项的绝对值小于0.000001为止。
  16. CIO必读:平常心走IT路 吴正宏经历的信息化三十年
  17. SpringCloud学习笔记3:Spring Cloud Netflix 组件(五大神兽)
  18. python自编BP神经网络
  19. vue-element-admin安装运行是英文界面调整为中文
  20. Python中numpy库中 axis=0,axis= 1轴的详解

热门文章

  1. 如何让tomcat告别频繁重启
  2. 国产直流马达驱动芯片SS6216的功能参数以及应用
  3. gvim之Vimdiff 使用
  4. 谷歌浏览器被恶意劫持解决方案
  5. java中的super()是什么
  6. lol丢失base.dll文件怎么办?base.dll文件下载
  7. 什么是框架?框架要解决的问题?
  8. vue3之定义数据(Ref全家桶)
  9. JDBC编程(Java操作数据库 MySQL)
  10. 【Java+MySQL】使用JDBC连接MySQL 8.0数据库