java rsa加密算法_RSA加密算法--Java实现详细案例:

importorg.apache.commons.codec.binary.Base64;import java.security.*;importjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;importjava.util.HashMap;importjava.util.Map;importjavax.crypto.Cipher;/*** Created by humf.需要依赖 commons-codec 包*/

public classRSACoder {public static final String KEY_ALGORITHM = "RSA";public static final String SIGNATURE_ALGORITHM = "MD5withRSA";private static final String PUBLIC_KEY = "RSAPublicKey";private static final String PRIVATE_KEY = "RSAPrivateKey";public static byte[] decryptBASE64(String key) {returnBase64.decodeBase64(key);

}public static String encryptBASE64(byte[] bytes) {returnBase64.encodeBase64String(bytes);

}/*** 用私钥对信息生成数字签名

*

*@paramdata 加密数据

*@paramprivateKey 私钥

*@return*@throwsException*/

public static String sign(byte[] data, String privateKey) throwsException {//解密由base64编码的私钥

byte[] keyBytes =decryptBASE64(privateKey);//构造PKCS8EncodedKeySpec对象

PKCS8EncodedKeySpec pkcs8KeySpec = newPKCS8EncodedKeySpec(keyBytes);//KEY_ALGORITHM 指定的加密算法

KeyFactory keyFactory =KeyFactory.getInstance(KEY_ALGORITHM);//取私钥匙对象

PrivateKey priKey =keyFactory.generatePrivate(pkcs8KeySpec);//用私钥对信息生成数字签名

Signature signature =Signature.getInstance(SIGNATURE_ALGORITHM);

signature.initSign(priKey);

signature.update(data);returnencryptBASE64(signature.sign());

}/*** 校验数字签名

*

*@paramdata 加密数据

*@parampublicKey 公钥

*@paramsign 数字签名

*@return校验成功返回true 失败返回false

*@throwsException*/

public static boolean verify(byte[] data, String publicKey, String sign)throwsException {//解密由base64编码的公钥

byte[] keyBytes =decryptBASE64(publicKey);//构造X509EncodedKeySpec对象

X509EncodedKeySpec keySpec = newX509EncodedKeySpec(keyBytes);//KEY_ALGORITHM 指定的加密算法

KeyFactory keyFactory =KeyFactory.getInstance(KEY_ALGORITHM);//取公钥匙对象

PublicKey pubKey =keyFactory.generatePublic(keySpec);

Signature signature=Signature.getInstance(SIGNATURE_ALGORITHM);

signature.initVerify(pubKey);

signature.update(data);//验证签名是否正常

returnsignature.verify(decryptBASE64(sign));

}public static byte[] decryptByPrivateKey(byte[] data, String key) throwsException{//对密钥解密

byte[] keyBytes =decryptBASE64(key);//取得私钥

PKCS8EncodedKeySpec pkcs8KeySpec = newPKCS8EncodedKeySpec(keyBytes);

KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

Key privateKey=keyFactory.generatePrivate(pkcs8KeySpec);//对数据解密

Cipher cipher =Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, privateKey);returncipher.doFinal(data);

}/*** 解密

* 用私钥解密

*

*@paramdata

*@paramkey

*@return*@throwsException*/

public static byte[] decryptByPrivateKey(String data, String key)throwsException {returndecryptByPrivateKey(decryptBASE64(data),key);

}/*** 解密

* 用公钥解密

*

*@paramdata

*@paramkey

*@return*@throwsException*/

public static byte[] decryptByPublicKey(byte[] data, String key)throwsException {//对密钥解密

byte[] keyBytes =decryptBASE64(key);//取得公钥

X509EncodedKeySpec x509KeySpec = newX509EncodedKeySpec(keyBytes);

KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

Key publicKey=keyFactory.generatePublic(x509KeySpec);//对数据解密

Cipher cipher =Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, publicKey);returncipher.doFinal(data);

}/*** 加密

* 用公钥加密

*

*@paramdata

*@paramkey

*@return*@throwsException*/

public static byte[] encryptByPublicKey(String data, String key)throwsException {//对公钥解密

byte[] keyBytes =decryptBASE64(key);//取得公钥

X509EncodedKeySpec x509KeySpec = newX509EncodedKeySpec(keyBytes);

KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

Key publicKey=keyFactory.generatePublic(x509KeySpec);//对数据加密

Cipher cipher =Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, publicKey);returncipher.doFinal(data.getBytes());

}/*** 加密

* 用私钥加密

*

*@paramdata

*@paramkey

*@return*@throwsException*/

public static byte[] encryptByPrivateKey(byte[] data, String key)throwsException {//对密钥解密

byte[] keyBytes =decryptBASE64(key);//取得私钥

PKCS8EncodedKeySpec pkcs8KeySpec = newPKCS8EncodedKeySpec(keyBytes);

KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

Key privateKey=keyFactory.generatePrivate(pkcs8KeySpec);//对数据加密

Cipher cipher =Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, privateKey);returncipher.doFinal(data);

}/*** 取得私钥

*

*@paramkeyMap

*@return*@throwsException*/

public static String getPrivateKey(MapkeyMap)throwsException {

Key key=(Key) keyMap.get(PRIVATE_KEY);returnencryptBASE64(key.getEncoded());

}/*** 取得公钥

*

*@paramkeyMap

*@return*@throwsException*/

public static String getPublicKey(MapkeyMap)throwsException {

Key key=keyMap.get(PUBLIC_KEY);returnencryptBASE64(key.getEncoded());

}/*** 初始化密钥

*

*@return*@throwsException*/

public static Map initKey() throwsException {

KeyPairGenerator keyPairGen=KeyPairGenerator

.getInstance(KEY_ALGORITHM);

keyPairGen.initialize(1024);

KeyPair keyPair=keyPairGen.generateKeyPair();

Map keyMap = new HashMap(2);

keyMap.put(PUBLIC_KEY, keyPair.getPublic());//公钥

keyMap.put(PRIVATE_KEY, keyPair.getPrivate());//私钥

returnkeyMap;

}public static void main(String[] args) throwsException {

Map keyMap =initKey();

String publicKey=getPublicKey(keyMap);

String privateKey=getPrivateKey(keyMap);

System.out.println(keyMap);

System.out.println("-----------------------------------");

System.out.println(publicKey);

System.out.println("-----------------------------------");

System.out.println(privateKey);

System.out.println("-----------------------------------");byte[] encryptByPrivateKey = encryptByPrivateKey("123456".getBytes(),privateKey);byte[] encryptByPublicKey = encryptByPublicKey("123456",publicKey);

System.out.println(newString(encryptByPrivateKey));

System.out.println("-----------------------------------");

System.out.println(newString(encryptByPublicKey));

System.out.println("-----------------------------------");

String sign=sign(encryptByPrivateKey,privateKey);

System.out.println(sign);

System.out.println("-----------------------------------");boolean verify =verify(encryptByPrivateKey,publicKey,sign);

System.out.println(verify);

System.out.println("-----------------------------------");byte[] decryptByPublicKey =decryptByPublicKey(encryptByPrivateKey,publicKey);byte[] decryptByPrivateKey =decryptByPrivateKey(encryptByPublicKey,privateKey);

System.out.println(newString(decryptByPublicKey));

System.out.println("-----------------------------------");

System.out.println(newString(decryptByPrivateKey));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值