TripleDes-CBC Nodejs Umsetzung throuble

muss ich replizieren, in Nodejs die Ergebnisse der 3DS-CBC verschlüsseln, in http://tripledes.online-domain-tools.com/.

Dies ist mein code:

const crypto = require('crypto');
const cipher = crypto.createCipher('des-ede3-cbc', key);
password = Buffer.from('MYPASS', 'utf8');

let encrypted = [cipher.update(password)];
encrypted.push(cipher.final());
encrypted = Buffer.concat(encryptedArr);
console.log(encrypted.toString('hex'));

Ergebnis tripledes.online-domain-tools.com ist:

TripleDes-CBC Nodejs Umsetzung throuble

Beachten Sie, dass das Ergebnis sollte 59 30 20 02 a5 8c dd 5e, aber mein code gibt mir 33 97 d8 b0 e3 00 d1 53.

Was bin ich?

Edit2:
Folgende Vorschläge, änderte ich meinen code (Auch Hinzugefügt einige Tests gemacht mit der Anleitung von NIST-Publikation):

const crypto = require('crypto');
function encrypt (inputkey, keyformat, password, passwordformat) {
    let shortkey = Buffer.from(inputkey, keyformat);
    let key = Buffer.alloc(24);
    key.fill('\0');
    for (i = 0; i < shortkey.length; i++) {
        key[i] = shortkey[i];
    }
    let IV = Buffer.alloc(8);
    const cipher = crypto.createCipheriv('des-ede3-cbc', key, IV);
    password = Buffer.from(password, passwordformat);

    let encryptedArr = [cipher.update(password)];
    encryptedArr.push(cipher.final());
    encrypted = Buffer.concat(encryptedArr);
    return encrypted;
}

console.log(encrypt('1046913489980131','hex','0000000000000000','hex')); //works 
console.log(encrypt('1007103489988020','hex','0000000000000000','hex')); //works
console.log(encrypt('10071034C8980120','hex','0000000000000000','hex')); //works
console.log(encrypt('1046103489988020','hex','0000000000000000','hex')); //works
console.log(encrypt('MYKEY','utf8','MYPASS','utf8')); //fails

Jeder Permutation Operation Known Answer Test des NIST gut funktioniert, aber einige andere Beispiele (einschließlich des Bildes) einfach fehl

Dem Grund Teste ich mit diesem schattigen Seite ist da mein service-provider ist die Nutzung als Referenz.

  • Der Initialisierungsvektor werden könnte, schuldig.
  • nur meine wilde Vermutung.. die Webseite besagt, dass es verlängert die Schlüssel entsprechend der erforderlichen Länge und Verwendungen, von (Teil -) sha1-Hash des Schlüssel als IV. dein code tut das nicht
  • Habe ich übersehen, ich werde es überprüfen
  • Mit einem IV von 0 let IV = Buffer.alloc(16);, das Ergebnis ist das gleiche, es scheint, dass crypto arbeitet mit einem IV von 0, wenn keines angegeben
  • Ihre nicht mit einem IV in Ihrem Beispiel verwenden, müssen Sie die Verschlüsselung.createCipheriv, um eine IV
  • Die Verschlüsselung geschieht nicht mit Passwörtern, sondern es geschieht mit Tasten. Triple-DES wird normalerweise implementiert, mit 2 Schlüsseln von 56-bits jedes (112 bits insgesamt). Finden Sie heraus, was das online-tool ist zu tun mit der „- Taste“ Eingabe zu machen, die richtige Größe. Oder besser, versuchen Sie, Ihre Implementierung entsprechen die NIST-test-Vektoren eher als passend zu dieser fragwürdigen online-tool.
  • Du hast Recht @FrançoisP., Ich aktualisierte die Frage
  • Solange Sie nicht wissen, die genaue schlüsselableitung verwendet, würde ich einfach ignorieren den Unterschied zwischen online-tool und Ihre Umsetzung. Ich habe einmal versucht etwa 10 verschiedene Varianten-key-Ableitung von einem dieser tools und ich noch nicht. Für alles, was Sie wissen, es erweitert einfach den Schlüssel mit dem, was ist im Speicher, nachdem Sie die passphrase (wie das ist, was OpenSSL und einige andere C-Bibliotheken ohne Speicherschutz tun).
  • hi @AlexisRodríguez haben Sie überprüft, die Lösung, die ich Euch gab !!!



