# Need Help in converting php encryption decryption code to ruby on rails

**URL:** <https://www.ruby-forum.com/t/need-help-in-converting-php-encryption-decryption-code-to-ruby-on-rails/155534>\
**Category:** Rails\
**Created:** [December 13, 2008, 3:38am UTC](https://www.ruby-forum.com/t/need-help-in-converting-php-encryption-decryption-code-to-ruby-on-rails/155534 "2008-12-13T03:38:27Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![MrSBless](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3bc359/32.png) [@MrSBless](https://www.ruby-forum.com/u/MrSBless)\
**Post date:** [December 13, 2008, 3:38am UTC](https://www.ruby-forum.com/t/need-help-in-converting-php-encryption-decryption-code-to-ruby-on-rails/155534/1 "2008-12-13T03:38:27Z")

</div>

Hi guys i found this encryption decryption in php and try to convert  
it in rails but i am unable to successfully convert it. So plz help  
me. I you write the whole conversion code then it will be great.

# PHP code is like this

# 

#/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
#\*\*  
#\*\* MD5 block cypher  
#\*\*  
#\*\* Author…: leapinglangoor [removed\_email\_address@domain.invalid]  
#\*\* Date…: 30th Apr 2005  
#\*\* version.: v1.00  
#\*\*  
#\*\* Desc…: Below is MD5-based block cypher ( MDC-like ),  
#\*\* which works in 128bit CFB mode. It is very useful to  
#\*\* encrypt secret data before transfer it over the network.  
#\*\*  
#\*\* $iv\_len - initialization vector’s length.  
#\*\* 0 \<= $iv\_len \<= 512  
#\*\*  
#\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

# 

function get\_rnd\_iv( $iv\_len )  
{

```
$iv = '';
while ( $iv_len-- > 0 )
{
     $iv .= chr( mt_rand( ) & 0xff );
}

 return $iv;

```

}

function md5\_encrypt( $plain\_text, $password, $iv\_len = 16 )  
{

```
$plain_text .= "\x13";
$n = strlen( $plain_text );
if ( $n % 16 )
{
    $plain_text .= str_repeat( "\0", 16 - ( $n % 16 ) );
}

$i = 0;
$enc_text = get_rnd_iv( $iv_len );
$iv = substr( $password ^ $enc_text, 0, 512 );
while ( $i < $n )
{
     $block = substr( $plain_text, $i, 16 ) ^ pack( 'H*', md5

```

( $iv ) );  
$enc\_text .= $block;  
$iv = substr( $block . $iv, 0, 512 ) ^ $password;  
$i += 16;  
}

```
return base64_encode( $enc_text );

```

}

function md5\_decrypt( $enc\_text, $password, $iv\_len = 16 )  
{

```
$enc_text = base64_decode( $enc_text );
$n = strlen( $enc_text );
$i = $iv_len;
$plain_text = '';
$iv = substr( $password ^ substr( $enc_text, 0, $iv_len ), 0,

```

512 );  
while ( $i \< $n )  
{  
$block = substr( $enc\_text, $i, 16 );  
$plain\_text .= $block ^ pack( ‘H\*’, md5( $iv ) );  
$iv = substr( $block . $iv, 0, 512 ) ^ $password;  
$i += 16;  
}

```
return preg_replace( '/\\x13\\x00*$/', '', $plain_text );

```

}

# and I Tried like this

def get\_rnd\_iv(iv\_len)  
iv=’’  
while (iv\_len\>0) do  
iv\_len -=1  
iv +=rand(255).chr  
end  
return iv  
end

def md5\_encrypt(plain\_text,password,iv\_len=16)  
plain\_text +="\x13"  
n=plain\_text.size  
if(n%16)  
plain\_text +="\0"_(16-(n%16))  
end  
i=0  
enc\_text=get\_rnd\_iv(iv\_len)  
enc=’’  
pass=’’  
for i in 0…password.size-1  
pass +=password[i].to\_s(2)  
end  
for i in 0…enc\_text.size-1  
enc +=enc\_text[i].to\_s(2)  
end  
intervalue=(pass.to\_i^enc.to\_i).to\_s  
iv=password^enc\_text.split(0,512)  
iv=intervalue[0,512]  
while ( $i \< $n )  
{  
$block = substr( $plain\_text, $i, 16 ) ^ pack( 'H_’, md5  
( $iv ) );  
$enc\_text .= $block;  
$iv = substr( $block . $iv, 0, 512 ) ^ $password;  
$i += 16;  
}  
while(i\<n) do  
pp\_text=plain\_text[i,16]  
pp=’’  
for j in 0…pp\_text.size-1  
pp+=pp\_text.to\_s(2)  
end  
block=pp^pack(‘H\*’,Digest::MD5.hexdigest(iv))  
enc\_text +=block  
intermedi=block+iv  
kk=’’  
for j in 0…intermedi.size-1  
kk +=intermedi[j].to\_s(2)  
end  
iv=kk.to\_i^pass.to\_i  
i +=16  
end  
return Base64.encode64(enc\_text)  
end

