小能豆

在 python 3.7 中加密并在 NODEJS 12 中解码

py

我读了一篇文章: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。

进行这种整合的正确方法是什么?


阅读 20

收藏
2025-01-03

共1个答案

小能豆

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中的函数:

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.utilutils

2025-01-03