gpt4 book ai didi

iPhone 公钥加密 SecKeyEncrypt 返回错误 9809 (errSSLCrypto)

转载 作者:行者123 更新时间:2023-12-03 19:09:17 25 4
gpt4 key购买 nike

我尝试使用 iPhone 的 PKI 库来加密一个短字符串 (12345678),但每当我尝试使用 SecKeyEncrypt 时,我总是收到错误 -9809(即 errSSLCrypto)。 SecureTransport.h 头文件将此错误简单地描述为“底层加密错误”,这没有多大意义。

我的代码如下:

- (NSData *)encryptDataWithPublicKey:(NSString *)plainText {

OSStatus result = -1;

NSData *plainTextData = [plainText dataUsingEncoding:NSASCIIStringEncoding];
size_t plainTextLength = [plainTextData length];

SecTrustRef trustRef;
SecTrustResultType trustResult;

SecPolicyRef policy = SecPolicyCreateBasicX509();

result = SecTrustCreateWithCertificates(m_oCert, policy, &trustRef);

if (result != errSecSuccess) {
NSLog(@"Trust create failed with code: %d",result);
return nil;
}

result = SecTrustEvaluate(trustRef, &trustResult);

if (result != errSecSuccess) {
NSLog(@"Trust eval failed with code: %d",result);

CFRelease(trustRef);
return nil;
}

SecKeyRef publicKey = SecTrustCopyPublicKey(trustRef);

uint8_t *cipherTextBuf = NULL;
size_t cipherTextLen = 0;

size_t keyBlockSize = SecKeyGetBlockSize(publicKey);
int maxInputSize = keyBlockSize - 11; //If using PKCS1 Padding, else keyBlockSize

if (plainTextLength > maxInputSize) {
//Fail
NSLog(@"Data size is larger than max permitted!");

CFRelease(trustRef);
CFRelease(publicKey);
CFRelease(policy);

return nil;
}

cipherTextBuf = malloc(sizeof(uint8_t)*keyBlockSize);
memset(cipherTextBuf,0,keyBlockSize);

//result = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plainTextBuf, plainTextLength, cipherTextBuf, &cipherTextLen);
result = SecKeyEncrypt(publicKey, kSecPaddingNone, (const uint8_t *)[plainTextData bytes], plainTextLength, cipherTextBuf, &cipherTextLen);

NSData *cipherText = nil;
if (result == errSecSuccess) {

cipherText = [NSData dataWithBytes:cipherTextBuf length:cipherTextLen];

} else {
NSLog(@"Error detected: %d",result);
}

free(cipherTextBuf);
cipherTextBuf = NULL;

CFRelease(trustRef);
CFRelease(publicKey);
CFRelease(policy);

return cipherText;
}

无论我使用什么填充,它们都会给出相同的错误。公钥源 self 的客户提供的证书,并且我已检查以确保该 key 有效。我做错了什么以及如何正确使用该功能?

最佳答案

使用SecKeyEncrypt时,输入的cipherTextLength应该是输出缓冲区的大小。设置

size_t cipherTextLen = keyBlockSize;

解决了问题。

关于iPhone 公钥加密 SecKeyEncrypt 返回错误 9809 (errSSLCrypto),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6951413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com