2016-02-18 30 views
5

Podczas korzystania z CryptoJS.AES.encrypt w jaki sposób powstaje wektor inicjujący, jeśli trzeci argument nie został przekazany do funkcji? Czy istnieje sposób na wydobycie go z zaszyfrowanego ciągu?W jaki sposób CryptoJS uzyskuje IV, gdy żadna nie jest określona?

Powodem, dla którego tego potrzebuję jest potrzeba odszyfrowania czegoś CryptoJS.AES.encrypt zwróconego przy użyciu Lua, ale mam tylko klucz, który został podany.

+0

Nie jest dla mnie jasne i nie wiem, jak znaleźć odpowiedź. Wciąż szukasz pomocy :( – warspyking

+0

Crypto-js jest open source, więc możesz łatwo zajrzeć do kodu źródłowego, a także odpowiedziałem na powiązane rzeczy ([1] (http://stackoverflow.com/a/27971983/ 1816580) i [2] (http://stackoverflow.com/a/33942660/1816580) i [3] (http://stackoverflow.com/a/28361216/1816580)). Jest to w zasadzie funkcja EVP_BytesToKey OpenSSL. –

+0

@ Artjom B. Mówisz więc, że jeśli przerobię EVP_BytesToKey na przykład, na przykład Lua, mógłbym podać hasło podane CryptoJS.AES.Encrypt i otrzymać zarówno klucz, jak i iv od niego? – warspyking

Odpowiedz

6

CryptoJS 'CryptoJS.<BlockCipher>.encrypt ma dwa tryby szyfrowania.

  1. Jeśli przechodzą w kluczu że nie jest ciągiem, ale raczej WordArray (wewnętrzna reprezentacja CryptoJS formatu dla danych binarnych), klucz jest zrobione jak jest. Ten tryb oczekuje IV dla wszystkich trybów działania, z wyjątkiem EBC, który nie używa IV, więc nie musisz go podawać. Jeśli nie zostanie podana wartość IV, zostanie domyślnie (za pomocą pewnej magii JavaScript) wypełniona zero (składająca się z pełnego bloku 0x00 bajtów).

  2. Jeśli wpiszesz "klucz", że jest ciągiem, to zakłada się, że "klucz" jest hasłem. Aby wyprowadzić klucz z hasła, korzysta z funkcji wyprowadzania zgodnej z OpenSSL EVP_BytesToKey. Ten tryb generuje nową losową sól 8-bajtową i wykorzystuje ją wraz z hasłem do wygenerowania klucza i IV. Nawet jeśli jawnie przekażesz IV, nie zostanie on użyty.

    CryptoJS.AES.encrypt(msg, password).toString() 
    

    powoduje base64 zakodowanego zaszyfrowanym tekście, który zawiera łańcuch „Salted__” na początku, a następnie przez 8 bajtów soli i rzeczywistej zaszyfrowanego tekstu. Możesz wyraźnie podzielić to przed użyciem za pomocą:

    var ct = CryptoJS.AES.encrypt(msg, password); 
    var saltHex = ct.salt.toString();  // random salt 
    var ctHex = ct.ciphertext.toString(); // actual ciphertext 
    var ivHex = ct.iv.toString();   // generated IV 
    

    Jeśli potrzebujesz odtworzyć to samo wyprowadzenie klucza. Spójrz na the code i the specification.

    Klucze powinny mieć wysoką entropię i być nieodróżnialne od przypadkowego szumu, co utrudnia ich brutalne wymuszanie. Wyżej wymienione EVP_BytesToKey nie jest bezpieczne, ponieważ hashowanie MD5 jest bardzo szybkie, co umożliwia napastnikowi brutalne wymuszenie hasła. Musisz użyć naprawdę długiego hasła (20-30 znaków) lub użyć odpowiedniej funkcji wyprowadzania klucza, takiej jak PBKDF2, którą zapewnia CryptoJS.

+0

Okej, więc jestem w stanie cofnąć bazę 64, więc mówisz, że 8-bajtowa sól jest po Solted__? Nie mam pojęcia, jak odszyfrować to O_O. Coś wymyślę, dzięki za informację, to było bardzo przydatne. – warspyking

+0

Wciąż nie do końca jestem pewien, co masz. Jeśli dobrze cię rozumiem, próbujesz odszyfrować szyfrowany tekst w CryptoJS, który otrzymałeś z aplikacji Lua. Jeśli masz dostęp do kodu Lua, sugeruję dokładne przyjrzenie się, jak szyfrowanie zostało wykonane, a następnie możesz zdecydować, jak będzie wyglądać odpowiedni deszyfrowanie w CryptoJS. Ponadto nie trzeba replikować EVP_BytesToKey w celu odszyfrowania, ponieważ 'CryptoJS.AES.decrypt' obsługuje dokładnie te same metody, co' CryptoJS.AES.encrypt'. Ponadto klucze AES mają określoną długość, ale hasła nie. Jak długo masz klucz? –

+0

Oto, co robię: 1. Konfigurowanie chronionego tekstu za pomocą protectedtext.com 2. Podanie hasła 3. (Wierzę) witryna przekazuje to za pośrednictwem tego hasha z moim hasłem 4. Używam żądania otrzymania, aby uzyskać Hashowana zawartość jakiś czas później 5. Muszę użyć kodu Lua, aby przywrócić go ze stanu zakodowanego (i podstawowego 64) do czytelnego formatu ludzkiego. – warspyking