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


#1

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


#2

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


#3

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