Hello!
I don’t know Ruby but I need to understand how the input value is manipulated in the lines below.
I think that the input is converted to the sum of the values of its characters but the second line is confusing; does it take the final value of the sum and perform the bitwise operations or per iteration? Could you provide a simple explanation of the steps followed?
Thank you in advance!
input.to_s.each_char.inject(0) do |sum, ch|
(sum << 8) ^ (ch.ord) ^ (sum >> 4)
"100".to_s.each_char.inject(0) { |sum, ch|
p [sum,ch.ord]
(sum << 8) ^ (ch.ord) ^ (sum >> 4)
}
[0, 49]
[49, 48]
[12595, 48]
=> 3223587
ch.ord is the binary value of a character
^ is exclusive OR ( XOR) between 2 numbers
‘<< 1’ is shifting a (binary) number (mulltiply it by 2)
‘>> 1’ is right shifting a (binary) number (div it by 2)
the value of the last expression of the bloc is the new value of ‘sum’, and the value returned by inject().
sum << 8 is shift of one octet the current ‘sum’ value.
(ch.ord) ^ (sum >> 4) is XOR between number value of curent character XOR current sum divided by 16
"100".to_s.each_char.inject(0) { |sum, ch|
newsum= (sum << 8)
encoded_byte_value = (ch.ord) ^ (sum >> 4)
( newsum ^ encoded_byte_value )
}
So the result is a bignum wich is a encryption of the string value of ‘imput’ data.
Which encryption ? that is the question
1 Like
Thanks a lot for the explanation!
It is actually an approach of string hashing.