Зашифровать в tweet-nacl (javascript) и расшифровать в python

Этот вопрос противоположен существующему здесь:зашифровать в python 3.7 и декодировать в NODEJS 12 .

Я бы предпочел использовать точный эквивалент tweet-nacl на python, но в этом проекте говорится, что он старый и не рекомендуется 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)

(Рабочий) код расшифровки javascript tweet-nacl :

        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?

1 ответ

SecretBoxи, таким образом, опубликованный вами пример PyNaCl предназначен для симметричного шифрования, s. здесь . Вы можете найти документацию по шифрованию с открытым ключом с помощью PyNaCl здесь и для PyNaCl в целом здесь .

В следующем примере открытый текст зашифрован с помощью 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 является оболочкой Libsodium для Python (см. Здесь и здесь ), но сам Libsodium является портом NaCl (см. Здесь ), как и TweetNacl.js для JavaScript (здесь ).
Итак, в конечном итоге и TweetNaCl, и PyNaCl основаны на NaCl, исходной библиотеке, реализованной Бернштейном и др. , с. здесь , и поэтому они совместимы (за исключением, возможно, нескольких незначительных синтаксических различий).

Другие вопросы по тегам