Flask接口签名sign原理与实例代码浅析
286
2022-12-14
Java加密算法RSA代码实例
这篇文章主要介绍了java加密算法RSA代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
代码如下
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
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;
public class RSADecrypt {
public static Map
//创建秘钥对生成器
KeyPairGenerator generator = KeyPairGenerator.getInstance("rsa");
//初始化密钥对生成器
generator.initialize(1024);
//生成密钥对
KeyPair keyPair = generator.generateKeyPair();
//获取公钥私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
String publicKeyStr = new String(publicKey.getEncoded());
String privateKeyStr = new String(privateKey.getEncoded());
//公钥私钥存放map
Map
keyMap.put("publicKey", publicKeyStr);
keyMap.put("privateKey", privateKeyStr);
return keyMap;
}
/**
* 获取公钥
* @param publicKey
* @return
*/
public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
KeyFactory keyFactory = KeyFactory.getInstance("rsa");
//X509编码
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKey.getBytes());
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(x509EncodedKeySpec);
return rsaPublicKey;
}
/**
* 获取私钥
* @param privateKey
* @return
*/
public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
KeyFactory keyFactory = KeyFactory.getInstance("rsa");
//PKCS#8编码
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKey.getBytes());
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8EncodedKeySpec);
return rsaPrivateKey;
}
/**
* 公钥加密
* @param src
* @param publicKey
* @return
*/
public static byte[] publicEncrypt(String src, RSAPublicKey publicKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("rsa");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
byte[] encryptedData = cipher.doFinal(src.getBytes());
return encryptedData;
}
/**
* 私钥解密
* @param data
* @param privateKey
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static String privateDecrypt(byte[] data, RSAPrivateKey privateKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("rsa");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
byte[] result = cipher.doFinal(data);
return new String(result);
}
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchPaddingException {
Map
RSAPublicKey publicKey = getPublicKey(keyPair.get("publicKey"));http://
RSAPrivateKey privateKey = getPrivateKey(keyPair.get("privateKey"));
String str = "hello world";
/**
* 公钥加密,私钥解密
*/
byte[] encryptedData = publicEncrypt(str,publicKey);
String result = privateDecrypt(encryptedData, privateKey);
/**
* 私钥加密,公钥解密
*/
byte[] encrypted = privateEncrypt(str, privateKey);
String source = publicDecrypt(encrypted, publicKey);
}
/**
* 私钥加密
* @param src
* @param privateKey
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static byte[] privateEncrypt(String src, RSAPrivateKey privateKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("rsa");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
byte[] result = cipher.doFinal(src.getBytes());
return result;
}
/**
* 公钥解密
* @param data
* @param publicKey
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static String publicDecrypt(byte[] data, RSAPublicKey publicKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("rsa");
cipher.init(Cipher.DECRYPT_MODE,publicKey);
byte[] result = cipher.doFinal(data);
return new String(result);
}
}
上面例子使用密钥长度1024,如果想使用2048密钥,只需要在初始化密钥对生成器做一些变动,其他部分可以复用。
generator.initialize(2048);
这个例子只是基本常用的RSA加解密,也可加入base64,签名。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~