iOS中的数据加密与解密

数字化生活设计师 2021-06-16 ⋅ 72 阅读

在移动应用开发中,数据的加密和解密是非常重要的一环,以保护用户的隐私和数据安全。iOS提供了各种加密算法和工具,可以帮助开发者实现数据加密和解密的功能。本文将介绍iOS中的数据加密和解密以及常用的加密算法。

1. 数据加密

数据加密是指将明文数据转换为密文数据的过程,确保数据在传输和存储过程中不被未授权的人访问和泄露。

1.1 对称加密

对称加密算法使用相同的密钥进行数据的加密和解密,它的优点是加解密速度快,但密钥的管理和分发比较复杂。在iOS中,常用的对称加密算法有AES(Advanced Encryption Standard)和DES(Data Encryption Standard)。

  • AES加密示例代码:
#import <CommonCrypto/CommonCryptor.h>

NSData *data = [@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding];

NSString *key = @"1234567890abcdef";
NSString *iv = @"1234567890abcdef";

NSMutableData *encryptedData = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128];

size_t encryptedDataLength;
CCCrypt(kCCEncrypt,
        kCCAlgorithmAES,
        kCCOptionPKCS7Padding,
        key.UTF8String, 
        kCCKeySizeAES128,
        iv.UTF8String,
        data.bytes,
        data.length,
        encryptedData.mutableBytes,
        encryptedData.length,
        &encryptedDataLength);

encryptedData.length = encryptedDataLength;

NSString *encryptedString = [encryptedData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSLog(@"%@", encryptedString);

1.2 非对称加密

非对称加密算法使用一对密钥(公钥和私钥)进行数据的加密和解密,公钥用于加密数据,私钥用于解密数据。它的优点是密钥的管理和分发相对简单,但加解密速度较慢。在iOS中,常用的非对称加密算法有RSA(Rivest-Shamir-Adleman)和ECC(Elliptic Curve Cryptography)。

  • RSA加密示例代码:
#import <Security/Security.h>
#import <CommonCrypto/CommonCryptor.h>

SecKeyRef publicKey;
NSData *data = [@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary *query = @{
    (__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeRSA,
    (__bridge id)kSecAttrKeySizeInBits: @2048,
    (__bridge id)kSecPublicKeyAttrs: @{
        (__bridge id)kSecAttrIsPermanent: @NO,
        (__bridge id)kSecAttrApplicationTag: @"com.example.publickey
    }
}.mutableCopy;

OSStatus status = SecKeyGeneratePair((__bridge CFDictionaryRef)query, &publicKey, NULL);
if (status == errSecSuccess) {
    size_t encryptedDataLength = SecKeyGetBlockSize(publicKey);
    uint8_t *encryptedData = malloc(encryptedDataLength);
  
    status = SecKeyEncrypt(publicKey,
                           kSecPaddingPKCS1,
                           data.bytes,
                           data.length,
                           encryptedData,
                           &encryptedDataLength);
                           
    NSData *encryptedData = [NSData dataWithBytes:encryptedData length:encryptedDataLength];
    NSString *encryptedString = [encryptedData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSLog(@"%@", encryptedString);
}

2. 数据解密

数据解密是指将密文数据恢复为明文数据的过程,以便正确使用和展示。

2.1 对称解密

对称解密和对称加密使用相同的密钥进行操作,将密文数据还原为明文数据。

  • AES解密示例代码:
NSData *encryptedData = [[NSData alloc] initWithBase64EncodedString:encryptedString options:NSDataBase64DecodingIgnoreUnknownCharacters];

NSMutableData *decryptedData = [NSMutableData dataWithLength:encryptedData.length + kCCBlockSizeAES128];

size_t decryptedDataLength;
CCCrypt(kCCDecrypt,
        kCCAlgorithmAES,
        kCCOptionPKCS7Padding,
        key.UTF8String, 
        kCCKeySizeAES128,
        iv.UTF8String,
        encryptedData.bytes,
        encryptedData.length,
        decryptedData.mutableBytes,
        decryptedData.length,
        &decryptedDataLength);

decryptedData.length = decryptedDataLength;

NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
NSLog(@"%@", decryptedString);

2.2 非对称解密

非对称解密和非对称加密使用同一对密钥进行操作,将密文数据还原为明文数据。

  • RSA解密示例代码:
#import <Security/Security.h>
#import <CommonCrypto/CommonCryptor.h>

SecKeyRef privateKey;
NSData *encryptedData = [[NSData alloc] initWithBase64EncodedString:encryptedString options:NSDataBase64DecodingIgnoreUnknownCharacters];
NSMutableDictionary *query = @{
    (__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeRSA,
    (__bridge id)kSecAttrKeySizeInBits: @2048,
    (__bridge id)kSecPrivateKeyAttrs: @{
        (__bridge id)kSecAttrIsPermanent: @NO,
        (__bridge id)kSecAttrApplicationTag: @"com.example.privatekey
    }
}.mutableCopy;

OSStatus status = SecKeyGeneratePair((__bridge CFDictionaryRef)query, &privateKey, NULL);
if (status == errSecSuccess) {
    size_t decryptedDataLength = SecKeyGetBlockSize(privateKey);
    uint8_t *decryptedData = malloc(decryptedDataLength);
  
    status = SecKeyDecrypt(privateKey,
                           kSecPaddingPKCS1,
                           encryptedData.bytes,
                           encryptedData.length,
                           decryptedData,
                           &decryptedDataLength);
                           
    NSData *decryptedData = [NSData dataWithBytes:decryptedData length:decryptedDataLength];
    NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
    NSLog(@"%@", decryptedString);
}

结论

数据加密在iOS应用开发中是一项非常重要的技术,可以确保用户的数据安全和隐私保护。iOS提供了丰富的加密算法和工具,开发者可以根据需要选择适合的加密方式进行数据加密和解密操作。同时,开发者还需要注意密钥的管理和保护,以防止密钥泄露导致数据被破解。


全部评论: 0

    我有话说: