关于RSA使用的正确姿势

本文主要是针对网上的常见RSA加密不能指定密钥的坑....

 

RSA可通过这种方式生成密钥:

/**

* 随机生成公钥和私钥
*/

public static final String publicKeyString = "publicKeyString";
public static final String privateKeyString = "privateKeyString";


public static HashMap<String, String> getRandomKey() throws NoSuchAlgorithmException, InvalidKeySpecException{
  KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
  keyPairGen.initialize(1024);//生成大小 1024
  KeyPair keyPair = keyPairGen.generateKeyPair();
  RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//获取公钥
  RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//获取私钥
  HashMap<String, String> keyMap = new HashMap<String, String>();
  keyMap.put(publicKeyString, Base64.encodeToString(publicKey.getEncoded(), Base64.DEFAULT));//获取公钥Base64编码
  keyMap.put(privateKeyString, Base64.encodeToString(privateKey.getEncoded(), Base64.DEFAULT));//获取密钥Base64编码
  return keyMap;
}

公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCa3+L0QRaExWO6m28pkLvp/c+XRQ/7ZM8DSJ+HAysytAimnn0ouDUFCy1jcLCQLgcaR9WVqBsPHigZJYwMo6/nd5upwP63BfvZoPnhgK216atkStUKDtmMS2TLnJptjtZcb0g8K+zsbTvYPpv3g+1N7rWgCD4zEtVm/LMyZ7NURwIDAQAB


私钥:
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJrf4vRBFoTFY7qbbymQu+n9z5dFD/tkzwNIn4cDKzK0CKaefSi4NQULLWNwsJAuBxpH1ZWoGw8eKBkljAyjr+d3m6nA/rcF+9mg+eGArbXpq2RK1QoO2YxLZMucmm2O1lxvSDwr7OxtO9g+m/eD7U3utaAIPjMS1Wb8szJns1RHAgMBAAECgYAs4i+S2/4bslzpqrw3jpN3B7COxVwRXjDEYdqhtSBizFwpdYsOLvxmnsujovf4gO5cBm92tMZKxlGWoBQLYbDLbqpGrVnlX1StDKevuUxSf8Z5EVhQm589hdhG0XCaCJa2S9HiIXh66IZMJ6lbyPtMD1gWXSdfF2nfmuCDL8bVIQJBAOMzUzzMW2+l38iYVNOvtbB+bcN3mCOcr6uGO5fGTqUvcaTDfckDuIrNAJiTqEWh+BGvTQfXmrKOp0JNgcPwfbECQQCugZQvrYeGS6xTNy5WwVKd9LSKLUlSciCi+OCgAKy+9/PNFy0pocYx97xhviFpTbUDlct/WKQ6CbQxmc+i/hd3AkEA2s3UDMpWCJj7gkjJ8K/YT2gCt2tWtn0wZQS6IXnWxZiCXoXyfoM511qEh2w0cxMAP6/OhI3sKqfdhqn0HcpekQJBAJUX3rzRfP3Pf57lgXDb4TNVVD7OLFwFaD71di0eBnlurV0nlQ2Byyz75XZ5FGC85I/4lpHp8P4pNkw+hrlScEcCQF/iNadXt9QZWqutrGLC3nwyBBki5y6zPsYTG9N36UgrH2DyVqHe/pOzWv239akD2sAaCxgg77j2Y+vZCVtSyXI=

 

重点来了,获取私钥公钥很简单,重要的是怎么把这点字符串再设置进去~

 

/**
* 通过字符串生成私钥
*/
public static PrivateKey getPrivateKey(String privateKeyData){
  PrivateKey privateKey = null;
  try {
    byte[] decodeKey = Base64.decode(privateKeyData,Base64.DEFAULT); //将字符串Base64解码
    PKCS8EncodedKeySpec x509= new PKCS8EncodedKeySpec(decodeKey);//创建x509证书封装类
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");//指定RSA
    privateKey = keyFactory.generatePrivate(x509);//生成私钥
  } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
  } catch (InvalidKeySpecException e) {
    e.printStackTrace();
  }
   return privateKey;
}

 

/**
* 通过字符串生成公钥
*/
public static PublicKey getPublicKey(String publicKeyData){
  PublicKey publicKey = null;
  try {
    byte[] decodeKey = Base64.decode(publicKeyData, Base64.DEFAULT);
    X509EncodedKeySpec x509 = new X509EncodedKeySpec(decodeKey);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    publicKey = keyFactory.generatePublic(x509);
  } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
  } catch (InvalidKeySpecException e) {
    e.printStackTrace();
  }
  return publicKey;
}

 搞定,拿到了私钥公钥...你懂得 ,开始加密解密...

 

/**
* 加密
*/
public static byte[] encrypt(String data,Key key){
  try {
    //取公钥
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return cipher.doFinal(data.getBytes());
  } catch (Exception e) {
    e.printStackTrace();
  }
    return null;
  }

/**
* 解密
*/
public static byte[] decrypt(byte[] data,Key key){
  try {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, key);
    return cipher.doFinal(data);
  } catch (Exception e) {
    e.printStackTrace();
  }
  return null;
}

 

转载于:https://www.cnblogs.com/ppldev/p/5110667.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值