2016-10-11 3 views
0

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

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 байт [], а на сервере Javascript использует UInt8Array [], может кто-то помочь мне в предоставлении Client- сервер.

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

ответ

0

После еще проб и ошибок я выяснил, что класс Ящик по умолчанию в не калий работать с яваскрипта версии sodium.crypto_box_easy ...

Клонирование калием проект для вашей среды и добавьте следующий код к классу 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) представляет собой новые байты [] объект с длиной = crypto_box_curve25519xsalsa20poly1305_MACBYTES (16) + открытый текст длиной. Открытый текст в приведенном выше коде (crypto_box_open_easy) - это новый объект byte [], длина которого составляет длина исходного открытого текста.

Смежные вопросы