
Biblioteca Rust pura para criptografia de chave pública RSA: geração de chaves, criptografia/descriptografia PKCS#1 v1.5 e OAEP, assinaturas PSS, além de importação/exportação de chaves.
Uma implementação portátil de RSA em Rust puro, com esquemas de encriptação e assinatura especificados em PKCS#1 v2.2 (RFC8017).
| Esquema | Finalidade | Especificação |
|---|---|---|
| RSAES-OAEP | Encriptação | RFC8017 §7.1 |
| RSAES-PKCS1-v1_5 | Encriptação | RFC8017 §7.2 |
| RSASSA-PSS | Assinaturas | RFC8017 §8.1 |
| RSASSA-PKCS1-v1_5 | Assinaturas | RFC8017 §8.2 |
A encriptação PKCS#1 v1.5 é fornecida apenas para compatibilidade com aplicações legadas. Prefira OAEP e PSS para novas aplicações de encriptação.
Consulte o aviso de segurança abaixo para vulnerabilidades de implementação conhecidas.
use rsa::{Oaep, RsaPrivateKey, RsaPublicKey};
use sha2::Sha256;
let mut rng = rand::rng();
let bits = 2048;
let priv_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
let pub_key = RsaPublicKey::from(&priv_key);
// Encrypt
let data = b"hello world";
let enc_data = pub_key.encrypt(&mut rng, Oaep::<Sha256>::new(), &data[..]).expect("failed to encrypt");
assert_ne!(&data[..], &enc_data[..]);
// Decrypt
let dec_data = priv_key.decrypt_blinded(&mut rng, Oaep::<Sha256>::new(), &enc_data).expect("failed to decrypt");
assert_eq!(&data[..], &dec_data[..]);
Nota: Se você encontrar um tempo de geração de chaves anormalmente lento ao usar
RsaPrivateKey::new, você pode tentar compilar em modo release ou adicionar o seguinte ao seuCargo.toml. A geração de chaves é muito mais rápida ao compilar com níveis de otimização mais altos, mas isso aumentará um pouco o tempo de compilação.[profile.debug] opt-level = 3
Atualmente na Fase 1 (v) 🚧
Haverá três fases antes que a versão 1.0 🚢 possa ser lançada.
Este crate passou por uma auditoria de segurança pela Include Security, com apenas uma descoberta menor que já foi corrigida.
Consulte as [issues de segurança abertas] no nosso rastreador de issues para outros problemas conhecidos.
Notavelmente, a implementação da [exponenciação modular não é de tempo constante],
mas a variabilidade de tempo é mascarada usando [blinding aleatório], uma técnica
comumente utilizada. Este crate é vulnerável ao [Ataque Marvin], que poderia permitir
a recuperação da chave privada por um atacante de rede (veja RUSTSEC-2023-0071).
Você pode acompanhar nosso trabalho na mitigação deste problema em #390.
Este crate suporta Rust 1.85 ou superior.
No futuro, a MSRV pode ser alterada, mas isso será feito com um incremento de versão menor.
Licenciado sob qualquer uma das seguintes
à sua escolha.
A menos que você declare explicitamente o contrário, qualquer contribuição intencionalmente submetida para inclusão no trabalho por você, conforme definido na licença Apache-2.0, será licenciada duplamente como acima, sem quaisquer termos ou condições adicionais.