我正在尝试使用C库加密十六进制字符串,这是一个连接Swift,Objective-C和C的英雄壮举。
但是,当我将NSData
转换为String
时,最终结果为nil
。
我从这开始:
let fakeHex = "9F1D53E732E48F25F94711D5B22086778278624F715D9B2BEC8FB81134E7C904".toData()
let data = Data(repeating: 1, count: 32)
data
是一组32 true
值
fakeHex
是一个硬编码的十六进制,我通过以下扩展名对UTF8进行编码:
extension String {
func toData() -> Data {
let data = NSMutableData()
let terminator = [0]
for char in self {
let encodedString = String(char).data(using: .utf8)!
data.append(encodedString)
data.append(terminator, length: 1)
}
return Data(referencing: data)
}
}
接下来,我有一个名为Blakey
的Objective-C类,它使用十六进制NSData
和true
s NSData
并通过Blake2对它们进行哈希处理哈希算法:
let x = Blakey().createKeyPair(withHexData: fakeHex, andIndexData: data)
^这也会返回一些NSData
- (NSData *)createKeyPairWithHexData:(NSData *)data andIndexData:(NSData *)indexData;
{
struct blake2b_state__ state;
blake2b_init(&state, 32);
blake2b_update(&state, data.bytes, data.length); // data.length is 128
blake2b_update(&state, indexData.bytes, indexData.length); // indexData.length is 32
void *foo = malloc(32);
blake2b_final(&state, foo, 32);
NSData *accountKey = [NSData dataWithBytes:foo length:32];
free(foo);
return accountKey;
}
此代码的模型取决于Python中的配套实现中发生的事情:
def seed_account(seed, index):
# (seed here is our hex string, index is 1)
# Given an account seed and index #, provide the account private and public keys
h = blake2b(digest_size=32)
seed_data = BitArray(hex=seed)
seed_index = BitArray(int=index,length=32)
h.update(seed_data.bytes)
h.update(seed_index.bytes)
return account_key = BitArray(h.digest())
最后,我从NSData
函数中取出Blakey
并尝试将其转换为字符串:
NSString(data: x!, encoding: String.Encoding.utf8.rawValue)
String(data: x!, encoding: .utf8)
两者都打印nil
。
我在这个过程中做错了什么,不确定是什么。如果有什么突出的话,会喜欢一些帮助。
谢谢!
答案 0 :(得分:0)
在每个字符后附加终结符,但是您可能希望将其附加到字符串的末尾(这一个data.append(terminator, length: 1)
)