iOS:如何使用十进制 X NSData 和十进制 Y NSData 生成 public 键?
iOS: How to generate public key using decimal X NSData and decimal Y NSData?
我有这样的方法
+ (NSData *)getPublicKeyFromDecimalX:(NSData *)xInput decimalY:(NSData *)yInput { ... }
当我有这样的 hexX: (NSData*)
时,我知道如何生成它...
UInt8 iBytes[] = {0x04};
NSMutableData *allData = [[NSMutableData alloc] init];
[allData appendBytes:iBytes length:sizeof(iBytes)];
[allData appendData:xInput];
[allData appendData:yInput];
NSMutableDictionary *publicKeyOptions = [[NSMutableDictionary alloc]init];
[publicKeyOptions setValue:(__bridge id) kSecAttrKeyTypeECSECPrimeRandom forKey:(__bridge id)kSecAttrKeyType];
[publicKeyOptions setValue:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)kSecAttrKeyClass];
[publicKeyOptions setValue:[NSNumber numberWithInt:256] forKey:(__bridge id)kSecAttrKeySizeInBits];
[publicKeyOptions setValue:[NSNumber numberWithBool:NO] forKey:(__bridge id)kSecAttrIsPermanent];
SecKeyRef publicKeyRef = SecKeyCreateWithData((__bridge CFDataRef)allData, (__bridge CFDictionaryRef)publicKeyOptions, nil);
但我正在努力将十进制 NSData
转换为十六进制 NSData
。
I'm struggling to convert decimal NSData
into hexadecimal NSData
.
A NSData
本身既不是十进制也不是十六进制。它只是一系列字节数据。
考虑
UInt8 bytes[] = {0x2a, 0xff};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSLog(@"%@", data); // {length = 2, bytes = 0x2aff}
这是 NSData
,0x2a
后跟 0xff
。
如果您声明 bytes
为十进制,则 NSData
是相同的:
UInt8 bytes[] = {42, 255};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSLog(@"%@", data); // also {length = 2, bytes = 0x2aff}
有趣的是 NSData
中表示的数字不是一系列字节(即不仅仅是一系列 8 位整数),而是大于一个字节的数值(例如16 位、32 位等)在这种情况下,我们不得不担心“endianness”作为 NSData
中表示的十进制值。因此,当我们将数值存储为一系列字节时,我们希望明确字节的顺序。例如,如果我们想要一个大端 NSData
表示:
UInt16 value = 11007;
UInt16 bytes = NSSwapHostShortToBig(value);
NSData *data = [NSData dataWithBytes:&bytes length:sizeof(bytes)];
NSLog(@"%@", data); // {length = 2, bytes = 0x2aff}
我有这样的方法
+ (NSData *)getPublicKeyFromDecimalX:(NSData *)xInput decimalY:(NSData *)yInput { ... }
当我有这样的 hexX: (NSData*)
时,我知道如何生成它...
UInt8 iBytes[] = {0x04};
NSMutableData *allData = [[NSMutableData alloc] init];
[allData appendBytes:iBytes length:sizeof(iBytes)];
[allData appendData:xInput];
[allData appendData:yInput];
NSMutableDictionary *publicKeyOptions = [[NSMutableDictionary alloc]init];
[publicKeyOptions setValue:(__bridge id) kSecAttrKeyTypeECSECPrimeRandom forKey:(__bridge id)kSecAttrKeyType];
[publicKeyOptions setValue:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)kSecAttrKeyClass];
[publicKeyOptions setValue:[NSNumber numberWithInt:256] forKey:(__bridge id)kSecAttrKeySizeInBits];
[publicKeyOptions setValue:[NSNumber numberWithBool:NO] forKey:(__bridge id)kSecAttrIsPermanent];
SecKeyRef publicKeyRef = SecKeyCreateWithData((__bridge CFDataRef)allData, (__bridge CFDictionaryRef)publicKeyOptions, nil);
但我正在努力将十进制 NSData
转换为十六进制 NSData
。
I'm struggling to convert decimal
NSData
into hexadecimalNSData
.
A NSData
本身既不是十进制也不是十六进制。它只是一系列字节数据。
考虑
UInt8 bytes[] = {0x2a, 0xff};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSLog(@"%@", data); // {length = 2, bytes = 0x2aff}
这是 NSData
,0x2a
后跟 0xff
。
如果您声明 bytes
为十进制,则 NSData
是相同的:
UInt8 bytes[] = {42, 255};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSLog(@"%@", data); // also {length = 2, bytes = 0x2aff}
有趣的是 NSData
中表示的数字不是一系列字节(即不仅仅是一系列 8 位整数),而是大于一个字节的数值(例如16 位、32 位等)在这种情况下,我们不得不担心“endianness”作为 NSData
中表示的十进制值。因此,当我们将数值存储为一系列字节时,我们希望明确字节的顺序。例如,如果我们想要一个大端 NSData
表示:
UInt16 value = 11007;
UInt16 bytes = NSSwapHostShortToBig(value);
NSData *data = [NSData dataWithBytes:&bytes length:sizeof(bytes)];
NSLog(@"%@", data); // {length = 2, bytes = 0x2aff}