首页 > 其他分享 >RSA 加解密

RSA 加解密

时间:2022-10-25 15:55:52浏览次数:48  
标签:公钥 私钥 String Base64 加解密 RSA import

依赖

  <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>

代码

import org.apache.commons.codec.binary.Base64;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
/**
 * Hello RSA!
 *
 */
public class RSAUtils {
    private static Map<Integer,String> keyMap=new HashMap<>();

    public static void main( String[] args ) throws Exception {
        //生成公钥和私钥
//        getKeyPair();
        //加密字符串
        String password="3";
        String pub = "MIGfMA0GCSqGSIbxn/KV5/gdt1KlKTmeLDqj3ai6loqEMW/qYKHmXxO8E3++5gIW6FOCj/KkT+4laTxhoQwXDRdmuoRxF3oXnrMx3/w4zz2MwNFGC7XQmiQJQhtwzJnDGr8fCPQIDAQAB";
        String pri = "MIICeAIBADQ1v8HJ4FD4FXh1bf8mX4pC3bGf8pXn+B23UqUpOZ9QBh2LG8X8mtipFFVQYTS0okRsyUKmcGxNLkGxL3rKQSB56fcA6TV+bbfjXrNLnWo3+H0r5r2+OWvm01/KLFe3R69HJCgDNuRjSWUr9j/1Vb83FYCTT3NyTAyjoi9fvGql+178noSOmDPoUsYl/9557Pkpk/NPCpOnVO4QJBAObd1i9P2W40MbmRTwGGZN8aOayCHBabtrq14NZ/njvlk7JYxt6gMBj0eG3PfXxT+gpaZi1QSEuEyN6unN+mL4cCQQCziDouqX9om5PZkEucwFJtXoxqv0+pNDSwoLx7kto0ch7IDCAc3c0l39dAFqKLsNVZKwUZbYCSncKI0XV1AwkbAkEAiZpzjSOUv0DQ2oAnjQsjmG6zLYUnZLpPAZ5icrcCA0Vk8QpFDnB/+n/MP/dKHg6XnBAhkqSlUo3EhCWjTxJohQJBAKogtcHyLSJcC8dnzb9FINczeazOjhaxuhyGtRYFG3IHktPPab7xEK6LZ9b7nBzz/bj542MtOWG2zdoJY1z2+3ECQQC1soAOuQ/c4zPnAoJKQ5GIqPOrHvrqTrcIEa5Xkf61Mn501Oa0GXDHpUsynuKNHmGSRXERA6TqahY+6zPm8a4O";
        System.out.println("随机生成的公钥为:" + pub);
        System.out.println("随机生成的私钥为:"+ pri);
        String passwordEn=encrypt(password,pub);
        System.out.println(password+"\t加密后的字符串为:"+passwordEn);
        String passwordDe=decrypt(passwordEn,pri);
        System.out.println("还原后的字符串为:"+passwordDe);
    }
    /**
     * 随机生成密钥对
     * @throws NoSuchAlgorithmException
     */
    public static void getKeyPair() throws Exception {
        //KeyPairGenerator类用于生成公钥和密钥对,基于RSA算法生成对象
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        //初始化密钥对生成器,密钥大小为96-1024位
        keyPairGen.initialize(1024,new SecureRandom());
        //生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();//得到私钥
        PublicKey publicKey = keyPair.getPublic();//得到公钥
        //得到公钥字符串
        String publicKeyString=new String(Base64.encodeBase64(publicKey.getEncoded()));
        //得到私钥字符串
        String privateKeyString=new String(Base64.encodeBase64(privateKey.getEncoded()));
        //将公钥和私钥保存到Map
        keyMap.put(0,publicKeyString);//0表示公钥
        keyMap.put(1,privateKeyString);//1表示私钥
    }
    /**
     * RSA公钥加密
     *
     * @param str
     *            加密字符串
     * @param publicKey
     *            公钥
     * @return 密文
     * @throws Exception
     *             加密过程中的异常信息
     */
    public static String encrypt(String str,String publicKey) throws Exception {
        //base64编码的公钥
        byte[] decoded = Base64.decodeBase64(publicKey);
        RSAPublicKey pubKey= (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
        //RAS加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE,pubKey);
        String outStr=Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
        return outStr;
    }

    /**
     * RSA私钥解密
     *
     * @param str
     *            加密字符串
     * @param privateKey
     *            私钥
     * @return 铭文
     * @throws Exception
     *             解密过程中的异常信息
     */
    public static String decrypt(String str,String privateKey) throws Exception {
        //Base64解码加密后的字符串
        byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
        //Base64编码的私钥
        byte[] decoded = Base64.decodeBase64(privateKey);
        PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
        //RSA解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE,priKey);
        String outStr=new String(cipher.doFinal(inputByte));
        return outStr;

    }
}

 

标签:公钥,私钥,String,Base64,加解密,RSA,import
From: https://www.cnblogs.com/dongma/p/16825113.html

相关文章

  • AES 加解密
    依赖<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency>代码importorg.apa......
  • 基于Spring AOP切面实现请求入参出参加解密
    1.Mavne导入加密解密所需的依赖<dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>1.3.2</version></dep......
  • Universal Atomic Swaps: Secure Exchange of Coins Across All Blockchains
    UniversalAtomicSwaps:SecureExchangeofCoinsAcrossAllBlockchainsThyagarajanSAK,MalavoltaG,Moreno-SánchezP.Universalatomicswaps:Secureexc......
  • RSA模数N因式分解
    模数N:76190944763750744276324637081713604133996627079343036558766297773626553110133339218840357338899477334506916191247358315960473469143548854697860991695126......
  • [Typescript] 59. Medium - InorderTraversal
    Implementthetypeversionofbinarytreeinordertraversal.Forexample:consttree1={val:1,left:null,right:{val:2,left:{val:......
  • ctfshow CRYPTO RSA系列
    ctfshowCRYPTORSA系列目录ctfshowCRYPTORSA系列babyRSA分析解题esayrsa1分析解题esayrsa2分析解题esayrsa3分析共模攻击解题babyRSA题目:e=65537p=10404683571......
  • [NPUCTF2020]EzRSA
    [NPUCTF2020]EzRSA题目:fromgmpy2importlcm,powmod,invert,gcd,mpzfromCrypto.Util.numberimportgetPrimefromsympyimportnextprimefromrandomimpo......
  • [GKCTF2021]RRRRSA
    [GKCTF2021]RRRRSA题目fromCrypto.Util.numberimport*fromgmpy2importgcdflag=b'xxxxxxxxxxxxx'p=getPrime(512)q=getPrime(512)m=bytes_to_long(fl......
  • 学习RSA非对称加密
    RSA非对称加密参考李永乐老师的讲解:https://www.bilibili.com/video/BV1Ts411H7u9/?spm_id_from=333.999.0.0首先RSA是基于在数学上分解一个大数的质因数分解是很困难......
  • HDU-1520 Anniversary party(树形DP)
    AnniversarypartyTimeLimit:2000/1000MS(Java/Others)MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):7566AcceptedSubmission(s):3321P......