PHP AES şifreleme ...

0 Cevap php

Ben şifreleme hakkında çok şey bilmiyorum, ama ben biraz ... PHP çalışan AES başardı. İşte ben kullanıyorum bir çift fonksiyonlar:

function aes_decrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode = MCRYPT_MODE_ECB; 
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND) ); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
} 

function aes_encrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode=MCRYPT_MODE_ECB; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND)); 
} 

Bu hafif bir comment on the PHP documentation page for mcrypt modifiye edilmiştir. (Ben dev_urandom mevcut olmayan bir pencere kutusunda, üzerinde olduğum gibi, rand için dev_urandom değiştirildi.)

Her neyse, bu işlevleri kullanmak önemli bu gibi tanımlanır:

define("PSK", pack("H*", "abcd7b5ca46e12345678a8161fdacee9"));

Bu gibi benim işlevi çağırır:

echo bin2hex(aes_encrypt("wootwootwootwootwootwootwoo", PSK));

Şimdi, elde edilen onaltılık dize ilk 16 bayt (32 basamak) gayet iyi. Sonraki 16 bayt ne bekleniyor eşleşmiyor.

Ben o zaman çözer harici webcoder bu verileri ilanıyla, bkz. Ben (ne yazık ki) benim şifreleme anahtarı ve veriyi teslim olmadan ben bir test case veremem. Ben bu konuda çok üzgünüm, fakat ben mcrypt aşina birisi bu bakmak ve ben yanlış yapıyorum bana ne söyleyebilirsin umuyorum.

Yine, bir katı test davanın eksikliği hakkında üzgünüm, ama ben size herhangi bir yardım büyük ölçüde minnettar!

EDIT: Ben bir boş IV kullanıyor için ilanıyla benim sağlayıcı gibi görünüyor. Rook tavsiyesi ardından, CBC moduna ve anahtarı ilgili gereksiz kod kaldırdık. İşte benim yeni işlevleri şunlardır:

function aes_decrypt($val,$key)
{
    $mode = MCRYPT_MODE_CBC;
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, null); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
}

function aes_encrypt($val,$key) 
{
    $mode = MCRYPT_MODE_CBC;
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, null); 
}

0 Cevap