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 [ [email protected] ]
#** 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