Как получить строку из байтов?
Я пытаюсь сделать дехешер вот такого чуда - 9gn2kfvt9gbptel56u3bjgirumgjfjm1ffo9gl1e7c90etvis0un9i4f4g13jvih.
Но у меня не получается
Мой код:
def hashpass(passsw, salt):
m = hashlib.sha512()
m.update(salt.encode('utf-8'))
m.update(passsw.encode('utf-8'))
byte = m.digest()
len_byte = len(byte)
print('Колицество символов - ' + str(len_byte))
res = ''
for n in range(0, len_byte):
hex_byte = hex((byte[n] & 255) + 256)
res += hex_byte
print(hex_byte)
hashpass('45345345', 'plvbutgseltevdjj')
Вывод: 0x173 0x15b 0x16c 0x1c5 0x1d9 0x115 0x18c 0x165 0x110 0x1a9 0x1cf 0x11f 0x193 0x16c 0x16b 0x159 0x142 ...
Код этой функции на Java (нужно реализовать то же самое на Python):
public static String hashPass(String password, String salt) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(salt.getBytes(StandardCharsets.UTF_8));
byte[] bytes = md.digest(password.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
byte[] var5 = bytes;
int var6 = bytes.length;
for(int var7 = 0; var7 < var6; ++var7) {
byte b = var5[var7];
sb.append(Integer.toString((b & 255) + 256, 32).substring(1));
}
return sb.toString();
} catch (Exception var9) {
var9.printStackTrace();
throw new RuntimeException();
}
}
Ответы (1 шт):
Магическая конструкция Integer.toString((b & 255) + 256, 32).substring(1) - это перевод числа в систему счисления с базой 32 (в которой цифры от 0 до 9 и от a до v - аналогично как в 16-ричной системе цифры от 0 до 9 и от a до f), и взятие последней цифры*.
Можно было записать короче: Integer.toString(b % 32, 32).
На python эту же операцию для одного байта можно выполнить так:
import string
alphabet = string.digits + string.ascii_lowercase
encoded = alphabet[b % 32]
В вашем коде нужно поменять цикл перекодировки:
import string
alphabet = string.digits + string.ascii_lowercase
def hashpass(passsw, salt):
# ...
res = ''
for b in byte:
encoded = alphabet[b % 32]
res += encoded
# print(encoded)
return res
print(hashpass('45345345', 'plvbutgseltevdjj'))
* - строго говоря, цифр начиная со второй, но т.к. для b в диапазоне от 0 до 255 после сложения с 256 в системе с базой 32 в любом случае получится 2 цифры (от 80 до fv), то это будет всегда последняя цифра