Шифрование и дешифрование TweetNaCl.js не работает должным образом

Мне нужно зашифровать сообщение открытым ключом пользователя. Пользователь получит сообщение и должен будет расшифровать его с помощью закрытого ключа. Я пытаюсь всеми способами, но не могу понять, что я делаю не так. Я создал скрипт узла, который работает автономно, установив только две необходимые зависимости (tweetnacl иtwitternacl-utils). Судя по всему, сообщение зашифровано правильно, но когда я пытаюсь его расшифровать, константа decrypted_message получает значение null.

Я уже использую обе библиотеки для подписи сообщений, и часть подписи работает нормально, поэтому я не собираюсь переключать библиотеки. Можете ли вы сказать мне, что я делаю неправильно? Это код, который вы можете запустить с помощью узла js

      const nacl = require('tweetnacl');
const naclUtil = require('tweetnacl-util');

// Getting keypair from a key
const x25519_from_key = (key) => {
    console.log(key.length)
    const boxKeyPair = nacl.box.keyPair.fromSecretKey(key);
    const secretKey = boxKeyPair.secretKey;
    const publicKey = boxKeyPair.publicKey;

    const result = {
        publicKey:
        {
            uint: publicKey,
            base64: naclUtil.encodeBase64(publicKey)
        },
        secretKey: {
            uint: secretKey,
            base64: naclUtil.encodeBase64(secretKey)
        }
    }

    return result;
};

// Encrypt a message using the public key
const encryptMessage = (message, x25519_public_uint) => {

    const nonce = nacl.randomBytes(nacl.box.nonceLength);
    const message_decoded = naclUtil.decodeUTF8(message);

    const encrypted_message = nacl.box.after(
        message_decoded,
        nonce,
        x25519_public_uint
    );

    return {
        nonce_base64: naclUtil.encodeBase64(nonce),
        encrypted_message_encoded: naclUtil.encodeBase64(encrypted_message),
    };
};

// Decrypt message using the secret key
const decryptMessage = (encrypted_message, nonce_base64, x25519_secret_key) => {

  
    const nonce = naclUtil.decodeBase64(nonce_base64);
    const encrypted_message_decoded = naclUtil.decodeBase64(encrypted_message);
  
    const decrypted_message = nacl.box.open.after(
      encrypted_message_decoded,
      nonce,
      x25519_secret_key
    );


    return naclUtil.encodeUTF8(decrypted_message);
  };
  

// Generating keypair x25519
const keyPair = x25519_from_key(nacl.randomBytes(nacl.box.secretKeyLength));

// Encrypt with publicKey
const message = 'This is a plain message';
const encrypted = encryptMessage(message, keyPair.publicKey.uint);


console.log('Original message:', message);

// Show encrypted message
console.log('Encrypted message:', encrypted.encrypted_message_encoded);
console.log('Nonce:', encrypted.nonce_base64);


// Show decrypted message
const decrypted = decryptMessage(encrypted.encrypted_message_encoded, encrypted.nonce_base64, keyPair.secretKey.uint);
console.log('Decrypted message:', decrypted);

1 ответ

При шифровании или дешифровании необходимо использовать собственный секретный ключ и открытый ключ другой стороны. Это показано в следующем рабочем коде, который по существу основан на вашем коде:

Основное отличие вашего кода заключается в том, что опубликованный здесь код используетnacl.box()(вместоnacl.box.after()) для шифрования иnacl.box.open()(вместоnacl.box.open.after()) для расшифровки.

NaCl/Libsodium позволяет определять общий секрет (методы) и шифрование/дешифрование (методы) отдельно , см . здесь в документации TweetNaCl или более подробно здесь, в документации Libsodium.

В вашем коде методы применяются неправильно (after()требуется общий секрет, который, в свою очередь, должен быть определенbefore()методы).

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