- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在运行时,我的 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/
起初,这是我的第一篇文章——如果这篇文章没有得到很好的描述和设计,我很抱歉。 我的问题是我需要使用 Spring Boot 通过 SSL 连接连接到 GCP 中的数据库。在 GCP 内部生成三个所需的
是否可以创建相同大小的 openssl 证书(server.key.der 或 server.crt.der).. 1024 或 2048 或任何固定大小?我喜欢这一点,每次我创建证书时它都会更改大小
我有一个 DER 格式的证书文件和一个 DER 格式的 key 文件, key 是加密的。 我想创建一个包含 PEM 格式的证书和加密 key 的 cer 文件,例如: -----BEGIN CERT
我正在尝试将 certifictae 和 key 写入 stm32 的闪存 EEPROM,我知道我们可以写入字符串,但是否有可能在闪存中写入整个证书(.der)。我正在使用 stm32f7 微 Con
我正在尝试将 X509 证书写入内存中的 DER 格式。将其写入文件非常有效。 我需要 PEM 格式的证书,不带“-----BEGIN PRIVATE KEY-----”页眉、页脚或换行符。我无法弄清
为什么模数用前导零填充?我正在阅读 PKCS#1 和 PKCS#8,但没有找到任何相关信息。 在 c# 中必须删除前导零,有人知道为什么吗? 在 http://etherhack.co.uk/asym
我有一个 X.509 证书,其中包含一组带有以下隐式 [0] 标记的数据: A0 81 C6 (value)... 我有一个标准文档的摘录: The IMPLICIT [0] tag is not u
如何从代表 DER 格式证书的十六进制字符串中提取通用名称?我需要显示证书的名称,以便客户端可以选择他们希望在 Web 应用程序中使用的证书。 限制: 我需要在网络浏览器中执行此提取客户端操作。 Op
使用 BounceCaSTLe 我可以使用以下代码。它生成一个 key 对并返回 ASN.1 DER 编码格式。 //Generate new key var generator = new RsaK
我最初有一个受密码保护的 PEM 文件,其中包含使用 BouncyCaSTLe 读入 Java 应用程序的私钥。 PEM 文件开头为 -----开始 RSA 私钥----- 这让我相信它是 PKCS#
在十六进制编辑器中是否存在某种 DER 数字签名? 我得到了一个二进制内容大约为 1.3 KB 的 .cer 文件。有人告诉我它是 DER 格式,我的阅读表明具有此扩展名的证书几乎都是 DER 或带有
我有一个应用程序需要安装证书,它使用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:CERTIFICATE_URL]]
我正在尝试验证文件的签名。我按照这些说明生成证书: // generate a private key with size of 2048 bits openssl genrsa -out priva
我想创建一个能够对大整数(即 ECDSA signature r and s)进行 DER 编码和解码的 Google Go 应用程序。据我了解,我应该使用 asn1 package , 但我应该调用
我正在尝试为 Elasticsearch Searchguard 创建证书.一项要求是证书必须在 SAN 中包含 oid:1.2.3.4.5.5。我正在使用 GO 生成该证书。经过一些尝试和错误后,我
我需要从我的示例 ASN1 编译并生成一个 .DER 文件 BCAS DEFINITIONS ::= BEGIN BBCard ::= SEQUENCE { name IA5String (SIZ
我有一个 X509Certificate,我将它写入/打印到一个文件中,如下所示。 (我不是在写编码字节,因为我想阅读证书的内容) X509Certificate cer = generateCert
我正在尝试对安全网站进行 POST 调用: 步骤: 1) 转到https://www.mywebsite.com (供引用) 2) 将上述网站的 keystore 导出到C:\Program File
这是我的结构: SET OF SEQUENCE: INTEGER: XX INTEGER: YY 我的编码是这样的: 11 08 10 06 02 01 XX 02 01 Y
我见过很多问题,但没有一个真正提供好的答案,或者即使他们尝试了,他们也会假设提出问题的人并没有问他实际上在问什么。郑重声明,我不是在询问签名、加密或 PEM 文件! 就我而言,我将收到一个加密数据的小
我是一名优秀的程序员,十分优秀!