我试着找出在Objective-C中使用NaCl库的正确方法。密钥生成似乎很容易:
- (void) generateKeypair {
unsigned char pk[crypto_box_PUBLICKEYBYTES];
unsigned char sk[crypto_box_SECRETKEYBYTES];
sodium_init();
crypto_box_keypair(pk,sk);
self.publicKey = [NSData dataWithBytes:(const void *)pk
length:sizeof(unsigned char)*crypto_box_PUBLICKEYBYTES];
self.sekretKey = [NSData dataWithBytes:(const void *)sk
length:sizeof(unsigned char)*crypto_box_PUBLICKEYBYTES];
}
这很容易。但是使用crypto_box(c,m,mlen,n,pk,sk)
函数,我会混淆填充,ZEROBYTES
以及如何管理对象所有权。如何为crypto_box(c,m,mlen,n,pk,sk)
和朋友构建一个简单的包装器?
答案 0 :(得分:0)
一个选项是Sodium-Objc。这些绑定尚未更新一段时间,但它们仍然非常好,并且在Objective-C中使用crypto_box
非常容易。
另一个选项是Swift-Sodium,更完整。它是用Swift编写的,但是从Swift调用Objective-C应该很容易。
但是如果你想要低级别并直接调用C函数,你实际上不必担心填充。只需使用easy interface:crypto_box_easy()
和crypto_box_open_easy()
。
crypto_box_easy()
将验证者(crypto_box_MACBYTES
字节长)紧跟加密消息。无需额外填充。并且crypto_box_open_easy()
解密消息而不需要额外的填充或不得不移动字节。
答案 1 :(得分:-1)
我在这个lib中编写了crypto_secretbox,并按文档中的定义执行填充:https://github.com/gabriel/NACL/blob/master/NACL/NASecretBox.m
如果填充设置与crypto_box相同,则可能会有所帮助。