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