Использование Kalium на сервере и libsodium.js на клиенте

#javascript #java #encryption #libsodium

#javascript #java #шифрование #libsodium

Вопрос:

Я новичок, пробующий обертки NaCl. Я использую Kalium на своем сервере и libsodium.js на моем клиентском конце на каждом конце они работают, но когда я пытаюсь использовать аутентифицированное шифрование для связи между 2 концами, зашифрованный текст не проходит проверку. Шифрование на клиенте выполняется:

 var nonce=sodium.crypto_generichash(sodium.crypto_box_NONCEBYTES, dataObj.extensionId);
var message="test";
var encryptedString = sodium.crypto_box_easy(message, nonce, serverPublicKeyBytes, clientPrivateKey);
  

одноразовый номер, serverPublicKeyBytes и clientPrivateKey передаются на сервер в виде строк Base64.

На сервере данные расшифровываются с помощью:

 public byte[] decrypt( byte[] publicKey, byte[] privateKey, byte[] nonce,
            byte[] message) throws Exception {
        Box box = new Box(publicKey, privateKey);
        byte[] output= box.decrypt(nonce, message);

        return output;
    }
  

На сервере оболочка использует java byte[], а на сервере javascript использует Uint8Array[], может кто-нибудь помочь мне включить связь между клиентом и сервером.

Заранее спасибо

Ответ №1:

После дополнительных проб и ошибок я обнаружил, что класс Box по умолчанию в kalium не работает с версией javascript sodium.crypto_box_easy

Клонируйте проект kalium в свою среду и добавьте следующий код в класс NaCl:

 public int crypto_box_easy(@Out byte[] ciphertext, @In byte[] plaintext, @In @u_int64_t int plaintextLength,
                @In byte[] nonce, @In byte[] receiverPublicKey, @In byte[] senderPrivateKey);

        public int crypto_box_open_easy(@Out byte[] plaintext, @In byte[] ciphertext,
                @In @u_int64_t int ciphertextLength, @In byte[] nonce, @In byte[] senderPublicKey,
                @In byte[] receiverPrivateKey);
  

А затем вызовите этот код либо в классе Box, либо создайте свой собственный класс :

 isValid(sodium().crypto_box_easy(ciphertext, plaintext, plaintext.length, nonce, receiverPublicKey,
                senderPrivateKey), "Encryption failed");
isValid(sodium().crypto_box_open_easy(plaintext, ciphertext, ciphertext.length, nonce, senderPublicKey,
            receiverPrivateKey), "Decryption failed. Ciphertext failed verification.");
  

Зашифрованный текст в приведенном выше коде (crypto_box_easy) представляет собой новый объект byte[] с длиной = crypto_box_curve25519xsalsa20poly1305_MACBYTES(16) длина открытого текста.
Открытый текст в приведенном выше коде (crypto_box_open_easy) представляет собой новый объект byte[], длина которого равна длине исходного открытого текста.