¿Cómo se implementa RSA PKCS#1 en Java?
import javax.crypto.Cipher
import java.security.*; >
importar java.security.spec.
importar java.security.spec.RSAPublicKeySpec
importar java.security.spec.RSAPrivateKeySpec
importar java.security.spec.InvalidKeySpecException
importar java.security.interfaces.RSAPrivateKey
importar java.security.interfaces.RSAPublicKey
importar java; .io.*;
import java.math.BigInteger;
/**
* Clase de utilidad RSA. Proporciona métodos para cifrar, descifrar y generar pares de claves.
* Debes visitar http://www.bouncycastle.org para descargar bcprov-jdk14-123.jar.
* Descripción general de los principios de cifrado RSA
* La seguridad RSA se basa en una descomposición de números grandes, donde las claves pública y privada son funciones de dos números primos grandes (números decimales mayores que 100).
* Algunas personas especulan que la dificultad de inferir texto plano a partir de la clave y el texto cifrado es equivalente a factorizar el producto de dos números primos grandes
* ========= === ================================================= === =====
* (La seguridad de este algoritmo no ha sido probada teóricamente)
* ============== ==================================================== ===
* Generación de claves:
* 1. Seleccione dos números primos grandes p, q y calcule n=p*q
* 2. .Seleccione aleatoriamente la clave de cifrado e y requiera que e y (p-1)*(q-1) sean números primos entre sí
* 3. Utilice el algoritmo euclidiano para calcular la clave de descifrado d. que Satisfacer e*d = 1 (mod(p-1)*(q-1)) (donde n y d también deben ser primos relativos)
* 4: De esta manera, la clave pública ( n,e ) y clave privada (n, d)
* * 4: Clave pública (n, e) y clave privada (n, d)
* * 4: Pública La clave (n,e) es la misma que la clave privada (n,d).
)
* ========================================== ==========================
* Métodos de cifrado y descifrado:
* 1. Primero , divida la información cifrada m (binaria) en bloques iguales m1, m2... ...,...,...mi longitud de bloque s (lo más grande posible), donde 2^s * 2: La fórmula de cálculo correspondiente al texto cifrado es: ci = mi^e(mod n) * 3: La fórmula de cálculo de descifrado es: mi = ci^d(mod n) * ====================================== ====== == ====================== * Velocidad RSA * Debido a la gran cantidad de cálculos requeridos , software y hardware, RSA es 100 veces más lento que DES en el caso más rápido. *La velocidad siempre ha sido un inconveniente de RSA. Por lo general, sólo se utiliza para cifrar pequeñas cantidades de datos. * Nombre del archivo: RSAUtil.java * @author Zhao Feng * Versión: 1.0.1 * Descripción: Este algoritmo está tomado de Internet y es una implementación del algoritmo RSA * Hora de creación: 2009-7-10 09:58:16 PM * Descripción del archivo: primero genere dos números primos grandes y luego genere la clave de descifrado de acuerdo con el algoritmo euclidiano */ clase pública RSAUtil { // Par de claves Par de claves privado par de claves = nulo /** * Inicializar; par de claves */ public RSAUtil(){ prueba { this.keyPair = this.generateKeyPair(); /p> } catch (Excepción e) { e.printStackTrace() } } } / ** * Generar par de claves * @return KeyPair * @throws Excepción */ keyPair privado generateKeyPair() lanza una excepción { try { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",new org.bouncycastle.jce .provider.BouncyCastleProvider()) // Este valor está relacionado con el tamaño del bloque de cifrado y se puede cambiar. genKeyPair(); return keyPair; } catch (Excepción e) { lanzar nueva excepción (e.getMessage()); } } Devolver par de claves. } } /** * Generar clave pública * @param módulo p> p> * @param publicExponent * @return RSAPublicKey * @throws Excepción */ < RSAPublicKey privada generarRSAPublicKey(byte[] módulo, byte[] publicExponent) lanza una excepción { KeyFactory keyFac = null try { keyFac = KeyFactory.getInstance; (" RSA", nueva org.bouncycastle.jce.provider.BouncyCastleProvider()); } catch (NoSuchAlgorithmException ex) { throw new Exception(ex.getMessage()) ; } * Prueba * @param args * @throws Excepción */ public static void main(String[] args) throws Exception { RSAUtil rsa = new RSAUtil() String str = "Las ocho partes del Sky y los héroes del cóndor" RSAPublicKey pubKey = rsa.getRSAP publicKey(); RSAPrivateKey priKey = rsa.getRSAPrivateKey(); // System. out.println("Encoder.out.println("Encoder.println("Después del cifrado: "+mw); // System.out.println("Después del descifrado: " ); System.out.println("Después del descifrado == " + new String(rsa.decrypt(priKey,rsa.encrypt(pubKey,str.getBytes())))); } } }
p> p>