رفتن به مطلب

RC4 در PHP


امین مهدی نژاد

ارسال‌های توصیه شده

گاهی لازم میشه اطلاعات ارسالی از سرور رو برای امنیت بشتر رمزگذاری کنیم.کد زیر رمزگذاری RC4 بوده که میتونین در بی فور هم اونو دیکد کنید

با استفاده از کتابخونه irUtility و کد زیر می تونید اطلاعات رو اینکد و دیکد کنید.

کدش هم به همراه مثال پیوست شد

<?php

class RC4 
{
    const ENCRYPT_MODE_NORMAL = 0x01;
    const ENCRYPT_MODE_UPDATE = 0x02;

    protected $password;
    protected $encryptMode;
    protected $sBox = array();
    protected $si = 0;
    protected $sj = 0;
 protected $box = array();
    public function __construct($password, $encryptMode = 0x01)
    {
        $this->password = $password;
        $validMode = array(
            static::ENCRYPT_MODE_NORMAL, 
            static::ENCRYPT_MODE_UPDATE
        );
        if ( ! in_array($encryptMode, $validMode)) {
            throw new InvalidArgumentException("Invalid encrypt mode.");
        }
        $this->encryptMode = $encryptMode;
        $this->initCipher();
    }

    protected function  initCipher() 
    {
		
        $i = 0; $x = 0; $t = 0; $l =strlen($this->password);
        for($i=0; $i<256; $i++){
            $this->box[$i] = $i;
        }
        for($i=0; $i<256; $i++){
            $x = (($x+$this->box[$i]+ord($this->password[$i%$l]))+256) % 256;
 
            $t = $this->box[$x];
            $this->box[$x] = $this->box[$i];
            $this->box[$i] = $t;
        }		
		
    }
	
    public function encrypt($data) 
    {
        $t=0; $o=0; $i=0; $j = 0; $l =strlen($data);
        $out =  array();
        for($c=0; $c<$l; $c++){
            $i = ($i+1) % 256;
            $j = ($j+$this->box[$i]) % 256;
 
            $t = $this->box[$j];
            $this->box[$j] = $this->box[$i];
            $this->box[$i] = $t;
 
            $o = $this->box[($this->box[$i] + $this->box[$j]) % 256];
            $out[$c] =(ord($data[$c]) ^ $o);
        }
		$string = "";
		foreach ($out as $chr) {
			$string .= chr($chr);
		}
        return  $string;
    }

    protected function resetCipher()
    {
        $this->initCipher();
    }

    public function decrypt($plaintext)
    {
        return $this->encrypt($plaintext);
    }
}

نحوه استفاده

<?php

require __DIR__ . "/RC4.php";

$password ="pass";
$plaintext = "answercenter.ir";
//اینکد
$encryptor = new RC4($password);
$ciphertext = base64_encode($encryptor->encrypt($plaintext));
echo $ciphertext."<br />";


//دیکد
$encryptor = new RC4($password);
$ciphertext = $encryptor->encrypt(base64_decode($ciphertext));
echo $ciphertext."<br />";
?>

RC4-PHP

«موفق باشید.»

لینک ارسال
به اشتراک گذاری در سایت های دیگر

  • 2 ماه بعد...

سلام

در ابتدا از اشتراک گذاری این مطلب بسیار کاربردی تشکر میکنم...

اما چرا با اجرای کدهای بخش نحوه استفاده ، خروجی ای نمیبینیم !

با جستجو متوجه شدم که دستور echo نمیتونه آرایه رو نمایش بده...

پس بجاش دستور print_r رو گذاشتم.

با این حال در دیکد کردن مشکل داره ...

مثلا نتیجه کد زیر :

<?php
require __DIR__ . "/RC4.php";

$password ="test";
$plaintext = "answercenter.ir";

//اینکد
$encryptor = new RC4($password);
$ciphertext = $encryptor->encrypt($plaintext);
print_r($ciphertext);

echo "<br />";

//دیکد
$encryptor = new RC4($password);
$ciphertext = $encryptor->encrypt($ciphertext);
print_r($ciphertext);
?>

میشود :

Array ( [0] => 207 [1] => 225 [2] => 84 [3] => 102 [4] => 133 [5] => 88 [6] => 30 [7] => 64 [8] => 184 [9] => 58 [10] => 56 [11] => 17 [12] => 63 [13] => 205 [14] => 149 )

Array ( )

چطور این مورد رو برطرف کنیم ؟

با سپاس

لینک ارسال
به اشتراک گذاری در سایت های دیگر

  • 3 ماه بعد...
در در 1395/12/15, 12:46:16، nima_j گفته است :

سلام

در ابتدا از اشتراک گذاری این مطلب بسیار کاربردی تشکر میکنم...

اما چرا با اجرای کدهای بخش نحوه استفاده ، خروجی ای نمیبینیم !

با جستجو متوجه شدم که دستور echo نمیتونه آرایه رو نمایش بده...

پس بجاش دستور print_r رو گذاشتم.

با این حال در دیکد کردن مشکل داره ...

مثلا نتیجه کد زیر :


<?php
require __DIR__ . "/RC4.php";

$password ="test";
$plaintext = "answercenter.ir";

//اینکد
$encryptor = new RC4($password);
$ciphertext = $encryptor->encrypt($plaintext);
print_r($ciphertext);

echo "<br />";

//دیکد
$encryptor = new RC4($password);
$ciphertext = $encryptor->encrypt($ciphertext);
print_r($ciphertext);
?>

میشود :


Array ( [0] => 207 [1] => 225 [2] => 84 [3] => 102 [4] => 133 [5] => 88 [6] => 30 [7] => 64 [8] => 184 [9] => 58 [10] => 56 [11] => 17 [12] => 63 [13] => 205 [14] => 149 )

Array ( )

چطور این مورد رو برطرف کنیم ؟

با سپاس

درسته من در مثال بالا برای راحتی کار و حل این مشکل از Base64 استفاده کردم. شما هم همینکار رو انجام بدین.

base64_encode($encryptor->encrypt($plaintext));

«موفق باشید.»

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...