Pero digamos que quiero que el servidor cifre los datos utilizando la clave privada y los descifre utilizando la clave pública, como una forma de distribuir los datos que se pueden verificar que provienen del servidor correcto.
Puede hacer esto: esto es, a un nivel muy simplista, cómo funciona la firma RSA (tenga en cuenta que es un poco más).
En lugar de modificar el código para permitir esto, ¿puedo simplemente publicar la clave privada y mantener la clave pública en secreto? ¿Esto afecta la seguridad del sistema?
Usted no necesita publicar la clave privada, RSA es una permutación trampilla que significa:
- Si cifras con una clave pública, puedes descifrar con la clave privada.
- Si cifras con una clave privada, puedes descifrar con una clave pública.
Por lo tanto, RSA admite la firma y el cifrado basándose en que el usuario final tiene solo la clave pública.
En su caso, si el cliente desea verificar que los datos provienen del servidor, usted aplica el segundo caso de RSA y descifra los datos de la firma usando la clave pública que ya tiene.
Además, debido a que es una permutación, no debería necesitar modificar su código en absoluto. Ambas teclas deben funcionar utilizando la misma función. Espero que cualquier biblioteca criptográfica decente tenga API para verificar firmas de acuerdo con los diferentes estándares que existen, uno de estos probablemente sea una buena apuesta.
Los laboratorios RSA proporcionan una buena explicación de esto .
Si desea extender esto entre servidores o verificar la comunicación con el cliente, genere claves para cada entidad e intercambie las públicas. El proceso se puede utilizar en ambos extremos.
Hablando teóricamente, e y d son intercambiables (por eso RSA funciona) (uno debe ser designado como secreto y mantenerse en secreto) pero p y q deben siempre mantenerse en secreto ya que le permiten derivar d desde e y viceversa. Sin embargo, debe ser extremadamente cuidadoso al entender la clave privada. ¿Su software almacena p / q en la clave privada? Si es así, no puedes publicarlo como está. Además, cuando digo intercambiable, una vez que publiques uno de ese par (eod junto con tu módulo n) debes proteger al otro con tu vida . Hablando prácticamente como Graeme vinculado en el los comentarios e a menudo se eligen como un valor pequeño / fijo. Mi comentario sobre que e / d es intercambiable claramente no se aplica cuando e se determina fácilmente. Hacer este tipo de cosas por lo tanto tiene el potencial de confusión y mala implementación. Utilice una biblioteca de terceros / no comience a publicar claves privadas.