Algoritmo RSA (cifrado y descifrado)

Introducción al algoritmo RSA:

        El algoritmo RSA es el algoritmo de cifrado RSA, que es un algoritmo de cifrado asimétrico . RSA es ampliamente utilizado en cifrado de clave pública y comercio electrónico . RSA 1977 por el Ronald Rivest (Ron Rivest), Adi Shamir (Adi Shamir) y Leonard Adleman (Leonard Adleman) presenta junto. RSA se compone de las letras de los tres. En 1973, Clifford Cocks, un matemático que trabajaba en la sede de comunicaciones del gobierno británico , propuso un algoritmo idéntico en un documento interno, pero sus hallazgos fueron clasificados como confidenciales hasta 1997. Publicar RSA es un algoritmo de cifrado de clave pública muy influyente ahora. Puede resistir la mayoría de los ataques criptográficos conocidos. ISO lo ha recomendado como un estándar de cifrado de datos de clave pública. A partir de 2008, no existe una forma confiable de atacar el algoritmo RSA en el mundo. Mientras la longitud de la clave sea lo suficientemente larga, la información cifrada con RSA no se puede romper. 

Velocidad:

Debido a que todos los cálculos son números grandes, el RSA más rápido es varias veces más lento que el DES, ya sea software o hardware. La velocidad siempre ha sido un inconveniente de RSA. Generalmente solo se usa para una pequeña cantidad de cifrado de datos. La velocidad de RSA es aproximadamente 1000 veces más lenta que el algoritmo criptográfico simétrico correspondiente al mismo nivel de seguridad.

Seguridad:

La seguridad de RSA depende de la descomposición de grandes números, pero no se ha demostrado teóricamente si es equivalente a la descomposición de grandes números, porque no hay pruebas de que la descomposición de RSA requiera una gran descomposición de números. Supongamos que hay un algoritmo que no necesita descomponer números grandes, entonces ciertamente puede modificarse en un algoritmo de descomposición de números grandes. Se ha demostrado que algunas variantes de RSA son equivalentes a la descomposición de gran número. En cualquier caso, factorizar n es el método de ataque más obvio. Las personas han podido resolver números primos grandes con múltiples decimales . Por lo tanto, el módulo n debe elegirse más grande, dependiendo de la aplicación específica.

                                                                                                                                                               ------ El contenido anterior está tomado de la Enciclopedia Sogou

Implementación de código:

paquete com.huadian.encrytionanddecrytion; 

import java.io.UnsupportedEncodingException; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 
import java.security.SecureRandom; 
import java.util.Scanner; 

import javax.crypto.BadPaddingException; 
importar javax.crypto.Cipher; 
import javax.crypto.IllegalBlockSizeException; 
importar javax.crypto.KeyGenerator; 
import javax.crypto.NoSuchPaddingException; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.SecretKeySpec;
RSA de clase pública { 
        / ** 
         * 加密
         * 
         * @param content 
         * 需要 加密 的 内容
         * @param contraseña 
         * 加密 密码
         * @return 
         * / 
        public static byte [] encrypt (String content, String password) { 
            try { 
                KeyGenerator kgen = KeyGenerator.getInstance ("AES"); 
                kgen.init (128, nuevo SecureRandom (password.getBytes ())); 
                SecretKey secretKey = kgen.generateKey (); 
                byte [] enCodeFormat = secretKey.getEncoded (); 
                SecretKeySpec key = new SecretKeySpec (enCodeFormat, "AES");
                Cipher cipher = Cipher.getInstance ("AES"); // 创建 密码 器
                byte [] byteContent = content.getBytes ("utf-8"); 
                cipher.init (Cipher.ENCRYPT_MODE, clave); // 初始化
                byte [] result = cipher.doFinal (byteContent); 
                resultado de retorno; // 加密
            } catch (NoSuchAlgorithmException e) { 
                e.printStackTrace (); 
            } catch (NoSuchPaddingException e) { 
                e.printStackTrace (); 
            } catch (InvalidKeyException e) { 
                e.printStackTrace (); 
            } catch (UnsupportedEncodingException e) { 
                e.printStackTrace ();
            } catch (IllegalBlockSizeException e) { 
                e.printStackTrace (); 
            } catch (BadPaddingException e) {
                e.printStackTrace (); 
            } 
            return null; 
        }
/**
 * 解密
 *
 * @param content
 *            待解密内容
 * @param password
 *            解密密钥
 * @return
 */
public static byte[] decrypt(byte[] content, String password) {
    try {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128, new SecureRandom(password.getBytes()));
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        Cipher cipher = Cipher.getInstance("AES");// 创建密码器
        cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
        byte[] result = cipher.doFinal(content);
        return result; // 加密
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    }
    return null;
}
/**
 * 将二进制转换成16进制
 *
 * @param buf
 * @return
 */
public static String parseByte2HexStr(byte buf[]) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < buf.length; i++) {
        String hex = Integer.toHexString(buf[i] & 0xFF);
        if (hex.length() == 1) {
            hex = '0' + hex;
        }
        sb.append(hex.toUpperCase());
    }
    return sb.toString();
}
/**
 * 将16进制转换为二进制
 *
 * @param hexStr
 * @return
 */
public static byte[] parseHexStr2Byte(String hexStr) {
    if (hexStr.length() < 1)
        return null;
    byte[] result = new byte[hexStr.length() / 2];
    for (int i = 0; i < hexStr.length() / 2; i++) {
        int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
        int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
        result[i] = (byte) (high * 16 + low);
    }
    return result;
}
/**
 * 加密
 *
 * @param content
 *            需要加密的内容
 * @param password
 *            加密密码
 * @return
 */
public static byte[] encrypt2(String content, String password) {
    try {
        SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        byte[] byteContent = content.getBytes("utf-8");
        cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
        byte[] result = cipher.doFinal(byteContent);
        return result; // 加密
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    }
    return null;
}
 public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println("请输入要加密的内容和密码");
        System.out.println("请输入要加密的密码");
        Scanner scanner = new Scanner(System.in);
        String content = scanner.next();
        String password = scanner.next();

       // String content = "我是shoneworn";
       // String password = "12345678";
        // 加密
        System.out.println("加密前:" + content);
        byte[] encode = encrypt(content, password);

        //传输过程,不转成16进制的字符串,就等着程序崩溃掉吧
        String code = parseByte2HexStr(encode);
        System.out.println("密文字符串:" + code);
        byte[] decode = parseHexStr2Byte(code);
        // 解密
        byte[] decryptResult = decrypt(decode, password);
        System.out.println("解密后:" + new String(decryptResult, "UTF-8")); //不转码会乱码

    }
}
发布了105 篇原创文章 · 获赞 536 · 访问量 7万+

Supongo que te gusta

Origin blog.csdn.net/qq_41934990/article/details/81872715
Recomendado
Clasificación