Objective C 中的 RSA 实现

作者:编程家 分类: ios 时间:2025-11-25

Objective C中的RSA实现

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于数据加密和数字签名。在Objective C中,我们可以使用第三方库或自行实现RSA算法来进行加密和解密操作。

生成RSA密钥对

在使用RSA加密和解密之前,我们首先需要生成一对公钥和私钥。下面是一个使用Objective C实现生成RSA密钥对的示例代码:

objective-c

#import

- (void)generateRSAKeyPair {

NSMutableDictionary *privateKeyAttributes = [NSMutableDictionary dictionary];

NSMutableDictionary *publicKeyAttributes = [NSMutableDictionary dictionary];

NSMutableDictionary *keyPairAttributes = [NSMutableDictionary dictionary];

// 设置密钥对的算法类型为RSA

[keyPairAttributes setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];

// 设置密钥对的长度,一般推荐2048位

[keyPairAttributes setObject:@2048 forKey:(__bridge id)kSecAttrKeySizeInBits];

// 生成密钥对

SecKeyRef publicKey, privateKey;

SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttributes, &publicKey, &privateKey);

// 将公钥存储到Keychain中

[publicKeyAttributes setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];

[publicKeyAttributes setObject:publicKey forKey:(__bridge id)kSecValueRef];

[publicKeyAttributes setObject:@YES forKey:(__bridge id)kSecReturnPersistentRef];

CFTypeRef publicKeyPersistentRef = NULL;

SecItemAdd((__bridge CFDictionaryRef)publicKeyAttributes, &publicKeyPersistentRef);

// 将私钥存储到Keychain中

[privateKeyAttributes setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];

[privateKeyAttributes setObject:privateKey forKey:(__bridge id)kSecValueRef];

[privateKeyAttributes setObject:@YES forKey:(__bridge id)kSecReturnPersistentRef];

CFTypeRef privateKeyPersistentRef = NULL;

SecItemAdd((__bridge CFDictionaryRef)privateKeyAttributes, &privateKeyPersistentRef);

NSLog(@"公钥和私钥已生成并存储到Keychain中。");

}

以上代码通过调用Security框架中的API,生成了一对RSA密钥,并将公钥和私钥存储到Keychain中。这样可以确保密钥的安全性和持久性。

使用RSA加密和解密数据

生成RSA密钥对后,我们可以使用公钥对数据进行加密,再使用私钥对加密后的数据进行解密。下面是一个使用Objective C实现RSA加密和解密的示例代码:

objective-c

#import

- (NSData *)encryptData:(NSData *)data withPublicKey:(SecKeyRef)publicKey {

size_t cipherBufferSize = SecKeyGetBlockSize(publicKey);

uint8_t *cipherBuffer = malloc(cipherBufferSize);

memset(cipherBuffer, 0, cipherBufferSize);

size_t plainBufferSize = [data length];

const uint8_t *plainBuffer = [data bytes];

OSStatus status = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plainBuffer, plainBufferSize, cipherBuffer, &cipherBufferSize);

if (status != errSecSuccess) {

NSLog(@"RSA加密失败,错误码:%d", (int)status);

return nil;

}

NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize];

free(cipherBuffer);

return encryptedData;

}

- (NSData *)decryptData:(NSData *)encryptedData withPrivateKey:(SecKeyRef)privateKey {

size_t plainBufferSize = SecKeyGetBlockSize(privateKey);

uint8_t *plainBuffer = malloc(plainBufferSize);

memset(plainBuffer, 0, plainBufferSize);

size_t cipherBufferSize = [encryptedData length];

const uint8_t *cipherBuffer = [encryptedData bytes];

OSStatus status = SecKeyDecrypt(privateKey, kSecPaddingPKCS1, cipherBuffer, cipherBufferSize, plainBuffer, &plainBufferSize);

if (status != errSecSuccess) {

NSLog(@"RSA解密失败,错误码:%d", (int)status);

return nil;

}

NSData *decryptedData = [NSData dataWithBytes:plainBuffer length:plainBufferSize];

free(plainBuffer);

return decryptedData;

}

以上代码通过调用Security框架中的API,实现了使用RSA公钥加密和私钥解密数据的功能。需要注意的是,加密和解密的数据都需要转换为NSData类型。

RSA算法是一种非对称加密算法,可以保证数据的安全性。在Objective C中,我们可以使用Security框架中的API来生成RSA密钥对,并使用公钥进行加密,私钥进行解密。通过以上示例代码,我们可以在Objective C项目中快速实现RSA加密和解密的功能。