2016-10-11 1 views
0

Ich bin ein Neuling, der die NaCl-Wrapper ausprobiert. Ich benutze Kalium auf meinem Server und libsodium.js auf meinem Client-Ende an jedem Ende, das sie arbeiten, aber wenn ich versuche, authentifizierte Verschlüsselung zu verwenden, um zwischen den 2 Enden zu kommunizieren, versagt der verschlüsselte Text Verifikation. Verschlüsselung auf dem Client erfolgt durch:Verwendung von Kalium auf dem Server und libsodium.js auf dem Client

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

die Nonce, serverPublicKeyBytes und clientPrivateKey werden als Base64-Strings an den Server übertragen.

Im Server werden die Daten entschlüsselt:

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; 
    } 

Im Server verwendet der Wrapper das java byte [], während auf dem Server die Javascript UInt8Array verwendet [], kann mir jemand in unterstützen client- ermöglichen Serverkommunikation.

Vielen Dank im Voraus

Antwort

0

Nach mehr Versuch und Irrtum fand ich, dass die Standard-Box-Klasse in kalium out nicht mit der JavaScript-Version von sodium.crypto_box_easy ...

Clont das kalium Projekt Ihre Umgebung funktioniert und fügen Sie den folgenden Code in die Klasse 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); 

und dann diesen Code rufen Sie entweder in der Box-Klasse oder erstellen Sie Ihre eigene Klasse:

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."); 

Der Chiffretext in dem obigen Code (crypto_box_easy) ist ein neues byte [] Objekt mit die Länge = crypto_box_curve25519xsalsa20poly1305_MACBYTES (16) + Klartext Länge. Der Klartext im obigen Code (crypto_box_open_easy) ist ein neues Byte [] -Objekt, dessen Länge Länge des ursprünglichen Klartextes ist.

Verwandte Themen