2015-03-07 14 views
7

Mam problem z odtwarzaniem tego samego wyniku wygenerowanego w PHP vs Coldfusion.Szyfrowanie w Coldfusion, a następnie odszyfrowywanie w PHP

w PHP szyfrowania w ten sposób:

<?php 
    $key = "[email protected]"; 
    $Valor = "TESTE"; 

    $base = chop(base64_encode(mcrypt_encrypt(MCRYPT_DES, $key, $Valor, MCRYPT_MODE_ECB)));  
?> 

mam wynik:

TzwRx5Bxoa0 =

W ColdFusion zrobił tak:

<cfset Valor = "TESTE"> 
<cfset Key = "[email protected]"> 
<cfset base = Encrypt(Valor,ToBase64(Key),"DES/ECB/PKCS5Padding","BASE64")> 

Wynik:

qOQnhdxiIKs =

Co nie jest ColdFusion uzyskując taką samą wartość jak PHP?

Bardzo dziękuję

Odpowiedz

5

(zbyt długo na komentarze)

Artjom B. already provided the answer above. Artjom B. napisał:

Problem polega na dopełnieniu. Rozszerzenie PHP w PHP wykorzystuje tylko ZeroPadding [...] musisz albo umieścić tekst jawny w php [...] lub użyć innego szyfrowania w ColdFusion, takiego jak "DES/ECB/NoPadding". I polecam ten pierwszy, ponieważ jeśli używasz NoPadding, tekst jawny musi już być wielokrotnością rozmiaru bloku.

Niestety, trudno jest wyprodukować null character w CF. AFAIK, jedyną techniką, która działa, jest use URLDecode("%00"). Jeśli nie możesz zmodyfikować kodu PHP jako sugerowanego @Artjom B., możesz spróbować użyć poniższej funkcji, aby umieścić tekst w CF.Zastrzeżenie: Jest tylko lekko testowane (CF10), ale wydawało się, że daje taki sam wynik jak powyżej.

Aktualizacja: Ponieważ funkcja CF szyfrowania() always interprets the plain text input as a UTF-8 string, można również użyć charsetEncode(bytes, "utf-8") aby utworzyć pusty znak z jednej tablicy elementem bajtów, czylicharsetEncode(javacast("byte[]", [0]), "utf-8")


Przykład:

Valor = nullPad("TESTE", 8); 
Key = "[email protected]"; 
result = Encrypt(Valor, ToBase64(Key), "DES/ECB/NoPadding", "BASE64"); 
// Result: TzwRx5Bxoa0= 
WriteDump("Encrypted Text = "& Result); 

Funkcja:

/* 
    Pads a string, with null bytes, to a multiple of the given block size 

    @param plainText - string to pad 
    @param blockSize - pad string so it is a multiple of this size 
    @param encoding - charset encoding of text 
*/ 
string function nullPad(string plainText, numeric blockSize, string encoding="UTF-8") 
{ 
    local.newText = arguments.plainText; 
    local.bytes = charsetDecode(arguments.plainText, arguments.encoding); 
    local.remain = arrayLen(local.bytes) % arguments.blockSize; 

    if (local.remain neq 0) 
    { 
     local.padSize = arguments.blockSize - local.remain; 
     local.newText &= repeatString(urlDecode("%00"), local.padSize); 
    } 

    return local.newText; 
} 
+0

Osobisty, teraz działał idealnie w początkowym teście, zrobię kilka testów później, ale uważam, że rozwiązanie jest takie samo. Dziękujemy za pomoc i terminowość. Pomogła mi bardzo. Dzięki –

+0

ArtjomB. zorientowałem się w prawdziwym problemie, ale cieszę się, że powyższe pomogło :) – Leigh

+0

Oczywiście, pomógł dużo =] –

5

Problem polega na dopełnieniu. Rozszerzenie PHP mcrypt używa tylko ZeroPadding. Oznacza to, że tekst jawny jest wypełniany 0x00 bajtami, dopóki nie zostanie osiągnięta wielokrotność rozmiaru bloku.

Podanie PKCS # 5/PKCS # 7 z drugiej strony powoduje wypełnienie bajtów określających liczbę brakujących bajtów do następnej wielokrotności rozmiaru bloku. Rozmiar bloku dla DES wynosi 8 bajtów.

Musisz więc umieścić tekst jawny w php (zobacz ten kod wrzutowy: A: How to add/remove PKCS7 padding from an AES encrypted string?) lub użyj innego szyfrowania w ColdFusion, na przykład "DES/ECB/NoPadding". Polecam ten pierwszy, ponieważ jeśli używasz NoPadding, tekst jawny musi już być wielokrotnością rozmiaru bloku.

$key = "[email protected]"; 
$Valor = "TESTE"; 
function pkcs7pad($plaintext, $blocksize) 
{ 
    $padsize = $blocksize - (strlen($plaintext) % $blocksize); 
    return $plaintext . str_repeat(chr($padsize), $padsize); 
} 

$base = chop(base64_encode(mcrypt_encrypt(MCRYPT_DES, $key, pkcs7pad($Valor, 8), MCRYPT_MODE_ECB))); 

Wynik:

qOQnhdxiIKs =

Nie zapomnij unpad odzyskanego jawny jeśli odszyfrowywania w PHP.

+0

Jeśli nie kodować kluczyk z błędem Base64 Wystąpił błąd podczas szyfrowania i deszyfrowania ciąg wejściowy: „” Nie można zdekodować ciąg „$ 224.455 @” .. –

+0

znalazłem problem. Zajęło mi to wystarczająco długo. –

+0

(Edytuj) @ArtjomB. - W jaki sposób ciąg tekstowy i klucz są dekodowane w php? CF [* zawsze * traktuje zwykły kodowany UTF8, a klucz jako base64] (https://helpx.adobe.com/coldfusion/kb/strong-encryption-coldfusion-mx-7.html). Dlatego pytający prawdopodobnie będzie musiał dostosować klucz w zależności od tego, w jaki sposób funkcja php interpretuje wartość. – Leigh

Powiązane problemy