我正在尝试将 EC Public 密钥从 android 导出到 iOS,执行此操作的最佳方法是什么?
Im trying to export EC Public keys from android to iOS, what is the best way to do this?
我正在尝试在我的应用程序的 iOS 和 Android 客户端之间执行 EC 密钥交换。我已经成功地将它们从 iOS 传输并生成到 Android。但是我无法在 iOS.
中使用 android 应用中生成的密钥
我正在使用 swift 中的 SecKeyCreateWithData
方法从 'Data' 类型生成密钥,但出现此错误:
Error Domain=NSOSStatusErrorDomain Code=-50 "EC public key creation from data failed"
我在 android 客户端中使用了以下编码,它生成一个 base64 字符串,我对其进行处理并作为数据 SecKeyCreateWithData
在 swift
中传递
byte [] encodedPublicKey = PubKey.getEncoded();
String b64PublicKey = Base64.encodeToString(encodedPublicKey,Base64.DEFAULT);
我想生成一个 SecKeyRef public 密钥,请帮忙
Apple API 不完全遵循与其他平台兼容的标准。在 iOS 上导出 EC public 密钥不包括固定的 header 标识符。因此,导入函数还期望缺少 header。这意味着您必须删除 Android 在导入 Android EC 密钥时创建的 header。
这是一个可移植的例子:
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)
}
我正在尝试在我的应用程序的 iOS 和 Android 客户端之间执行 EC 密钥交换。我已经成功地将它们从 iOS 传输并生成到 Android。但是我无法在 iOS.
中使用 android 应用中生成的密钥我正在使用 swift 中的 SecKeyCreateWithData
方法从 'Data' 类型生成密钥,但出现此错误:
Error Domain=NSOSStatusErrorDomain Code=-50 "EC public key creation from data failed"
我在 android 客户端中使用了以下编码,它生成一个 base64 字符串,我对其进行处理并作为数据 SecKeyCreateWithData
在 swift
byte [] encodedPublicKey = PubKey.getEncoded();
String b64PublicKey = Base64.encodeToString(encodedPublicKey,Base64.DEFAULT);
我想生成一个 SecKeyRef public 密钥,请帮忙
Apple API 不完全遵循与其他平台兼容的标准。在 iOS 上导出 EC public 密钥不包括固定的 header 标识符。因此,导入函数还期望缺少 header。这意味着您必须删除 Android 在导入 Android EC 密钥时创建的 header。
这是一个可移植的例子:
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)
}