面试题答案
一键面试加密
在Objective-C中实现加密,常见的是使用CommonCrypto框架。以AES加密为例:
- 引入头文件
#import <CommonCrypto/CommonCryptor.h>
- 加密函数
NSData *AESEncrypt(NSData *dataToEncrypt, NSString *key) {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [dataToEncrypt length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL,
[dataToEncrypt bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
安全性保障:AES加密算法通过对数据进行复杂的置换和代换操作,将明文转换为密文。在区块链交互场景中,传输的数据被加密后,即使被截取,没有正确的密钥也无法解密获取真实数据,保障了数据的机密性。
数字签名
在Objective-C中可以使用Security框架来实现数字签名。
- 引入头文件
#import <Security/Security.h>
- 生成签名函数
NSData *generateSignature(NSData *data, SecKeyRef privateKey) {
uint8_t signatureBytes[128];
memset(signatureBytes, 0, sizeof(signatureBytes));
size_t signatureLen = sizeof(signatureBytes);
OSStatus status = SecKeyRawSign(privateKey,
kSecPaddingPKCS1SHA256,
[data bytes], (size_t)[data length],
signatureBytes, &signatureLen);
if (status == noErr) {
return [NSData dataWithBytes:signatureBytes length:signatureLen];
}
return nil;
}
- 验证签名函数
BOOL verifySignature(NSData *data, NSData *signature, SecKeyRef publicKey) {
OSStatus status = SecKeyRawVerify(publicKey,
kSecPaddingPKCS1SHA256,
[data bytes], (size_t)[data length],
[signature bytes], (size_t)[signature length]);
return status == noErr;
}
安全性保障:数字签名利用私钥对数据进行签名,接收方使用公钥验证签名。在区块链场景中,发送方对交易数据进行签名,接收方或区块链网络通过验证签名,确保数据未被篡改且确实来自声称的发送方,保障了数据的完整性和来源的真实性。