#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[], длина которого равна длине исходного открытого текста.