上一篇文章: "事半功倍:手机远程调试效率倍增"
密码学,作为一门研究数据加密和解密的学科,不仅仅是一种技术,更是一种保护隐私和信息安全的重要手段。
它涉及到许多领域,包括算法、数学、计算机科学等等。
从最古老的凯撒密码,到当今复杂的RSA加密算法,密码学在保护我们的通信、交易和个人隐私方面发挥着关键作用。
本文将探讨密码学的基本概念、主要应用领域以及一些流行的加密算法。
通过对密码学的介绍,我们可以更好地理解数字世界中的隐私保护和信息安全问题,从而更加安全地使用数字化技术。
密码学
客户端向服务器发送的数据包中,一些参数的来源可能是随机生成的、使用标准算法加密的,或者是经过开发者自行设计的加密算法生成的。
在iOS中,存在一系列现成的系统API供开发者调用。开发者必须使用固定的方法名来访问这些API。因此,我们需要学习如何正确地利用这些API进行开发。
开发者也可以选择自行实现算法,或者使用他人编写的模块。这些算法的运行不依赖于系统API,因此方法名可以被混淆。你需要做的是根据各种标准算法的特征,去识别是否为标准算法。
常用的加密算法
消息摘要算法(散列函数,哈希函数)
MD5 SHA Hmac
对称加密算法
DES 3DES AES
非对称加密算法
RSA
在学习加密算法之前,先了解一下编码是很重要的。
- Hex编码
是一种编码,而非加密
Hex编码是一种将数据转换为十六进制形式表示的编码方式,每个字节被表示为两个十六进制数字,常用于网络通信、数据存储等领域。
char* hexStr = "字符串";
NSMutableString* resultStr = [NSMutableString string];
for (int i = 0; i < strlen(hexStr); i++) {
[resultStr appendFormat:@"%.2x", hexStr[i]];
}
NSLog(@"%@", resultStr);
- Base64
Base64是一种将二进制数据转换成文本字符串的编码方式,常用于网络传输和数据存储,而非加密算法。
char* hexStr = "字符串";
NSData* data = [NSData dataWithBytes:hexStr length:strlen(hexStr)];
NSString* result = [data base64EncodedStringWithOptions:0];
NSLog(@"%@", result);
消息摘要算法
又称单向散列函数或哈希函数,是一种将输入数据转换为固定长度输出的算法。
一般应用于校验数据完整性,签名sign
- 算法特点
不同长度的输入,产生固定长度的输出
散列后的密文不可逆
散列后的结果唯一
可能存在哈希碰撞,即不同的输入可能会产生相同的输出。
- 常见算法
MD5 SHA-1 SHA-256 SHA-512 HmacMD5 HmacSHA1 HmacSHA256 HmacSHA512等等
- MD5加密
const char* str = "字符串";
unsigned char result[16];
CC_MD5(str, (CC_LONG)strlen(str), result);
NSMutableString* resultStr = [NSMutableString string];
for (int i = 0; i < 16; i++) {
[resultStr appendFormat:@"%.2x", result[i]];
}
NSLog(@"%@", resultStr);
- SHA1加密
const char* str = "字符串";
unsigned char result[20];
CC_SHA1(str, (CC_LONG)strlen(str), result);
NSMutableString* resultStr = [NSMutableString string];
for (int i = 0; i < 20; i++) {
[resultStr appendFormat:@"%.2x", result[i]];
}
NSLog(@"%@", resultStr);
- HMAC算法
HMAC算法与MD和SHA的主要区别在于引入了一个密钥,这个密钥可以是随机生成的。
const char* key = "key";
const char* str = "字符串";
unsigned char result[16];
CCHmac(kCCHmacAlgMD5, key, strlen(key), str, strlen(str), result);
NSMutableString* resultStr = [NSMutableString string];
for (int i = 0; i < 16; i++) {
[resultStr appendFormat:@"%.2x", result[i]];
}
NSLog(@"%@", resultStr);
对称加密算法
如果加密和解密使用相同的密钥,即对称加密算法。
对称加密算法的密钥可以随机生成,但通常有一定的位数要求。对称加密算法对输入数据的长度没有特定要求,且加密速度较快。
- 对称加密分类
RC4: 以字节流的方式,依次加密明文/解密密文的每一个字节
DES,3DES,AES: 分组加密: 将明文消息分组,每组进行加密
- 应用模式
ECB
电子密码本模式,每一块数据,独立加密。
相同的明文块会被加密成相同的密文块,因此不适合加密重复性高的数据。
无初始向量,容易受到密码本重放攻击,一般情况下很少用。
CBC
密码分组链接模式
每个数据块的加密都依赖于前一个数据块的密文。
需要一个初始向量(IV)来增加独一性,提高安全性。
密文的每个分组都与前一个密文分组相关联,使得更难受到攻击。
如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。
ECB模式
const char* key = "12345678";
const char* plaintext = "";
unsigned char result[32];
size_t realLen = 0;
CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionECBMode | kCCOptionPKCS7Padding, key, 8, NULL, plaintext, strlen(plaintext), result, 32, &realLen);
NSMutableString* resultStr = [NSMutableString string];
for (int i = 0; i < realLen; i++) {
[resultStr appendFormat:@"%.2x", result[i]];
}
NSLog(@"%@", resultStr);
CBC模式
const char* key = "";
const char* iv = "";
const char* plaintext = "";
unsigned char result[32];
size_t realLen = 0;
CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, key, 8, iv, plaintext, strlen(plaintext), result, 32, &realLen);
NSMutableString* resultStr = [NSMutableString string];
for (int i = 0; i < realLen; i++) {
[resultStr appendFormat:@"%.2x", result[i]];
}
NSLog(@"%@", resultStr);
非对称加密
- RSA
需要生成一个密钥对,其中包含公钥和私钥。
公钥用于加密数据,私钥用于解密;私钥用于加密数据,公钥用于解密。
通常情况下,公钥是公开的,私钥需要保密。私钥包含了公钥,但无法从公钥推导出私钥。
iOS提供了Security.framework来支持RSA算法的实现。你可以使用SecKey类来生成RSA密钥对、加密和解密数据,以及进行数字签名和验证。这样的功能可以在iOS应用程序中实现安全的数据传输和存储。
总结
iOS密码学涵盖了多种加密算法和哈希算法,其中主要包括AES、DES、3DES、RSA和哈希算法(如SHA-256等)。
这些算法在iOS应用中扮演着重要角色,用于数据加密、数字签名和数据完整性验证等方面。
对称加密算法如AES、DES和3DES适用于数据加密和解密,而非对称加密算法RSA则用于密钥交换和数字签名。
同时,哈希算法被用于生成数据的摘要,用于验证数据的完整性。
iOS开发者可以根据应用需求选择适当的加密算法和哈希算法来保护数据的安全性和完整性。