Forum: Ruby on Rails Need Help in converting php encryption decryption code to ruby on rails

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
C7935335b15e9c363b8decb26eb6fcfa?d=identicon&s=25 Mr. Bless (Guest)
on 2008-12-13 03:38
(Received via mailing list)
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 [ leapinglangoor@yahoo.co.in ]
#** 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
97f7778bd994b7e4c5ad025be0640bde?d=identicon&s=25 Andrius Chamentauskas (Guest)
on 2008-12-13 14:52
(Received via mailing list)
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
929c5c32f7903a1154be888822c5ec20?d=identicon&s=25 mrbless (Guest)
on 2008-12-15 03:50
(Received via mailing list)
I will try it and let you know. Thanks for support.
This topic is locked and can not be replied to.