美文网首页
RSA 密码代码演示

RSA 密码代码演示

作者: 滨岩 | 来源:发表于2022-12-20 10:26 被阅读0次

openssl 操作RSA公私钥

//生成1024长度私钥
openssl genrsa -out key.pem 1024
//根据私钥生成公钥,公钥比较短,它只包括了数字n 和 常数 e
openssl rsa -in key.pem -pubout -out pubkey.pem
//公钥对文件进行加密
openssl rsautl -encrypt -in file1.txt -inkey pubkey.pem -pubin -out file2.txt
xxd file2.txt
//私钥解密
openssl rsautl -decrypt -in file2.txt -inkey key.pem

RSA加解密相关API

image.png

最常用的是 PKICSIPADDING

有 生成和导入 没有就使用生成

导入 公钥一般用 X509EncodeKeySpec方式

私钥一般使用PKCS8EncodeKeySpec方式 导入

导入之后 交给 keyFactory 才可以转化为 pubKey 和 privKey

package com.deepway.cryptology.rsa;

import cn.hutool.core.io.FileUtil;
import org.apache.commons.lang3.StringUtils;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import java.io.File;
import java.security.*;
import java.security.spec.EncodedKeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * RSA源码 RSAKeyPairGenerator
 *
 * @author huyanbing
 * @create 2022/12/19 12:27 上午
 */
public class RsaCipher {


    //sun.security.rsa.RSAPadding.padV15
    String algo = "RSA/ECB/PKCS1Padding";
    int keyLen = 1024;
    KeyPair keyPair;


    /**
     * 生成密钥对
     *
     * @return
     */
    public KeyPair generateKeyPair() throws NoSuchAlgorithmException {
        String algo = StringUtils.substringBefore(this.algo, "/");
        KeyPairGenerator generator = KeyPairGenerator.getInstance(algo);

        //1024,2048。。。
        generator.initialize(keyLen);
        KeyPair pair = generator.generateKeyPair();

        System.out.println("generateKeyPair:");
        System.out.println(pair);
        return pair;
    }


    /**
     * 导入密钥
     *
     * @return
     */
    public KeyPair importKeyPair() throws Exception {

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        byte[] pub = FileUtil.readBytes(new File("pub.key"));
        EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pub);
        PublicKey pubKey = keyFactory.generatePublic(publicKeySpec);

        byte[] priv = FileUtil.readBytes(new File("priv.key"));
        //私钥用的是PKCS8EncodedKeySpec
        EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(priv);
        PrivateKey privateKey = keyFactory.generatePrivate(privKeySpec);

        System.out.println("importKeyPair");

        System.out.println(pubKey);
        System.out.println(privateKey);

        return new KeyPair(pubKey, privateKey);

    }


    /**
     * 导出密钥到文件
     */
    public void exportKey() {
        FileUtil.writeBytes(keyPair.getPublic().getEncoded(), new File("pub.key"));
        FileUtil.writeBytes(keyPair.getPrivate().getEncoded(), new File("priv.key"));
    }


    /**
     * 加密方法
     *
     * @param plainText
     * @return
     */
    public byte[] encrypt(byte[] plainText) throws GeneralSecurityException {
        Cipher cipher = Cipher.getInstance(algo);
        //使用加密模式  公钥
        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
        return cipher.doFinal(plainText);
    }

    /**
     * 解密方法
     *
     * @param cipherText
     * @return
     * @throws GeneralSecurityException
     */
    public byte[] decrypt(byte[] cipherText) throws GeneralSecurityException {
        Cipher cipher = Cipher.getInstance(algo);
        //使用解密模式 私钥
        cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());

        return cipher.doFinal(cipherText);

    }


    public static void main(String[] args) throws Exception {


        RsaCipher bob = new RsaCipher();

        //bob.keyPair = bob.importKeyPair();

        bob.keyPair = bob.generateKeyPair();
        bob.exportKey();

        //Alice:
        RsaCipher alice = new RsaCipher();
        alice.keyPair = new KeyPair(bob.keyPair.getPublic(), null);

        byte[] y = alice.encrypt("Deepway  is  no 1".getBytes());

        //Bob:
        byte[] x = bob.decrypt(y);

        //解密为
        System.out.println(new String(x));

    }
}

源码解读 RSAKeyPairGenerator

image.png image.png image.png

计算 phi=(p-1)*(q-1)

image.png

e 和 phi的最大公约数是1

image.png

确保 e 和 phi 是互质的

计算私钥d 是e 关于phi_n的模反元素

image.png

优化rsa

            // private exponent d is the inverse of e mod phi
            BigInteger d = e.modInverse(phi);

            // 性能优化 提前计算
            // 1st prime exponent pe = d mod (p - 1)
            BigInteger pe = d.mod(p1);
            // 2nd prime exponent qe = d mod (q - 1)
            BigInteger qe = d.mod(q1);

            // crt coefficient coeff is the inverse of q mod p
            BigInteger coeff = q.modInverse(p);

使用 n 、e 生成公钥

image.png

使用了CRT中国剩余定理来优化rsa 计算性能

使用 n 、e 、d ,p ,q ,加上优化的pe,qe,coeff 生成私钥

相关文章

  • RSA 密码代码演示

    openssl 操作RSA公私钥 RSA加解密相关API 最常用的是 PKICSIPADDING 有 生成和导入 ...

  • iOS逆向之RSA加密(上)

    本文主要介绍RSA的数学原理、以及RSA的代码演示 引子 密码学 是指研究信息加密、破解密码的技术科学。最早可以追...

  • iOS逆向之RSA加密(下)

    本文主要介绍RSA的代码演示过程 RSA代码演示 前提:准备好公钥、私钥,需要在终端生成(属于自己签名) 另外作为...

  • RSA-Pycrypto

    RSA 密码算法与签名RSA是一种公钥密码算法,RSA的密文是对代码明文的数字的 E 次方求mod N 的结果。也...

  • 14-正则表达式

    一、破解密码 排列 代码演示: 2.组合 代码演示: 3.排列组合 代码演示: 二、正则表达式 1.引入案例 代码...

  • Mac 配置SSH 后 仍需要输入密码解决办法

    下载最新的sourceTree 后 发现每次拉取代码都需要输入密码。原因可能是未将 ~/.ssh/id_rsa添加...

  • 2019-10-26

    今天做了rsa密码学实验!

  • 14-正则表达式

    一、破解密码 1. 排列 代码演示:import itertools#1。排列 1,2,3 # 从n个不同的...

  • Python基础-day16

    一、破解密码 1. 排列 代码演示:import itertools#1。排列 1,2,3 # 从n个不同的...

  • 72.加密解密(MD5 SHA1 BASE64 RSA)(二)

    rsa非对称加密解密 rsa要稍微复杂一下,因为rsa需要使用openssl ,是目前最流行的 SSL 密码库工具...

网友评论

      本文标题:RSA 密码代码演示

      本文链接:https://www.haomeiwen.com/subject/zznsqdtx.html