
Biblioteca escrita íntegramente en Rust para criptografía de clave pública RSA: generación de claves, cifrado/descifrado PKCS#1 v1.5 y OAEP, firmas PSS, además de importación/exportación de claves.
Una implementación portátil de RSA en Rust puro, con esquemas de cifrado y firma especificados en PKCS#1 v2.2 (RFC8017).
| Esquema | Propósito | Especificación |
|---|---|---|
| RSAES-OAEP | Cifrado | RFC8017 §7.1 |
| RSAES-PKCS1-v1_5 | Cifrado | RFC8017 §7.2 |
| RSASSA-PSS | Firmas | RFC8017 §8.1 |
| RSASSA-PKCS1-v1_5 | Firmas | RFC8017 §8.2 |
El cifrado PKCS#1 v1.5 se proporciona únicamente por compatibilidad con aplicaciones heredadas. Se recomienda preferir OAEP y PSS para nuevas aplicaciones de cifrado.
Consulte la advertencia de seguridad a continuación para conocer las vulnerabilidades de implementación conocidas.
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: Si experimenta tiempos de generación de claves inusualmente lentos al usar
RsaPrivateKey::new, puede intentar compilar en modo release o añadir lo siguiente a suCargo.toml. La generación de claves es mucho más rápida al compilar con niveles de optimización más altos, pero esto aumentará un poco el tiempo de compilación.[profile.debug] opt-level = 3
Actualmente en la Fase 1 (v) 🚧
Habrá tres fases antes de que se pueda publicar la versión 1.0 🚢.
Este crate ha recibido una auditoría de seguridad por parte de Include Security, con solo un hallazgo menor que ya ha sido subsanado.
Consulte los [problemas de seguridad abiertos] en nuestro rastreador de problemas para conocer otros problemas conocidos.
En particular, la implementación de [la exponenciación modular no es de tiempo constante],
pero la variabilidad temporal se enmascara mediante [blinding aleatorio], una técnica
de uso común. Este crate es vulnerable al [Ataque Marvin], que podría permitir
la recuperación de la clave privada por parte de un atacante de red (véase RUSTSEC-2023-0071).
Puede seguir nuestro trabajo para mitigar este problema en #390.
Este crate es compatible con Rust 1.85 o superior.
En el futuro la MSRV podrá cambiar, pero se hará con un incremento de versión menor.
Con licencia bajo cualquiera de las siguientes
a su elección.
A menos que usted indique explícitamente lo contrario, cualquier contribución enviada intencionalmente para su inclusión en el trabajo por usted, tal como se define en la licencia Apache-2.0, tendrá doble licencia como se indica arriba, sin términos o condiciones adicionales.