disket.net Beta
Konu Listesine Dön

PHP 5.3'te mcrypt ile AES-256-CBC şifreleme: OpenSSL'e geçişte veri uyumluluğu sorunu

Web Geliştirme Açılış: 03.08.2026 13:06 1 Görüntülenme
Selam yoldaşlar, uzun zamandır disket.net'i takip ediyorum ama ilk kez konu açıyorum. Umarım doğru yere yazmışımdır. Şimdi sorunuma geçeyim:

Elimde 2010'dan beri çalışan bir PHP 5.3 tabanlı eski bir web uygulaması var. Kullanıcı verilerini AES-256-CBC ile mcrypt kullanarak şifreliyorum. Kod şu şekilde:

```php
$key = 'buBenimGizliAnahtarim123';
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
// sonra base64_encode ile saklıyorum
```

Şimdi sunucuyu PHP 7.4'e yükseltmem gerekiyor ve mcrypt kaldırıldı. OpenSSL'e geçmem lazım ama elimdeki mevcut şifrelenmiş verileri de çözmem gerekiyor. Yeni kodda openssl_encrypt kullanacağım ama eski verileri nasıl çözeceğim? mcrypt'in padding yöntemi ile OpenSSL'in padding yöntemi farklı mı? Denedim ama eski verileri çözemedim, hep bozuk karakterler geliyor. Bu konuda deneyimi olan var mı? Şimdiden teşekkürler.

Cevaplar (2)




Elimde 2010'dan beri çalışan bir PHP 5.3 tabanlı eski bir web uygulaması var. Kullanıcı verilerini AES-256-CBC ile mcrypt kullanarak şifreliyorum. Kod şu şekilde:

```php
$key = 'buBenimGizliAnahtarim123';
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
// sonra base64_encode ile saklıyorum
```



Kanka, bu klasik bir sorun. mcrypt ve OpenSSL arasındaki fark tam olarak padding'de. mcrypt, veriyi blok boyutuna (16 byte) tamamlamak için sıfır byte (\0) ekler. OpenSSL ise PKCS#7 padding kullanır. Yani eski verileri çözmek için openssl_decrypt'e özel bir seçenek yok ama manuel olarak sıfır padding'i kaldırman gerek. Şöyle yapabilirsin:

```php
function decrypt_old_mcrypt($data, $key, $iv) {
$decrypted = openssl_decrypt($data, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
// mcrypt sıfır padding ekler, sonundaki \0'ları temizle
$decrypted = rtrim($decrypted, "\0");
return $decrypted;
}
```

Ayrıca dikkat et: senin key uzunluğun 24 karakter, bu AES-192 demek. AES-256 için 32 karakter gerekir. Ama mcrypt'te MCRYPT_RIJNDAEL_128 ile 24 byte key kullanırsan, OpenSSL'de aes-192-cbc kullanmalısın. Yoksa uyumsuzluk olur. IV'ü de saklamayı unutma, genelde şifrelenmiş verinin yanında tutuyorsun. Eski verileri çözmek için bu fonksiyonu kullan, sonra tekrar PKCS#7 ile şifrele. Kolay gelsin.



Kanka, bu klasik bir sorun. mcrypt ve OpenSSL arasındaki fark tam olarak padding'de. mcrypt, veriyi blok boyutuna (16 byte) tamamlamak için sıfır byte (\0) ekler. OpenSSL ise PKCS#7 padding kullanır. Yani eski verileri çözmek için openssl_decrypt'e özel bir seçenek yok ama manuel olarak sıfır padding'i kaldırman gerek. Şöyle yapabilirsin:

```php
function decrypt_old_mcrypt($data, $key, $iv) {
$decrypted = openssl_decrypt($data, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
// mcrypt sıfır padding ekler, sonundaki \0'ları temizle
$decrypted = rtrim($decrypted, "\0");
return $decrypted;
}
```



Eyvallah copperdigger43, sağolasın! Haklısın, key uzunluğunu gözden kaçırmışım. Benim key 24 karakter, yani AES-192. Ama ben OpenSSL'de aes-256-cbc kullanıyordum, o yüzden uyumsuzluk oluyordu. Şimdi aes-192-cbc ile denedim ve rtrim ile sıfırları temizleyince eski verileri sorunsuz çözdüm. Ayrıca yeni verileri şifrelerken de openssl_encrypt ile PKCS#7 padding otomatik geliyor, ekstra bir şey yapmama gerek kalmadı. Tüm verileri bir script ile dönüştürdüm, artık her şey çalışıyor. Tekrar teşekkürler, bu konu beni çok uğraştırmıştı. Konu çözüldü, yardımcı olan herkese minnettarım!

Bu konuya cevap yazabilmek için retro topluluğumuza üye olmalı veya giriş yapmalısınız.

İlgili Konular & Benzer Paylaşımlar

PHP 5.6 ile eski bir projeyi PHP 8.2'ye taşırken mcrypt ve mysql_* hataları Kategori: Web Geliştirme
PHP 5.2'de legacy projede MySQLi bağlantı hatası: mysqlnd mi, yoksa başka bir şey mi? Kategori: Web Geliştirme
PHP 5.6'dan PHP 7.4'e Geçerken Dikkat Edilmesi Gerekenler? Kategori: Web Geliştirme