One Reply
  1. 2

    Dieser Website machte mir einige Probleme für einige Zeit , auch hier ist die Implementierung intern verwendet wird, um erweitern Sie die-Taste, um eine 24 bytes !
    ich werde reden, tripledes, aber ich denke, das gilt für andere algorithmen verwendet werden, die von dieser Website

    Schritt 1

    zuerst überprüft wird, wenn der Schlüssel eingegeben wird, ist die Länge, dass es erwartet, (Sie finden eine Tabelle am unteren Rand dieser Seite erzählen, die Länge der Schlüssel, die für jede Verschlüsselungs-Algorithmus)
    wenn es nicht es wird komplett mit 0x00 bytes wie diese:

    var key;//is a string containing the bytes wich will be used to encrypt  the msg
    var nullByte = 0x00;
    var padding_needed;
    for (var i=key.length ;i < expected_key_length ; ++) 
    {padding_needed =padding_needed + nullBute.tostring(16);  }
    key = key + padding_needed

    so zum Beispiel die Länge, dass es erwartet, dass für 3DES ist 24 bytes ; wenn Sie passieren, um in nur 15 bytes, wie dies (112233445566778899aabbccddeeff) es wird sein wie wenn Sie eingetragen (112233445566778899aabbccddeeff00)

    step2

    im Fall des tripledes-Algorithmus zu erweitern, die 16 Byte 24 Byte Schlüssel (der Schlüssel der Länge von Algorithmus) diese Website hat eine einfache Methode, das zu tun
    es kopiert die ersten 8 bytes und hängen Sie an das Ende des Schlüssels, wie dies

    key =key + key.substring(0,8);

    … und das ist der Schlüssel, wird die 3DES-Verschlüsselung-Funktion arbeiten mit

    diese einfache approache nicht von openssl zum Beispiel open ssl verwendet die ersten 8 bytes der MD5-der Schlüssel ,und fügen Sie diese in die 16 bytes der original-Schlüssel, um die 24 Byte Schlüssel, der erforderlich ist, 3DES, wie diese

    key = key + (MD5(key)).substring(0,8);

    Zusammenfassung

    in diesem Werkzeug, wenn Sie den Schlüssel eingeben 112233445566778899AABBCCDDEEFF ist das gleiche, als wenn Sie eingegeben 112233445566778899AABBCCDDEEFF00 – und dasselbe, als wenn Sie eingegeben 112233445566778899AABBCCDDEEFF001122334455667788 so um Ihr problem zu lösen Sie sollten geben Sie Ihre Funktion werden die kompletten 24 Byte Schlüssel, den Sie gab zu, dass die Website und Sie werden sicherlich erhalten die gleichen Ergebnisse, weil nodejs ist wahrscheinlich das gleiche tun wie openssl nicht erweitern Sie die-Taste(verwendet, md5)

    PS
    wenn Sie mit den cbc-Modus, die Ihren Fall zu versuchen, um festzulegen, der IV werden 8 Byte von \x00, wie dieses „0000000000000000“
    die Ergebnisse werden die gleichen sein !!

    hier ist eine funktionierende Implementierung des Codes können Sie überprüfen, in die Website

        const crypto = require('crypto');
    function encrypt (inputkey, keyformat, password, passwordformat) {
        let shortkey = Buffer.from(inputkey, keyformat);
        let key = Buffer.alloc(24);
        key.fill('\0');
        for (i = 0; i < shortkey.length; i++) {
            key[i] = shortkey[i];
        }
        let IV = Buffer.alloc(8);
    
    
        var expansionStart = shortkey.length>16?shortkey.length:16;
        for (i=expansionStart;i<24;i++){
            key[i]=key[i-expansionStart];
        } 
        console.log(key);
        const cipher = crypto.createCipheriv('des-ede3-cbc', key, IV);
        password = Buffer.from(password, passwordformat);
    
        let encryptedArr = [cipher.update(password)];
        encryptedArr.push(cipher.final());
        encrypted = Buffer.concat(encryptedArr);
        return encrypted;
        }
        var enc = encrypt("112233445566778899AABBCCDDEEFF","hex","password","utf8");
        console.log(enc);

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.