Хеш RIPEMD160 в Matlab

Я пытаюсь вычислить хэш RIPEMD160 в Matlab для некоторых данных, представленных шестнадцатеричной строкой. Я нашел следующий класс Java и скомпилировал его для JVM 1.6

http://developer.nokia.com/Community/Wiki/RIPEMD160_encryption_in_JavaME

следующий код прекрасно работает в Matlab для хэширования строк:

clear all

% add folder with class file to java path 
functions_folder = strcat(pwd,filesep,'functions'); 
javaaddpath(functions_folder)

% string to hash 
string_to_hash = 'test12345';

% convert to java String 
str_to_hash_java = javaObject('java.lang.String',uint8(string_to_hash));

% pass in string and convert output to char array 
mystr = char(RIPEMD160.RIPEMD160String(str_to_hash_java))

Теперь моя проблема возникает, когда я пытаюсь хэшировать некоторые двоичные данные, представленные шестнадцатеричной строкой. Вывод хеша верен для шестнадцатеричных значений 7f или меньше, но как только у меня будет 8 бит (>= 80), он больше не дает правильного ответа. Я не могу найти проблему. Вот мой код:

clear all

% add folder with class file to java path
functions_folder = strcat(pwd,filesep,'functions');
javaaddpath(functions_folder)

% data to hash in hex format
hex_string_in = '80';

hex_string_in_length = length(hex_string_in);

% split every to characters and calculate the data in each byte
for i=1:hex_string_in_length/2
    data_uint8_array(1,i) = uint8(hex2dec(hex_string_in(2*i-1:2*i)));
end

% constructor
x = RIPEMD160;

% pass in binary data
x.update(data_uint8_array)

% get hash in binary format
hash_out_bin = x.digestBin();

% typecast binary data into unit8 primitive
hash_out_unit8=typecast(hash_out_bin,'uint8');

% convert to hex
hash_out_hex = dec2hex(hash_out_unit8)';

% pad with zeros if bytes all smaller than hex(80)
if(size(hash_out_hex,1))==1
    hash_out_hex=[repmat('0',[1 size(hash_out_hex,2)]);hash_out_hex];
end

% final formatting, convert to lowercase
hash_out_hex = lower(hash_out_hex(:)')

для ввода '7f' выдает правильный хеш c8297aad716979548921b2e8e26ca8f20061dbef

но для '80' вместо правильного результата вы получите e633ca40d977e24a1ffd56b7a992e99b48d13359 b436441e6bb882fe0a0fa0320cb2d97d96b4d1bc

Благодарю.

1 ответ

Вы передаете строки в свой Java-код вместо обычных байтовых массивов. Не все байты являются представлениями допустимых кодировок символов. Поэтому вы можете потерять информацию. Только байты хеша, без преобразования. Если требуются строки, используйте кодирование / декодирование base 64.

str_to_hash_java не должно быть нужно.

Другие вопросы по тегам