我想把EC公钥从android导出到iOS,最好的方法是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想把EC公钥从android导出到iOS,最好的方法是什么?相关的知识,希望对你有一定的参考价值。

我试图在我的应用程序的iosandroid客户端之间执行EC密钥交换。我已经成功地将它们从iOS传输和生成到Android。但我无法在iOS中使用在android应用中生成的密钥。

我使用的是 SecKeyCreateWithData 方法来从'数据'类型生成密钥,但我得到了这个错误。

错误域=NSOSStatusErrorDomain Code=-50 "EC公钥从数据中创建失败"

我在android客户端中使用了下面的编码,它产生了一个base64的字符串,我将其处理并作为数据传递给了用户。SecKeyCreateWithData 迅速

byte [] encodedPublicKey = PubKey.getEncoded();
String b64PublicKey = Base64.encodeToString(encodedPublicKey,Base64.DEFAULT);

我想生成一个 SecKeyRef 公钥

答案

苹果的API并没有完全按照标准来和其他平台很好的玩耍。在iOS上导出EC公钥并不包含固定的头标识符。因此,导入函数也希望缺少头。这意味着你必须在导入Android EC密钥时删除Android创建的头。

下面是一个可移植的例子。

CFMutableDataRef mutableData = CFDataCreateMutable(kCFAllocatorDefault, 0);
if (mutableData)
{
    //Fixed schema header
    const UInt8 headerBytes[] = { 0x30,0x59,0x30,0x13,0x06,0x07,0x2a,0x86,
    0x48,0xce,0x3d,0x02,0x01,0x06,0x08,0x2a,
    0x86,0x48,0xce,0x3d,0x03,0x01,0x07,0x03,
        0x42,0x00 };
    const CFIndex headerSize = sizeof(headerBytes);

    //Uncomment for exporting (such as via SecKeyCopyExternalRepresentation)
    //CFDataAppendBytes(mutableData, headerBytes, headerSize);
    //CFDataAppendBytes(mutableData, CFDataGetBytePtr(iosKeyData), CFDataGetLength(iosKeyData));

    //For importing Android key data
    CFDataAppendBytes(mutableData, CFDataGetBytePtr(androidKeyData), CFDataGetLength(androidKeyData));
    CFDataDeleteBytes(mutableData, CFRangeMake(0, headerSize));

    //Use the mutableData here (SecKeyCreateWithData)

    CFRelease(mutableData);
}

Swift版本

    let mutableData = CFDataCreateMutable(kCFAllocatorDefault, CFIndex(0))
    if mutableData != nil 
    {
        //Fixed schema header
        //var headerBytes = [0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00] as [UInt8]
        let headerSize = 26

        //Uncomment for exporting (such as via SecKeyCopyExternalRepresentation)
        //CFDataAppendBytes(mutableData, &headerBytes, headerSize)
        //CFDataAppendBytes(mutableData, CFDataGetBytePtr(iosKeyData), CFDataGetLength(iosKeyData))

        //For importing Android key data
        CFDataAppendBytes(mutableData, CFDataGetBytePtr(androidKeyData), CFDataGetLength(androidKeyData))
        CFDataDeleteBytes(mutableData, CFRangeMake(CFIndex(0), headerSize))

        //Use the mutableData here (SecKeyCreateWithData)
    }

以上是关于我想把EC公钥从android导出到iOS,最好的方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

从压缩的公钥导出 ECDSA 未压缩的公钥

尝试从其他计算机访问 ec2 时 ssh 权限被拒绝(公钥)

java applet到android工作流程

将 Javascript 应用程序移植到 iOS/Android Flutter

Amazon ec2 显示“权限被拒绝(公钥)”

我想把服务器上的DB2表结构和数据全部导入到本地上的DB2数据库上最好是用控制中心来操作解决了我加分