Java RSA 加密

本文深入探讨了Java中RSA加密技术的原理和实现过程,包括密钥对生成、加密和解密操作,并且特别关注了在Android环境下如何进行RSA加解密。通过实例代码,详细解析了每个步骤,为开发者提供了实用的参考。
摘要由CSDN通过智能技术生成

什么是Rsa加密?

RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。

RSA算法原理如下:

1.随机选择两个大质数p和q,p不等于q,计算N=pq; 
2.选择一个大于1小于N的自然数e,e必须与(p-1)(q-1)互素。 
3.用公式计算出d:d×e = 1 (mod (p-1)(q-1)) 。
4.销毁p和q。

最终得到的N和e就是“公钥”,d就是“私钥”,发送方使用N去加密数据,接收方只有使用d才能解开数据内容。

RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,这是RSA最大的缺陷,因此通常只能用于加密少量数据或者加密密钥,但RSA仍然不失为一种高强度的算法。

 

该如何使用呢?

package com.wallet.util;

 

import java.math.BigInteger;

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.security.Signature;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import java.security.spec.InvalidKeySpecException;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.RSAPrivateKeySpec;

import java.security.spec.RSAPublicKeySpec;

import java.security.spec.X509EncodedKeySpec;

import java.util.Base64;

import java.util.HashMap;

import java.util.Map;

 

import javax.crypto.Cipher;

 

import org.apache.commons.codec.DecoderException;

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

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

/**

 * RSA 加解密

 * 

 * 参数在经过Http传输后会对部分特殊字符进行转义, 所以在接收参数后需进行解码    String value = URLDecoder.decode("param", "UTF-8");

 * 参数在进行Http传输前需对参数进行编码转义操作, String value = URLEncoder.encode("param", "UTF-8");

 * Java 1.8+ 原生支持 Base64, 1.7及以下需导包    安卓原生支持 Base64    

 */

public class RSA {

 

// 创建日志记录对象

private static final Logger LOGGER = LoggerFactory.getLogger(RSA.class);

 

// 声明非对称加密密钥算法

public static final String RSA = "RSA";

// 声明编码集

public static final String CODE = "UTF-8";

// 秘钥长度

public static final Integer KEY_SIZE = 2048;

// 声明签名标准

public static final String SHA1WITHRSA = "SHA1WithRSA";

// 加密填充方式, 该属性安卓有效, Java使用RSA加密后, 安卓使用该属性解密, 因安卓和 Java RSA 协议不同

public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";

 

// 声明秘钥工厂对象

private static KeyFactory keyFactory = null;

// 声明公钥对象

private static RSAPublicKey publicKey = null;

// 声明私钥对象

private static RSAPrivateKey privateKey = null;

 

/**

* 静态代码块, 初始化秘钥工厂对象

*/

static {

try {

// 创建秘钥工厂

keyFactory = KeyFactory.getInstance(RSA);

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

}

 

/**

* 使用公钥字符获取公钥对象

* @param publicKeyString 公钥字符串

* @return 公钥对象

*/

public static RSAPublicKey getPublicKey(String publicKeyString) {

// 把公钥字符串数据加载到秘钥对象中

X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyString));

try {

// 获取公钥对象

publicKey = (RSAPublicKey) keyFactory.generatePublic(x509EncodedKeySpec);

} catch (InvalidKeySpecException e) {

e.printStackTrace();

}

// 将结果返回

return publicKey;

}

 

/**

* 使用私钥字符获取私钥对象

* @param publicKeyString 私钥字符串

* @return 私钥对象

*/

public static RSAPrivateKey getPrivateKey(String privateKeyString) {

// 把私钥字符串数据加载到秘钥对象中

PKCS8EncodedKeySpec pKCS8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-每天进步一点点-

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值