返回

iOS逆向学习-006常用加密

IOS




## 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