# 

def md5\_decrypt(enc\_text,password,iv\_len=16)  
enc\_text=Base64.decode64( enc\_text)

n=enc\_text.size  
i=iv\_len  
plain\_text=’’  
pass=’’  
for ii in 0…password.size-1  
pass +=password[ii].to\_s(2)  
end  
lmp=enc\_text[0,iv\_len]  
enc=’’  
for k in 0…lmp.size-1  
enc=lmp[k].to\_s(2)  
end

intermedi=(pass.to\_i ^lmp.to\_i) .to\_s  
iv=intermedi[0,512]  
while(i\<n) do

```
    block = enc_text[i, 16]
    plain_text += block ^ pack( 'H*', Digest::MD5.hexdigest

```

( iv ) )  
# plain\_text += block  
cc=block+iv  
iv = cc[0, 512].to\_i ^ pass.to\_i  
i += 16  
end

return preg\_replace( ‘/\x13\x00\*$/’, ‘’, $plain\_text );  
end

---

<div class="post-metadata">

**Author:** ![MrSBless](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3bc359/32.png) [@MrSBless](https://www.ruby-forum.com/u/MrSBless)\
**Post date:** [December 13, 2008, 2:52pm UTC](https://www.ruby-forum.com/t/need-help-in-converting-php-encryption-decryption-code-to-ruby-on-rails/155534/2 "2008-12-13T14:52:54Z")

</div>

Even though i think you should use some known encryption algorythm,  
here’s translated source (not tested):

require ‘digest/md5’  
require ‘base64’

class String  
def ^(value)  
rez = “”  
self.length.times { |i| rez \<\< (self[i] ^ value[i % value.length].to\_i) }  
rez  
end  
end

def get\_rnd\_iv(iv\_len)  
chars = (“a”…“z”).to\_a + (“A”…“Z”).to\_a + (“0”…“9”).to\_a  
iv = “”  
iv\_len.times { iv \<\< chars[rand(chars.size)] }  
return iv  
end

def md5\_encrypt(plain\_text, password, iv\_len = 16 )  
plain\_text += “\x13”; # for some reason i believe that it should be  
\n instead of \x13, a bug in a script?  
plain\_text += “\0” \* (16 - plain\_text.length % 16)

enc\_text = get\_rnd\_iv(iv\_len);  
iv = (password ^ enc\_text)[0, 512];

(plain\_text.length % 16).times do |i|  
block = plain\_text[i \* 16, 16] ^ Digest::MD5.hexdigest(iv)  
enc\_text += block  
iv = (block + iv)[0, 512] ^ password  
end

return Base64.encode64(enc\_text);  
end

def md5\_decrypt(enc\_text, password, iv\_len = 16)  
enc\_text = Base64.decode64(enc\_text);  
plain\_text = ‘’;  
iv = (password ^ enc\_text[0, iv\_len])[0, 512];

i, n = iv.length, enc\_text.length  
while i \< n  
block = enc\_text[i, 16]  
plain\_text += block ^ Digest::MD5.hexdigest(iv)  
iv = (block + iv)[0, 512] ^ password  
i += 16  
end

return plain\_text.gsub(/\x13\x00\*$/, ‘’);  
end

---

<div class="post-metadata">

**Author:** ![MrSBless](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3bc359/32.png) [@MrSBless](https://www.ruby-forum.com/u/MrSBless)\
**Post date:** [December 15, 2008, 3:50am UTC](https://www.ruby-forum.com/t/need-help-in-converting-php-encryption-decryption-code-to-ruby-on-rails/155534/3 "2008-12-15T03:50:27Z")

</div>

I will try it and let you know. Thanks for support.
