我读了一篇文章:node-js-and-python 之间的加密数据。
我需要实现反向路径,在 python 中创建加密并在节点中解码。
在 Python 方面我做了:
from nacl.secret import SecretBox from base64 import b64encode import nacl.secret import nacl.utils secret_key = bytes('_THIS_IS_MY_32_CHARS_SECRET_KEY_', 'utf8') message = bytes('Some Italians hate wine','utf-8') nonce = nacl.utils.random(24) box = SecretBox(secret_key) encrypted = box.encrypt(message,nonce) ctext = encrypted.ciphertext print(ctext) plaintext = box.decrypt(encrypted) print(plaintext.decode('utf-8')) print(b64encode(nonce)) print(b64encode(encrypted
在节点中:
const nacl = require('tweetnacl'); const utils = require('tweetnacl-util'); const secretKey = Buffer.from('_THIS_IS_MY_32_CHARS_SECRET_KEY_', 'utf8'); const nonce = utils.decodeBase64('KRmiqOFUN1HklmPZgbd0BINNDDCu3dyB'); const encryptedMessage = utils.decodeBase64('KRmiqOFUN1HklmPZgbd0BINNDDCu3dyB/s4tdTjcw65K6Lr5N797+7zoLm9WClCXIDNLAqrNGwF2MybtJu+U'); const originalMessage = nacl.secretbox.open( encryptedMessage, nonce, secretKey );
结果为 NULL。
进行这种整合的正确方法是什么?
encrypted`*PyNaCl*[`SecretBox.encrypt()`](https://pynacl.readthedocs.io/en/v0.2.1/secret/#nacl.secret.SecretBox.encrypt)代码中返回的是一个对象(子类),其中包含连接的(24 个字节)随机数和密文。请注意,还具有属性和。[`EncryptedMessage`](https://pynacl.readthedocs.io/en/v0.2.1/public/#nacl.utils.EncryptedMessage)`bytes``EncryptedMessage``nonce``ciphertext
由于TweetNaCl代码使用连接(Base64 编码)数据,因此必须先分离这些数据(在 Base64 解码之后),并且必须在 中分别处理 nonce 和密文nacl.secretbox.open()。请注意,TweetNaCl使用 TypedArrays。要转换为 Utf8 或 Base64,可以使用tweetnacl-util中的函数:
nacl.secretbox.open()
const secretKey = nacl.util.decodeUTF8('_THIS_IS_MY_32_CHARS_SECRET_KEY_'); const encryptedMessage = nacl.util.decodeBase64('KRmiqOFUN1HklmPZgbd0BINNDDCu3dyB/s4tdTjcw65K6Lr5N797+7zoLm9WClCXIDNLAqrNGwF2MybtJu+U'); // Separate nonce and ciphertext const nonce = encryptedMessage.slice(0, 24) const ciphertext = encryptedMessage.slice(24) // Decrypt const originalMessage = nacl.secretbox.open(ciphertext, nonce, secretKey); const decryptedText = nacl.util.encodeUTF8(originalMessage); console.log(decryptedText); // Some Italians hate wine <script src="https://cdn.jsdelivr.net/npm/tweetnacl-util@0.15.1/nacl-util.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/tweetnacl@1.0.3/nacl.min.js"></script>
请注意,此代码段是纯 JavaScript。在您的 NodeJS 环境中,您必须将其替换nacl.util为utils。
nacl.util
utils