2017-08-12 5 views
0

Ich benutze CryptoJS, um manuell eine Zeichenkette mit einem bereitgestellten Satz von Werten zu entschlüsseln. Das Geheimnis wird bereitgestellt und dann wird ein SHA256 davon genommen. Der Nachrichten- und Initialisierungsvektor sind Basis-64-codiert. Hier ist, was ich versuche, aber jedes Mal, wenn ich es leite, ändert sich die Ausgabe - wie kann das sein ?! Ich bin am Ende meiner Weisheit ...CryptoJS entschlüsselt jedes Mal

// Key and take the hash of it 
var secretKey = 'TESTING123Secret_Key'; 
var secretKeyHash = CryptoJS.SHA256(secretKey).toString(CryptoJS.enc.Hex); 

// Base 64 encoded values 
var accountNumberBase64 = 'nxjYfo4Stw63YBEcnjo3oQ=='; 
var initializationVectorBase64 = 'HnNcvu9AP9yl09APWkWnDQ=='; 

// decode the values provided above 
var accountNumberEncrypt = atob(accountNumberBase64); 
var initializationVector = atob(initializationVectorBase64); 

// Use crypto to decrypt 
var decrypted = CryptoJS.AES.decrypt(
    { 
     ciphertext: accountNumberEncrypt, 
     salt: '' 
    }, 
    secretKeyHash, 
    { 
     mode: CryptoJS.mode.CBC, 
     padding: CryptoJS.pad.NoPadding, 
     iv: initializationVector, 
     salt: '' 
    } 
); 
console.log(' decrypted, by hand: ' + decrypted.toString(CryptoJS.enc.Hex)); 

die letzte Zeile ändert sich bei jedem dieser ausgeführt wird (führen Sie es auf Seite Last) - gleiche Werte zur Verfügung gestellt jedes Mal, Ausgabe ist anders.

Wie wird es funktionieren sollte:

mit Ihrem Code
Decryption Instructions: 
1. A static, secret key will be shared which will be used for decryption (Secret Key TBD). 
    a. HASH the secret key with SHA256, encode it to Hex and use the first 32 characters. This will be used as the KEY when decrypting. 
2. Two pieces of information will be sent via the POST method 
    a. Parameter “AN”: A Base64 Encoded, AES-256-CBC Encrypted string which will represent the Account Number when decrypted 
    b. Parameter “IV”: A Base64 Encoded initialization vector (IV) string which will be used in decrypting the Account Number string 
3. Base64 Decode both parameters 
4. Using the AES-256-CBC method, decrypt the encrypted string (which was base64 decoded as part of Step #3) with the initialization vector decoded in Step #3 and the hash created in Step #1a 
5. The decryption should then provide you the account number. 

Java code

+1

Es gibt einige Probleme mit Ihrem Code wie den Schlüssel als String übergeben, anstatt mit 'WordArray':' var secretKeyHash = CryptoJS.SHA256 (SecretKey) ; ', aber das und die anderen Probleme erzeugen keine vernünftige Entschlüsselung (zumindest für mich): 6497b502a3b2558263d2a9cd599d6bbe. Können Sie den Code zeigen, der den IV und den Geheimtext produziert hat? –

+1

Sie sollten niemals eine einfache Hash-Funktion verwenden, um die Passwörter Ihres Benutzers zu schützen. Sie müssen ein starkes Hashing-Schema wie PBKDF2, bcrypt, scrypt und Argon2 verwenden. Achten Sie darauf, einen hohen Kostenfaktor/Iterationszähler zu verwenden. Es ist üblich, die Kosten so zu wählen, dass eine einzelne Iteration mindestens 100 ms dauert. Weitere Informationen: [Wie sichere Kennwörter sicher hashed?] (Https://security.stackexchange.com/q/211/45523) –

+0

@ArtjomB. Danke für das Kommentieren, dies war eine Anfrage von einem Freund für einige Arbeitshilfen und ich kenne die Besonderheiten der eigentlichen Verschlüsselung nicht. Ich habe aktualisiert, was ihnen gesagt wurde, dass die Entschlüsselung sein sollte, das war alles, was zur Verfügung gestellt wurde, sowie was sie sagen, funktioniert in Java hier https://pastebin.com/kdy0NcnK –

Antwort

1

Es gibt viele Fragen. Es ist schwer zu sagen, was wirklich für die nicht-deterministische Entschlüsselung verantwortlich ist. Ich denke, es ist die Tatsache, dass Sie den Schlüssel als String übergeben, was bedeutet, dass CryptoJS davon ausgeht, dass es sich um ein Passwort handelt, und versuchen Sie, EVP_BytesToKey zu verwenden, um daraus einen Schlüssel abzuleiten. Da das Salz nicht gesetzt ist, hat CryptoJS wahrscheinlich einen Fehler, dass es ein zufälliges Salz für die Entschlüsselung erzeugt (was es nicht sollte). Sie müssen den Schlüssel in eine WordArray analysieren, wenn Sie den Schlüssel manuell bereitstellen möchten.

Das andere Hauptproblem ist die Verwendung von Nicht-CryptoJS-Methoden zum Decodieren (atob), was bedeutet, dass Sie ein Datenformat erhalten, das von CryptoJS nicht direkt gelesen werden kann. CryptoJS basiert auf dem internen WordArray für die Darstellung aller Binärdaten oder erwartet, dass alle Strings UTF-8-codiert sind.

Arbeitscode:

// Key and take the hash of it 
 
var secretKey = 'TESTING123Secret_Key'; 
 
var secretKeyHash = CryptoJS.SHA256(secretKey).toString(CryptoJS.enc.Hex).slice(0,32); 
 
secretKeyHash = CryptoJS.enc.Utf8.parse(secretKeyHash); 
 

 
// Base 64 encoded values 
 
var accountNumberBase64 = 'nxjYfo4Stw63YBEcnjo3oQ=='; 
 
var initializationVectorBase64 = 'HnNcvu9AP9yl09APWkWnDQ=='; 
 

 
var ct = CryptoJS.enc.Base64.parse(accountNumberBase64); 
 
var iv = CryptoJS.enc.Base64.parse(initializationVectorBase64); 
 

 
// Use crypto to decrypt 
 
var decrypted = CryptoJS.AES.decrypt({ 
 
    ciphertext: ct 
 
    }, 
 
    secretKeyHash, { 
 
    mode: CryptoJS.mode.CBC, 
 
    padding: CryptoJS.pad.NoPadding, 
 
    iv: iv 
 
    } 
 
); 
 
console.log(' decrypted, by hand: ' + decrypted.toString(CryptoJS.enc.Utf8));
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script> 
 
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/sha256.js"></script> 
 
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/components/pad-nopadding-min.js"></script>

+0

Vielen Dank für Ihre Geduld - Ich fühlte, dass ich in der Nähe war, aber ich habe die Grundlagen nicht verstanden - Sie sind ein Lebensretter. –