gpt4 book ai didi

objective-c - 如何在 iOS 中使用 PKCS8 RSA DER 私钥?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:38 24 4
gpt4 key购买 nike

在运行时,我的 iOS 应用程序收到一个带有公私 RSA key 对的文件,由其他人的 Java 生成:

KeyPairGenerator keygenerator;
keygenerator = KeyPairGenerator.getInstance("RSA");
keygenerator.initialize(4096);

KeyPair keypair = keygenerator.generateKeyPair();
PrivateKey privateKey = keypair.getPrivate().getEncoded();
PublicKey publicKey = keypair.getPublic().getEncoded();

我已经成功读取并使用了公钥,使用this method ,它从 key 中删除了一些前导码。

我现在想使用私钥。同样的方法不起作用,我假设序言在某种程度上有所不同。该博客建议它正在导入 PKCS#1 PEM key ,但随后又说它们是二进制的,所以我认为它们只是指 Base64 编码的 DER key 。我还发现也许我拥有的 key 是 PKCS#8而是编码。

我当然可以用

openssl pkcs8 -nocrypt -inform der < pk8.der > pvt.pem

在示例私钥和 openssl 上没有提示。

公钥是 PKCS#1 而私钥是 PKCS#8 有意义吗?

但如果可以的话,我真的很想使用 CommonCrypto 和安全框架,而不是链接到 OpenSSL。在 Mac OS 上,libsecurity 中有函数阅读 PKCS#8,但这还没有进入 iOS。老实说,我确实尝试过阅读源代码,但我无法弄清楚他们实际上在哪里剥离了 key 。

[TL;DR] 我如何去除 version and algorithm来自 DER 私钥的 PKCS#8 字段,并使用 CommonCrypto 或某些 C/C++/ObjC 获取普通 key ?

最佳答案

如果没有 OpenSSL,我无法解决问题。所以这是一个确实使用 OpenSSL 的解决方案。

假设您有一个名为 privateKey 的 NSData 以及您要签名的另一个名为 signableData 的 NSData。

#import <openssl/x509.h>
#import <openssl/pem.h>

NSURL *cacheDir = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
NSString *infile = [[cacheDir URLByAppendingPathComponent:@"privkey.der"] path];

NSError *error;
[privateKey writeToFile:infile options:NSDataWritingFileProtectionComplete error:&error];
if (error) {
NSLog(@"%@", error);
} else {
BIO *in = BIO_new_file([infile cStringUsingEncoding:NSUTF8StringEncoding], "rb");
PKCS8_PRIV_KEY_INFO *p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(in, NULL);
NSLog(@"%i", p8inf->broken);
EVP_PKEY *pkey = EVP_PKCS82PKEY(p8inf);
PKCS8_PRIV_KEY_INFO_free(p8inf);
BIO_free(in);

uint8_t * cipherBuffer = NULL;

// Calculate the buffer sizes.
unsigned int cipherBufferSize = RSA_size(pkey->pkey.rsa);
unsigned int signatureLength;

// Allocate some buffer space. I don't trust calloc.
cipherBuffer = malloc(cipherBufferSize);
memset((void *)cipherBuffer, 0x0, cipherBufferSize);

unsigned char *openSSLHash = SHA1(signableData.bytes, signableData.length, NULL);
int success = RSA_sign(NID_sha1, openSSLHash, 20, cipherBuffer, &signatureLength, pkey->pkey.rsa);
if (success) NSLog(@"WIN");


NSData *signed = [NSData dataWithBytes:(const void*)cipherBuffer length:signatureLength];

EVP_PKEY_free(pkey);
}

关于objective-c - 如何在 iOS 中使用 PKCS8 RSA DER 私钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12311840/

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