gpt4 book ai didi

iphone - 将 RSA 公钥发送到 iphone 并使用它来加密

转载 作者:可可西里 更新时间:2023-11-01 15:03:55 25 4
gpt4 key购买 nike

我有一个 TCP 套接字服务器,我想在不使用 SSL 的情况下执行以下操作:

  1. 在服务器上,制作 RSA key 对(我知道如何使用 openssl 的加密库来完成此操作)
  2. 在服务器上,将公钥发送给iphone,并保留私钥。
  3. 在客户端 (iphone) 上,想要使用公钥加密消息,使用 SecKeyEncrypt。
  4. 在服务器上,解密消息。

消息足够短,PKCS1 填充结果适合 128 个字节。

我不知道2~4怎么做。有人知道吗?

最佳答案

这应该可以满足您的要求 - 它使用服务器的公钥加密数据。它不受 MITM 攻击,除非攻击者拥有您的私钥及其密码的拷贝(但是,通过非 SSL 进行通信仍然是,但是您使用服务器的合法公钥加密的数据几乎不可能解密) .

我从 Apple 的文档、本网站、Apple 开发者论坛和可能的其他地方拼凑了这个。所以感谢所有我抄袭代码的人!这段代码假设了几件事:

  1. 您已经生成了 RSA key 对(我使用的是 4096 位 key ,它看起来足够快)并且使用私钥创建了一个名为“cert.cer”的 DER 编码证书您放入应用程序资源包中的证书(显然,您也可以从服务器下载证书,但随后又会再次受到 MITM 攻击)。默认情况下,OpenSSL 生成 PEM 编码的证书,因此您必须使用“openssl x509 -in cert.pem -inform PEM -out cert.cer -outform DER”对其进行转换。 iOS 将在 PEM 上呕吐。我使用证书的原因是它实际上更容易使用,并且在 iOS 中受支持。仅使用公钥是不行的(尽管可以做到)。

  2. 您已将 Security.framework 添加到您的项目中,并且您#import

/* 返回加密文本的 NSData,如果加密不成功则返回 nil。
将 X.509 证书作为 NSData(例如来自 dataWithContentsOfFile:)*/

+(NSData *)encryptString:(NSString *)plainText withX509Certificate:(NSData *)certificate {

SecCertificateRef cert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certificate);
SecPolicyRef policy = SecPolicyCreateBasicX509();
SecTrustRef trust;
OSStatus status = SecTrustCreateWithCertificates(cert, policy, &trust);

SecTrustResultType trustResult;
if (status == noErr) {
status = SecTrustEvaluate(trust, &trustResult);
}

SecKeyRef publicKey = SecTrustCopyPublicKey(trust);

const char *plain_text = [plainText UTF8String];
size_t blockSize = SecKeyGetBlockSize(publicKey);
NSMutableData *collectedCipherData = [NSMutableData data];

BOOL success = YES;
size_t cipherBufferSize = blockSize;
uint8_t *cipherBuffer = malloc(blockSize);

int i;
for (i = 0; i < strlen(plain_text); i += blockSize-11) {
int j;
for (j = 0; j < blockSize-11 && plain_text[i+j] != '\0'; ++j) {
cipherBuffer[j] = plain_text[i+j];
}

int result;
if ((result = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, cipherBuffer, j, cipherBuffer, &cipherBufferSize)) == errSecSuccess) {
[collectedCipherData appendBytes:cipherBuffer length:cipherBufferSize];
} else {
success = NO;
break;
}
}

/* Free the Security Framework Five! */
CFRelease(cert);
CFRelease(policy);
CFRelease(trust);
CFRelease(publicKey);
free(cipherBuffer);

if (!success) {
return nil;
}

return [NSData dataWithData:collectedCipherData];
}

关于iphone - 将 RSA 公钥发送到 iphone 并使用它来加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4211484/

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