返回
iOS逆向学习-006常用加密
IOS
2023-12-29 21:45:03
## iOS逆向学习-006常用加密
### 前言
在iOS逆向学习过程中,我们经常会遇到各种加密算法。这些算法通常用于保护敏感数据,如密码、银行卡号等。因此,掌握这些加密算法的原理和用法对于iOS逆向工程师来说非常重要。
### 常见的加密算法
在iOS开发中,常用的加密算法主要有以下几种:
* DES(Data Encryption Standard):DES是一种对称加密算法,密钥长度为56位。DES算法简单易懂,速度快,但安全性不高,已经被破解。
* AES(Advanced Encryption Standard):AES是一种对称加密算法,密钥长度为128位、192位或256位。AES算法安全性高,速度快,目前被广泛应用于各种加密应用中。
* RSA(Rivest-Shamir-Adleman):RSA是一种非对称加密算法,密钥长度一般为1024位或2048位。RSA算法安全性高,但速度慢,通常用于加密对称加密算法的密钥。
* MD5(Message Digest 5):MD5是一种哈希算法,可将任意长度的消息转换为固定长度的摘要。MD5算法速度快,但安全性不高,容易发生碰撞攻击。
* SHA(Secure Hash Algorithm):SHA是一种哈希算法,可将任意长度的消息转换为固定长度的摘要。SHA算法安全性高,速度快,目前被广泛应用于各种加密应用中。
### 如何调用加密API
在iOS开发中,我们可以使用CommonCrypto框架来调用各种加密算法的API。CommonCrypto框架提供了DES、AES、RSA、MD5、SHA等加密算法的API。
#### DES加密
```objective-c
// 创建DES加密器
CCCryptorRef cryptor = CCCryptorCreate(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, key, kCCKeySizeDES, iv);
// 加密数据
NSData *encryptedData = [NSData dataWithBytes:data length:data.length];
// 加密后的数据
NSData *result = [NSData dataWithBytesNoCopy:CCCryptorUpdate(cryptor, encryptedData.bytes, encryptedData.length, NULL) length:CCCryptorFinal(cryptor, NULL, 0)];
// 释放DES加密器
CCCryptorRelease(cryptor);
AES加密
// 创建AES加密器
CCCryptorRef cryptor = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, key, kCCKeySizeAES128, iv);
// 加密数据
NSData *encryptedData = [NSData dataWithBytes:data length:data.length];
// 加密后的数据
NSData *result = [NSData dataWithBytesNoCopy:CCCryptorUpdate(cryptor, encryptedData.bytes, encryptedData.length, NULL) length:CCCryptorFinal(cryptor, NULL, 0)];
// 释放AES加密器
CCCryptorRelease(cryptor);
RSA加密
// 创建RSA加密器
SecKeyRef publicKey = [self publicKeyWithPem:publicKeyString];
size_t cipherBufferSize = SecKeyGetBlockSize(publicKey);
uint8_t *cipherBuffer = malloc(cipherBufferSize);
// 加密数据
NSData *encryptedData = [NSData dataWithBytes:data length:data.length];
// 加密后的数据
size_t encryptedDataSize = cipherBufferSize;
OSStatus status = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, encryptedData.bytes, encryptedData.length, cipherBuffer, &encryptedDataSize);
// 释放RSA加密器
free(cipherBuffer);
MD5加密
// 创建MD5哈希器
CC_MD5_CTX md5Context;
CC_MD5_Init(&md5Context);
// 更新MD5哈希器
CC_MD5_Update(&md5Context, data.bytes, data.length);
// 获取MD5哈希值
unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(md5Buffer, &md5Context);
// 将MD5哈希值转换为字符串
NSData *md5Data = [NSData dataWithBytes:md5Buffer length:CC_MD5_DIGEST_LENGTH];
NSString *md5String = [md5Data base64EncodedStringWithOptions:0];
SHA加密
// 创建SHA哈希器
CC_SHA256_CTX sha256Context;
CC_SHA256_Init(&sha256Context);
// 更新SHA哈希器
CC_SHA256_Update(&sha256Context, data.bytes, data.length);
// 获取SHA哈希值
unsigned char sha256Buffer[CC_SHA256_DIGEST_LENGTH];
CC_SHA256_Final(sha256Buffer, &sha256Context);
// 将SHA哈希值转换为字符串
NSData *sha256Data = [NSData dataWithBytes:sha256Buffer length:CC_SHA256_DIGEST_LENGTH];
NSString *sha256String = [sha256Data base64EncodedStringWithOptions:0];
完整示例代码
#import <CommonCrypto/CommonCrypto.h>
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// DES加密
NSString *key = @"12345678";
NSString *iv = @"01234567";
NSString *data = @"Hello World";
NSData *encryptedData = [self DESEncrypt:data withKey:key andIv:iv];
NSLog(@"DES加密后数据:%@", encryptedData);
// AES加密
key = @"1234567890123456";
iv = @"0123456789012345";
NSData *decryptedData = [self AESDecrypt:encryptedData withKey:key andIv:iv];
NSLog(@"AES解密后数据:%@", decryptedData);
// RSA加密
NSString *publicKeyString = @"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAutV9JCK/f+lLrA0j3x\n...省略...\nM+AAW5jvQhb0wIDAQAB\n-----END PUBLIC KEY-----";
NSData *publicKeyData = [NSData dataWithBase64EncodedString:publicKeyString options:0];
NSData *encryptedRsaData = [self RSAEncrypt:data withPublicKeyData:publicKeyData];
NSLog(@"RSA加密后数据:%@", encryptedRsaData);
// MD5加密
NSString *md5String = [self MD5:data];
NSLog(@"MD5加密后数据:%@", md5String);
// SHA加密
NSString *sha256String = [self SHA256:data];
NSLog(@"SHA256加密后数据:%@", sha256String);
}
- (NSData *)DESEncrypt:(NSString *)data withKey:(NSString *)key andIv:(NSString *)iv {
// 将字符串转换为二进制数据
NSData *dataBytes = [data dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyBytes = [key dataUsingEncoding:NSUTF8StringEncoding];
NSData *ivBytes = [iv dataUsingEncoding:NSUTF8StringEncoding];
// 创建DES加密器
CCCryptorRef cryptor = CCCryptorCreate(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, keyBytes.bytes, kCCKeySizeDES, ivBytes.bytes);
// 加密数据
NSData *encryptedData = [NSData dataWithBytesNoCopy:CCCryptorUpdate(cryptor, dataBytes.bytes, dataBytes.length, NULL) length:CCCryptorFinal(cryptor, NULL, 0)];
// 释放DES加密器
CCCryptorRelease(cryptor);
return encryptedData;
}
- (NSData *)AESEncrypt:(NSString *)data withKey:(NSString *)key andIv:(NSString *)iv {
// 将字符串转换为二进制数据
NSData *dataBytes = [data dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyBytes = [key dataUsingEncoding:NSUTF8StringEncoding];
NSData *ivBytes = [iv data