PHP Ruby Şifreleme Algoritması (Vignere varyant)

1 Cevap php

Ben bu konuda biraz şaşırıp. Ben Ari Kuorikoski tarafından yazılmış Typo3 yırtık var gibi bir şifreleme algoritmasının bir sürümünü kullanan bir API arayüzü var.

Ben onların API için bir yakut lib, yani yakut içine noktasına kendi algoritması olması gerekir, ve bu şifreleme geldiğinde ben biraz benim derinlik dışında duyuyorum.

Bu kodu:

private function keyED($txt) { 
$encrypt_key = md5($this->encrypt_key); 
$ctr=0; 
$tmp = ""; 
for ($i=0;$i<strlen($txt);$i++) { 
   if ($ctr==strlen($encrypt_key)) $ctr=0; 
   $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1); 
   $ctr++; 
}
return $tmp; 

}

private function encrypt($txt){ 
srand((double)microtime()*1000000); 
$encrypt_key = md5(rand(0,32000)); 
$ctr=0; 
$tmp = ""; 
for ($i=0;$i<strlen($txt);$i++){ 
   if ($ctr==strlen($encrypt_key)) $ctr=0; 
   $tmp.= substr($encrypt_key,$ctr,1) . 
       (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1)); 
   $ctr++; 
}
return base64_encode($this->keyED($tmp)); 

}

Beni şaşkına olan kısmı şudur, ben o olacak sunucu olduğu gibi yakut 1.8.6 için yazmak zorunda. Ve dizeleri için hiçbir XOR varsa bunu anlayacak değil ki ... var.

Herhangi bir yardım, göstericiler fikirler çok çok duyacağız.

Thanks, J

Zeyilname:

Ben sadece zorluk aslında xor sorun, ben herhangi bir kod koymadı, farkında, ama burada benim kod şimdiye kadar:

def xor(s1,s2)
        if s2.empty? then
            return s1
        else
            a1 = s1.unpack("c*")
            a2 = s2.unpack("c*")
            a2 *= 2 while a2.length < a1.length
            return a1.zip(a2).collect {|c1,c2| c1 ^ c2}.pack("c*")
        end
    end
    def keyED(str)
        encrypt_key = Digest::MD5.digest(@key)
        ctr = 0
        tmp = ''
        for i in 0...str.length do
             ctr = 0 if ctr == encrypt_key.length
             tmp << xor(str.slice(i,1), encrypt_key.slice(ctr,1)).to_s
            ctr = ctr + 1
        end
        return tmp
    end

    # === Ported Code
    # This code was ported from Ari's Typo 3 Session Encryption
    def encrypt(str)
        encrypt_key = Digest::MD5.digest(rand(32000).to_s)
        ctr = 0
        tmp = ''
        for i in 0...str.length do
            ctr=0 if ctr==encrypt_key.length 
            tmp << encrypt_key.slice(ctr,1) << xor(str.slice(i,1), encrypt_key.slice(ctr,1))
            ctr = ctr + 1
        end
        return Base64.encode64(keyED(tmp))
    end
    def decrypt(str)
        txt = keyED(str)
        tmp = ''
        for i in 0...txt.length do 
            md = txt.slice(i,1)
            i = i + 1
            tmp << xor(txt.slice(i,1),md)
        end
        puts "Decrypte string:#{Base64.decode64(tmp)}EOSTRING"
    end

Güncelleme:

James faydalı cevap dayalı Final çalışan kaynak, büyük sahne! Ve David Garamound için.

def xor(s1,s2)
    raise ArgumentError, "Can't bitwise-XOR a String with a non-String" unless s2.kind_of? String
    raise ArgumentError, "Can't bitwise-XOR strings of different length" unless s1.length == s2.length
    (0..s1.length-1).collect { |i| s1[i] ^ s2[i] }.pack("C*")
end

def keyED(txt,key)
    ctr,tmp = 0,''
    key = Digest::MD5.hexdigest(key)
    for i in 0...txt.length do
        ctr = 0 if ctr == key.length
        str = xor(txt.slice(i,1),key.slice(ctr,1))
        tmp << str
        ctr = ctr + 1
    end

    return tmp
end
def encrypt(txt,key)
    ctr,tmp = 0,''
    ekey = Digest::MD5.hexdigest(rand(32000).to_s)
    for i in 0...txt.length do
        ctr = 0 if ctr == ekey.length
        str = xor(txt.slice(i,1), ekey.slice(ctr,1))
        tmp << ekey.slice(ctr,1) << str
        ctr = ctr + 1
    end
    return Base64.encode64(keyED(tmp,key))
end

1 Cevap

Dan Erik Veenstra:

class String
  def xor(other)
    if other.empty?
      self
    else
      a1        = self.unpack("c*")
      a2        = other.unpack("c*")
      a2 *= 2   while a2.length < a1.length
      a1.zip(a2).collect{|c1,c2| c1^c2}.pack("c*")
    end
  end
end

Sonra kod olur

tmp << str.slice(i,1).xor(encrypt_key.slice(i,1))

Alternatif bir uygulama String#xor, jolierouge tarafından önerilen David Garamond,

class String
  def xor(other)
    raise ArgumentError, "Can't bitwise-XOR a String with a non-String" unless other.kind_of? String
    raise ArgumentError, "Can't bitwise-XOR strings of different length" unless self.length == other.length
    (0..self.length-1).collect { |i| self[i] ^ other[i] }.pack("C*")
  end
end