сообщения с питона на раст, на питоне используется rsa, на расте она же самая. Версии обеих самые свежие.
Код на питоне (origin это хеш сообщения)
def verify_with_public_key(origin, signature, key):
origin_bytes = bytes(bytearray.fromhex(origin))
signature_bytes = bytes(bytearray.fromhex(signature))
public_key = rsa.PublicKey.load_pkcs1(key.encode())
try:
rsa.verify(origin_bytes, signature_bytes, public_key)
except rsa.VerificationError:
return False
return True
мой код на расте
fn from_hex(s: &str) -> Option<Vec<u8>> {
if s.len() % 2 != 0 {
return None
}
let mut bytearray = Vec::with_capacity(s.len() / 2);
bytearray.resize(s.len()/2, 0);
for i in 0..s.len()/2 {
bytearray[i] = u8::from_str_radix(&s[2*i..2*i + 2], 16).ok()?;
}
return Some(bytearray)
}
fn _verify(origin: &str, signature: &str, key: &str) -> Option<()> {
let origin= from_hex(origin)?;
let signature = from_hex(signature)?;
let public_key = RsaPublicKey::from_pkcs1_pem(key).ok()?;
let padding = PaddingScheme::new_pkcs1v15_sign(None);
public_key.verify(padding, &origin, &signature).ok()
}
fn verify_with_public_key(origin: &str, signature: &str, key: &str) -> bool {
_verify(origin, signature, key) == Some(())
}
Я тестирую на следующих входных данных
let origin = "2c5bbeb3b7b6b0e796d9c502d25d4863731960e872f17c9dbac2fdf3e45ae44f";
let signature = "9121255fac99ed97940588f7ee1a3a1c1f38f078d0bf88c50029cf262f221b53fa132f2eed82818ba16290f96c53a21169c9ff05305a8338df36aab8c47581bc";
let key = "-----BEGIN RSA PUBLIC KEY-----\nMEgCQQDi9PK9mvKdjSIkQZTGtT2oTDJWQPYGdIMR3N4pGghOAOlO3rFtIfQTauvc\nNr7m3+n6uwIoV/87BGj4HEfbpZopAgMBAAE=\n-----END RSA PUBLIC KEY-----\n";
Из хекса origin и signature превращается верно, ключ превращается в одинаковое число, однако rust отвергает, а python принимает. Я не понял, что такое PaddingScheme, сложилось впечатление, что это дополнительная модификация origin
Выяснил, в питоне используется некое unpadded, а мейнтейнер растовской не хочет из-за секурности добавлять поддержку такого
Может, предложить пуллреквест на ансейф метод хотя бы с подробным описанием нужды?
Подумаю, надо с человеком, который в криптографии больше знает обсудить, ошибка у нас или действительно надо.
Просто я обычно стараюсь как-то в ишью с разработчиком это обсудить, чтобы понять его видение на библиотеку.
загуглите про rsa padding oracle attack. Можно еще взять курс криптографии на курсере, там про это было: https://www.coursera.org/learn/crypto?
Я загуглил, но не понял, это атака в случае подписывания одним ключом множества сообщений? У нас технически одним ключом подписывается два хеша
нет, есть возможность подделать подпись сообщения. Но в общем да, если лениво читать самому - пообщайтесь с человеком, который в криптографии больше знает
Обсуждают сегодня