2012-03-20 64 views
8
İşte

şifreler ve çözer bir PHP demo script veriler:Neden mcrypt_encrypt() dizgemin sonunda ikili karakterleri koyar?

original card_nbr: 1234 
card_nbr_encrypted: vY¨(Z$<§G3-žÃ-Éù3Ý2Ê×rz¨VÛ 
card_nbr_decrypted: 1234 (and 28 binary characters) 
length: 32 


çıkış başarıyla deşifre edilir, ancak 28 ikili karakterler eklenir:

<? 

$encryptionkey = 'h8y2p9d1'; 

$card_nbr = "1234"; 
echo "original card_nbr: $card_nbr <br>\n"; 

$card_nbr_encrypted=encrypt_data($card_nbr); 
echo "card_nbr_encrypted: $card_nbr_encrypted <br>\n"; 

$card_nbr_decrypted=decrypt_data($card_nbr_encrypted); 
echo "card_nbr_decrypted: $card_nbr_decrypted <br>\n"; 

$len=strlen($card_nbr_decrypted); 
echo "length: $len <br>\n"; 



function encrypt_data($text){ 
    global $encryptionkey; 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $encrypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $encryptionkey, $text, MCRYPT_MODE_ECB, $iv); 
    return $encrypted_text; 
} 

function decrypt_data($text){ 
    global $encryptionkey; 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $decrypted_text = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $encryptionkey, $text, MCRYPT_MODE_ECB, $iv); 
    return $decrypted_text; 
} 

?> 


çıkışı son. Bu, HTML kaynağını görüntülerken Firefox'ta en kolay şekilde görülebilir. 32'lik dize uzunluğu bunu da gösterir. Herhangi bir fikir?

enter image description here

+0

bunun bir yardımı olup olmadığına bakın http://php.net/manual/en/function.base64-encode.php –

+0

@Mian_Khurram_Ijaz Neden bunun aslında – Ben

+0

yardımının ikili dosya biçiminde olduğunu göremiyorum böylece ağ base64_encode güvenli hale getirmek için şifreli ve şifresini çözmek yardımcı olur böylece ikili chars sorun ise o zaman base64 kullanın eğer iyi çalışıyor .. –

cevap

8

İade edilen dize,null karakterini kullanarak n * blocksize baytları doldurmak için dışarı doldurulur, bu nedenle fazladan verileri görüyorsunuz.

$card_nbr_decrypted= rtrim($card_nbr_decrypted, "\0");'u çalıştırırsanız, gerçek verileri döndürmelidir.

+0

Eğer 'rtrim' kullanarak bir çözüm, tabii ki, eğer kırık gerçekte bazı sayılarda boş bırakılabilen keyfi ikili verileri şifrelemek. Bu durumda, ya bant dışı uzunluğunu iletmeli ve 'substr' bu uzunluğa geri dönmeli (kolay, ancak dizenin uzunluğunu sızdırıyor), ya da şifrelemeden önce dolguyu kendiniz yapmalısınız. PKCS # 7 dolgu yöntemini anlamak kolay. – hobbs

+0

PKCS # 7 ile ilgili sorun, mcrypt yazan ve sürdüren bozgunun destek sağlamasıdır. – zaph

3

Bir known problem gibi görünüyor. Fazla NUL'leri kaldırmak için kodu çözdikten sonra rtrim() kullanın.

2
Eğer blok boyutuna uyması için düz metin sonunu yastıkları sizin block cipher mode of operation için Elektronik Kod Bloğu (ECB) kullandığınız için boş bayt alıyorsunuz

. Sizin durumunuzda blok boyutu 256 bittir, çünkü MCRYPT_RIJNDAEL_256 kullanıyorsunuz. MCRYPT_MODE_CFB - - hayır boş bayt, Döşeme gerek sen Şifreleme Feedback (CFB) modu kullanırsanız

Hep birlikte bu doldurma sorunu önleyebilirsiniz. Ancak, CFB ile (see "Mallet") ile değiştirilmediğinden emin olmak için şifrelenmiş verilerinizi HMAC kullanmalısınız. Çalışan bir uygulamanın bir örneğini şu adreste bulabilirsiniz: Cryptography For The Average Developer.

Ayrıca not, ECB modu reveal data patterns olabilir, çünkü daha az güvenli kabul edilir. Ayrıca ECB (ve aynı zamanda pedleri de CBC) padding oracle attack'a karşı savunmasız olabilir. Sen kullanımı düz metin için base64_encode ($ metin) kullanabilirsiniz verilen parametrelere

ile şifresiz şifreler -

mcrypt_encrypt:

-1

Sorunun ne zaman ikili veri kullandığınızı olduğunu düşünüyorum.

+0

Kodlama şifreleme ile aynı şey değildir. –

+0

Biliyorum. Ancak, mcrypt_encrypt'i kullanırsanız Kodlama ile ilgili sorunları önlemek için $ text metnini base64 düz metin olarak göndermeniz yararlı olur. Baz64_encode ($ text) veya rtrim() öğesini diğer kullanıcıların önerdiği gibi kullanabilirsiniz. – bLuEdDy