Swift Sodium - 匿名加密(密封盒)

时间:2017-03-01 04:57:12

标签: swift libsodium

我正在尝试使用swift sodium使用给定的公钥来加密值。 但是,加密值与服务器端生成的值不同。 我不确定这段编码是否正确。 这些步骤类似于在java中完成的步骤。

假设公钥是base64字符串格式。

爪哇:

String pubKey = "w6mjd11n9w9ncKfcuR888Ygi02ou+46ocIajlcUEmQ="; 
String secret = "hithere"
byte[] pubKeyBytes = Base64.decode(pubKey,0);
SealedBox sealedDeal = new SealedBox(pubKeyBytes);
byte[] c = sealedDeal.encrypt(secret.getBytes());
String ciphertext = Base64.encodeToString(c, 0);  

夫特:

let pubKey = "w6mjd11n9w9ncKfcuR888Ygi02ou+46ocIajlcUEmQ="
let dataDecoded:NSData = NSData(base64Encoded: pubKey, options: NSData.Base64DecodingOptions(rawValue: 0))!
let secret = "hithere".toData()!
let c : Data = sodium.box.seal(message: secret, recipientPublicKey: dataDecoded as Box.PublicKey)!
let ciphertext = c.base64EncodedString(options: .init(rawValue: 0))

请告诉我快速等效编码的错误。 非常感谢。

2 个答案:

答案 0 :(得分:0)

加密值应该是不同的,因此由等效明文产生的密文是无法区分的(参见Ciphertext indistinguishability)。

答案 1 :(得分:0)

每次加密邮件时,

sodium.box.seal在内部生成新的nonce,@ Max是正确的,这是正常的行为

您可以使用Detached mode来提供相同的随机数,但这是一个非常糟糕的主意

在您的示例中,您使用了Anonymous Encryption我建议您查看Authenticated Encryption