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
On Dec 13, 4:37 am, "Mr. Bless" <[email protected]> wrote:
> 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
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---