【问题标题】:Encrypt in tweet-nacl (javascript) and decrypt in python在 tweet-nacl (javascript) 中加密并在 python 中解密
【发布时间】:2021-11-13 08:04:02
【问题描述】:

这个问题与这里的现有问题相反: Encrypt in python 3.7 and decode in NODEJS 12.

我更愿意在 python 上使用与 tweet-nacl 完全相同的东西,但该项目说它很旧,不推荐使用 https://github.com/warner/python-tweetnacl 。他们推荐的替代品是 https://github.com/pyca/pynacl :但它是 libsodium 的接口而不是 tweet-nacl 并且没有关于如何实现解密的明确文档。

这里是JS加密:

    let msgArr = naclutil.decodeUTF8(jprint(msg))
    let nonce = nacl.randomBytes(nacl.box.nonceLength)
    let keyPair = this.genKeyPair()
    let encrypted = nacl.box(
      msgArr,
      nonce,
      naclutil.decodeBase64(pubKey),
      naclutil.decodeBase64(keyPair.privkey)
    )
    let nonce64 = naclutil.encodeBase64(nonce)
    let encrypted64 = naclutil.encodeBase64(encrypted)

(工作的)tweet-nacl javascript 解密代码是:

  const decryptedMessage = nacl.box.open(
    naclutil.decodeBase64(payload.encrypted.encrypted),
    naclutil.decodeBase64(payload.encrypted.nonce),
    naclutil.decodeBase64(payload.encrypted.ephemPubKey),
    naclutil.decodeBase64(privKey)
  )
  const decodedMessage = naclutil.encodeUTF8(decryptedMessage)

我的问题是pynacl 他们没有显示任何使用ephemPubKey 进行解密的示例。我能找到的例子如下:

        import binascii
        from nacl.encoding import HexEncoder
        from nacl.exceptions import CryptoError
        from nacl.secret import Aead, SecretBox
        benc=       binascii.unhexlify(encrypted)
        bnonce =    binascii.unhexlify(nonce)
        box = SecretBox(privKey, encoder=HexEncoder)
        decrypted = box.decrypt(benc, bnonce, encoder=HexEncoder),

有没有人能够将tweet-nacl Javascript生成的加密成功解密成python?

【问题讨论】:

    标签: python encryption pynacl tweet-nacl


    【解决方案1】:

    SecretBox,因此您发布的 PyNaCl 示例用于 对称 加密,s。 here。您可以找到使用 PyNaCl here 和一般 PyNaCl here 进行 公钥 加密的文档。

    在以下示例中,明文使用 TweetNaCl.js 加密并使用 PyNaCl 解密。

    JavaScript 端 - 使用 TweetNaCl.js 加密:
    var secretKey_js  = nacl.util.decodeBase64("FJGsHP0dMkDNkpAkT4hZrcbv27L8XNO8ymhLxpPpDkE=");
    var publicKey_py = nacl.util.decodeBase64("0EyrzGW6qn0EGEV0Cx2Z7tQeln6FdwZVINz0FezlvTM=");
    var nonce = nacl.randomBytes(24)
    var msgStr = "The quick brown fox jumps over the lazy dog";
    var message = nacl.util.decodeUTF8(msgStr);
    var box_js = nacl.box(message, nonce, publicKey_py, secretKey_js)
    console.log(nacl.util.encodeBase64(nonce))  // 2e8WuEr0+5nc14VBxQrOl4ob6guOTySr
    console.log(nacl.util.encodeBase64(box_js)) // eJ8sO0mFNaaWLeXVcNNpw0PurwfINp/BlnErSzOnxXJ5zqu3wLrW4fHIa4kIAxFkuMVJaf0AR4pYon0=
    

    代码与您的代码基本相同,不同之处在于密钥不是生成而是导入。

    Python 端 - 使用 PyNaCl 解密:
    import base64
    from nacl.public import PrivateKey, PublicKey, Box
    from nacl.encoding import Base64Encoder
    
    secretKeyB64_py  = "XVdFnozXd+7xm6MVazPemgSq6un+fGpDvwgxo9UbsdM=";
    publicKeyB64_js = "ixxgLis2RzqMWys76HuoH7TwrwBbXoDrwl3jGsRysRI=";
    
    secretKey_py = PrivateKey(secretKeyB64_py, encoder=Base64Encoder)
    publicKey_js = PublicKey(publicKeyB64_js, encoder=Base64Encoder)
    
    nonce = base64.b64decode("2e8WuEr0+5nc14VBxQrOl4ob6guOTySr");
    box_js = base64.b64decode("eJ8sO0mFNaaWLeXVcNNpw0PurwfINp/BlnErSzOnxXJ5zqu3wLrW4fHIa4kIAxFkuMVJaf0AR4pYon0=");
    
    box_py = Box(secretKey_py, publicKey_js)
    data = box_py.decrypt(nonce + box_js)
    
    print(data) # b'The quick brown fox jumps over the lazy dog'
    

    在上面的示例中,密钥已被导入。如果需要生成密钥对,则使用 PyNaCl 完成,如下所示:

    from nacl.public import PrivateKey
    
    secretKeyNew = PrivateKey.generate()
    publicKeyNew = secretKeyNew.public_key
    

    关于兼容性:
    TweetNaCl.js 和 PyNaCl 是兼容的。正如你所描述的,虽然 PyNaCl 是 Python 的 Libsodium(s.herehere)的包装器,但 Libsodium 本身是 NaCl 的一个端口(s.here),TweetNacl.js for JavaScript 也是如此(@ 987654327@).
    所以最终,TweetNaCl 和 PyNaCl 都基于 NaCl,这是 Bernstein 等人实现的原始库。,s。 here,因此是兼容的(可能除了一些小的语法差异)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多