gpt4 book ai didi

android - iOS 5.0 : generated x509 rsa public key of size 2048 is 270 bytes instead of 294 bytes. 为什么?

转载 作者:行者123 更新时间:2023-11-28 18:57:31 39 4
gpt4 key购买 nike

我在工作中正在为 iOS 5 开发一个 sdk,我正在通过套接字接口(interface)与设备通信。此设备需要发送大小为 2048 的 base64 编码的 rsa x509 公钥。

我使用以下代码生成 key 对:

OSStatus status = noErr;
NSMutableDictionary *privateKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary *publicKeyAttr= [[NSMutableDictionary alloc] init];
NSMutableDictionary *keyPairAttr = [[NSMutableDictionary alloc] init];

NSData * publicTag = [NSData dataWithBytes:publicKeyIdentifier
length:strlen((const char *)publicKeyIdentifier)];
NSData * privateTag = [NSData dataWithBytes:privateKeyIdentifier
length:strlen((const char *)privateKeyIdentifier)];

SecKeyRef publicKey = NULL;
SecKeyRef privateKey = NULL;

[keyPairAttr setObject:(__bridge id)kSecAttrKeyTypeRSA
forKey:(__bridge id)kSecAttrKeyType];
[keyPairAttr setObject:[NSNumber numberWithInt:2048]
forKey:(__bridge id)kSecAttrKeySizeInBits];

[privateKeyAttr setObject:[NSNumber numberWithBool:YES]
forKey:(__bridge id)kSecAttrIsPermanent];
[privateKeyAttr setObject:privateTag
forKey:(__bridge id)kSecAttrApplicationTag];

[publicKeyAttr setObject:[NSNumber numberWithBool:YES]
forKey:(__bridge id)kSecAttrIsPermanent];
[publicKeyAttr setObject:publicTag
forKey:(__bridge id)kSecAttrApplicationTag];

[keyPairAttr setObject:privateKeyAttr
forKey:(__bridge id)kSecPrivateKeyAttrs];
[keyPairAttr setObject:publicKeyAttr
forKey:(__bridge id)kSecPublicKeyAttrs];

status = SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttr,
&_publicKey, &_privateKey);

然后我使用以下代码获取公钥的原始数据:

NSData* publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)];

OSStatus sanityCheck = noErr;
NSData* publicKeyBits = nil;

NSMutableDictionary* queryPublicKey = [[NSMutableDictionary alloc] init];
[queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
[queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];

// Temporarily add key to the Keychain, return as data:
NSMutableDictionary* attributes = [queryPublicKey mutableCopy];
[attributes setObject:(__bridge id)key forKey:(__bridge id)kSecValueRef];
[attributes setObject:@YES forKey:(__bridge id)kSecReturnData];
CFTypeRef result;
sanityCheck = SecItemAdd((__bridge CFDictionaryRef)attributes, &result);
if (sanityCheck == errSecSuccess) {
publicKeyBits = CFBridgingRelease(result);

// Remove from Keychain again:
(void)SecItemDelete((__bridge CFDictionaryRef)queryPublicKey);
}
return publicKeyBits;

上面的代码为公钥生成了 270 字节长 的 NSData;我对这些数据进行 base64 编码并将其发送到设备,但它被拒绝了。

我的同事在android上完成了同样的功能,他生成的 key 对如下:

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair key = kpg.generateKeyPair();

他使用:

    key.getPublic().getEncoded() 

访问设备接受的294 字节长的公钥数据。

此外,如果我获取他生成的公钥的原始字节,并使用我的 base64 编码并发送,这也被设备接受。

这里有什么区别?为什么他的 key 是294字节,而我的是270字节?我该如何解决这个问题?任何帮助将不胜感激。

编辑

我刚找到https://crypto.stackexchange.com/questions/14491/why-is-a-2048-bit-public-rsa-key-represented-by-540-hexadecimal-characters-in-x ,即:

请注意,这不包括“这是一个 RSA 公钥”的编码;占用额外的 24 个字节(包括开销)。

这听起来像是我需要的,虽然我不知道如何包含这些信息。

有人吗?

最佳答案

这是答案:http://blog.wingsofhermes.org/?p=42

“首先,当您从 iPhone 钥匙串(keychain)中导出 key 时,它会以精简格式导出——只有公钥和指数,而没有您期望在完全编码的公钥中包含的任何其他 ASN.1 内容”

我以为是这样的;我整天都在用头撞显示器..

该死的苹果。

关于android - iOS 5.0 : generated x509 rsa public key of size 2048 is 270 bytes instead of 294 bytes. 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30648980/

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