用tweetnacl(javascript)加密,用python解密

2024-09-29 23:24:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我更愿意在python上使用与tweet完全相同的nacl,但该项目表示它很旧,不推荐使用。他们推荐的替代品是https://github.com/pyca/pynacl:但这一个是libnail而不是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)

(工作)tweetjavascript解密代码是:

  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和Javascript生成的加密解密到python中


Tags: infromimportboxtweetnoncepynaclnacl
1条回答
网友
1楼 · 发布于 2024-09-29 23:24:22

SecretBox因此,您发布的PyNaCl示例适用于对称加密,shere。您可以找到使用PyNaClhere加密的公钥文档和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

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

相关问题 更多 >

    热门问题