3

我使用 CryptoKit 的 ChaChaPoly 快速加密了一个字符串:

// Swift

let txt: Data? = "secret message".data(using: .utf8)
let key = SymmetricKey(data: SHA256.hash(data: "password".data(using: .utf8)!))

let sealedBoxData = try! ChaChaPoly.seal(txt!, using: key).combined

//return F6u88lkmmz8RrjvfJ22r4vrKmWuY8a2DNpjUKZVUi9Wp9QjZVgheBihn
sealedBoxData.base64EncodedString() 

//return F6u88lkmmz8Rrjvf
sealedBox.nonce.withUnsafeBytes { return Data(Array($0)).base64EncodedString() } 

//return J22r4vrKmWuY8a2DNpg=
sealedBox.ciphertext.withUnsafeBytes { return Data(Array($0)).base64EncodedString() }

//return 1CmVVIvVqfUI2VYIXgYoZw==
sealedBox.tag.withUnsafeBytes { return Data(Array($0)).base64EncodedString() } 

现在我无法将加密和解密功能移植到 Javascript。

// Swift

// decrypting.. 
let ss = Data(base64Encoded: sealedBoxData.base64EncodedString(), options: .ignoreUnknownCharacters)

// how to extract tag and cipher in javascript like this?
let box = try! ChaChaPoly.SealedBox(combined: ss!)
box.tag.withUnsafeBytes { return Data(Array($0)).base64EncodedString() } 

let result = try! ChaChaPoly.open(box, using: key)

// return "secret message"
let txt = String(data: result, encoding: String.Encoding.utf8)


基于sealedBoxData 的base64 字符串,我能够提取IV(随机数)和部分密文。

// React JS

function decrypt(b64SealedBoxData, key) {

  // able to parse correct value
  var iv = b64SealedBoxData.substring(0, 16)

  // last few characters parsed is incorrect
  var cipher = b64SealedBoxData.substring(16) 

  // unable to derive from sealboxdata string
  var tag = null 
}

从 CryptoKit 获得的 base64 密文sealedBox.ciphertext给了我J22r4vrKmWuY8a2DNpg=,但 sealBoxData base64 字符串只包含J22r4vrKmWuY8a2DNp. 我不知道如何sealedBox.tag转换为最终的 sealBox b64 字符串。

如何在 Javascript 中提取正确的密文和标签?如何以 swift 的 chachapoly 函数能够解密的方式使用 JS 加密文本?


我尝试使用这个JS 库来加密和解密 chacha20poly1305 密码,但我无法从中得到一个工作示例。:(

这个stackoverflow 问题与我面临的问题非常相似,除了我使用的是 chachaPoly 和 JS。

感谢您的时间。:)

4

0 回答 0