SHA256withRSA签名,RSA加解密
简介
项目用到了加密相关知识,主要包括加解密和签名过程。文章用java简单实现这一过程的工具类。(不包括公私钥的生成)
加密、签名流程图
具体代码实现
package encrypt;
import org.apache.xmlbeans.impl.util.HexBin;
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.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
/**
* @author txb
* @date 2020年03月30日
*/
public class RSATest {
private static final String CHARSET="utf-8";
private static final String ALGORITHMS="RSA";
private static final String SIGNALGORITHMS="SHA256withRSA";
static String myRSAPublicKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9j9jvyIoanJebGJb+Zns2TaHl" +
"xUiV9DrPCRXGHwKwy+Na8Au0zdu4rg6Qcly632HXDGlNApZYm1YFr7olGgIWCslp" +
"v6C2kDwkIENZC41rBebT4V21E9Fd6EAdOg+sWmv9hj5HZlcfLUyLqJffv7NF9Z7H" +
"zCbscDuUtTAjjENO8wIDAQAB";
static String myRSAPrivateKey="MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAL2P2O/Iihqcl5sY" +
"lv5mezZNoeXFSJX0Os8JFcYfArDL41rwC7TN27iuDpByXLrfYdcMaU0CllibVgWv" +
"uiUaAhYKyWm/oLaQPCQgQ1kLjWsF5tPhXbUT0V3oQB06D6xaa/2GPkdmVx8tTIuo" +
"l9+/s0X1nsfMJuxwO5S1MCOMQ07zAgMBAAECgYAxahonB6PYpBFxQMu7rYNY+IvH" +
"ldICJRRffALNDrBo3f16azDiBPfOALGTPfymSiz7HiUlChOfLX8TJGfl3A3Gtisw" +
"YnLPYw/+uZXLLfwSA+sJjOZqxozTrr90o5Lni2XQx8u1oj1XnPTxZrHlGnuiXpUL" +
"IHugjb1xR6cs70heoQJBAOivnfe2JHTnDT5wYgZ9q/7hKRuqINnhcJ/eNnIN8HPp" +
"daRTYf7VjNcBzHRFSmDQVmciQ1PHJtN/G0nK4vSUoEUCQQDQjhl/V5KO535u6br2" +
"zqb99J9TKIZtAuTly6Su1tSuREBZ2TFRZ2kQg7ayzgBL3+0Q3N+8EGWhFPWJembq" +
"rbHXAkEAo8Z4OVJKdr3p5HjVhhwOY2e3t3EXjkPPMbcGO2D0TaGU3ASUhPlqGCt7" +
"7JqYr2v0ZMMJAH68JUDhxB65f8zcwQJBAJA51PQ1kYr2GH+Hb96CpwV1CEGwAtac" +
"a8NnA2pN8yLY3E/GXc7X3tam38/jmlzebMl+ldMu27l8DxmV5lpg6F0CQEofIGtb" +
"TxasTdNIDUvHcVOn1N5fPN/bNy8oeLaL2a8Y1UA8CIYMthkcigGhqkXtNAKCUR0k" +
"9E4nufNoYHANU1M=";
public static PublicKey getPublicKey(String publicKey){
try {
X509EncodedKeySpec spec=new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
KeyFactory keyFactory=KeyFactory.getInstance(ALGORITHMS);
return keyFactory.generatePublic(spec);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}catch (InvalidKeySpecException e) {
e.printStackTrace();
}
return null;
}
public static PrivateKey getPrivateKey(String privateKey){
try {
PKCS8EncodedKeySpec spec=new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));
KeyFactory keyFactory=KeyFactory.getInstance(ALGORITHMS);
return keyFactory.generatePrivate(spec);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
return null;
}
//公钥加密
public static String encrypt(String plainText,String publicKeyStr){
try {
Cipher cipher = Cipher.getInstance(ALGORITHMS);//根据需要选择分组模式、填充。比如:RSA/ECB/NoPadding
PublicKey publickKey=getPublicKey(publicKeyStr);
if(publickKey!=null){
cipher.init(Cipher.ENCRYPT_MODE,publickKey);
byte[] bytes=cipher.doFinal(plainText.getBytes(CHARSET));
return Base64.getEncoder().encodeToString(bytes);//base64编码
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
return null;
}
//私钥解密
public static String decrypt(String encryptText,String privateKeyStr){
try {
Cipher cipher = Cipher.getInstance(ALGORITHMS);//根据需要选择分组模式、填充。比如:RSA/ECB/NoPadding
PrivateKey privateKey=getPrivateKey(privateKeyStr);
if(privateKey!=null){
cipher.init(Cipher.DECRYPT_MODE,privateKey);
byte[] bytes=cipher.doFinal(Base64.getDecoder().decode(encryptText));//encryptText之前用base64编码过,要解码成bytes
return new String(bytes);//得到明文
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
/**
* 签名
* 发送方私钥签名
*/
public static String sign(String encryptText,String privateKeyStr){
try {
Signature signature=Signature.getInstance(SIGNALGORITHMS);
PrivateKey privateKey=getPrivateKey(privateKeyStr);
if(privateKey!=null){
signature.initSign(privateKey);
signature.update(encryptText.getBytes(CHARSET));
byte[] bytes=signature.sign();
return HexBin.bytesToString(bytes);//转成hex字符串
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 验签
* 发送方公钥验签
*/
public static boolean verifySign(String signText,String encryptText,String publicKeyStr){
PublicKey publickKey=getPublicKey(publicKeyStr);
try {
if(publickKey!=null){
Signature signature=Signature.getInstance(SIGNALGORITHMS);
signature.initVerify(publickKey);
signature.update(encryptText.getBytes(CHARSET));
return signature.verify(HexBin.stringToBytes(signText));//hex字符串转bytes
}
} catch (UnsupportedEncodingException e){
e.printStackTrace();
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
}
return false;
}
//为了方便,只用一对公私钥,实际需要发送方、接收方两对公私钥
public static void main(String[] args) {
String plainText="我是明文 1 3 5 7 9";
System.out.println("明文:"+plainText);
String encryptText=encrypt(plainText,myRSAPublicKey);
System.out.println("密文"+encryptText);
String signText=sign(encryptText,myRSAPrivateKey);
System.out.println("信息摘要:"+signText);
if(verifySign(signText,encryptText,myRSAPublicKey)){
System.out.println("验签通过");
String decodeText=decrypt(encryptText,myRSAPrivateKey);
System.out.println("解密后:"+decodeText);
}
}
}
智能推荐
[Python]IDEA搭建Python环境
>Python环境 首先,我们需要下载一定版本的Python。 Python版本主要分2.7和3.x两种选择,由于Python3中的部分语法和特性对比Python发生了改变,因此一些原有的库对3的支持不是那么好。 考虑到日后的方便,这里采用Python 2.7(64bit)。(64位的Python相比,没有32位Python内存上限为2G的局限。)当然,一般来说,我会同时安装Python3和...
问题: Error inflating class RecyclerView
问题: Error inflating class RecyclerView-2020-4-25 详细: 看到里面 com.example.index_school_07:layout/item_detaillist: Error inflating class android.support.v7.widget.RecyclerView 这里报错 解决 android.support.v7.wi...
异常数据处理——箱型图分析原理及Python例程
箱型图分析原理及Python例程 一、箱型图分析原理 箱型图可以通过程序设置一个识别异常值的标准,即大于或小于箱型图设定的上下界的数值则识别为异常值,箱型图如下图所示: 首先我们定义下上四分位和下四分位: 上四分位我们设为 U,表示的是所有样本中只有1/4的数值大于U ,即从大到小排序时U处于25%处; 同理,下四分位我们设为 L,表示的是所有样本中只有1/4的数值...
猜你喜欢
面试题49. 把字符串转换为整数
面试题49. 把字符串转换为整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 思路: 对于输入的字符串,从后向前遍历,判断每一位...
Mysql入门——创建一个数据库
题目:创建一个教务管理数据库,名称为 JWGL 在 JWGL 数据库中创建学生表 Student、课程表 Course、学生选课表 SC,它们的表结构如下所示: 学生表Student 列名 数据类型 长度 允许空值 默认值 说明 Sno char 8 × 主键 Sname varchar 10 × Sex char 2 × 男 只能“男”...
从上到下打印二叉树
题目 从上到下打印出二叉树的每个节点,每层的节点按照从左到右的顺序打印。 例子: 打印顺序:8,6,10,5,7,9,11 二叉树节点定义: 思路: 本题实际上是层序遍历二叉树,根据题目特点,选用队列来存储相应节点,每次取出队列头部元素,如果该元素有子节点,将子节点放入队列中,如此循环。 代码 测试以及结果 总结 本题区别与二叉树的前中后序遍历,它们都是通过栈数据结构来...
Java GUI编程(13)---GridBagLayout网格袋布局
GridBagLayout(),网格袋布局,维持一个动态的矩形单元的网格,矩形单元格被称为显示区域。 组件可占用一个或多个的矩形单元格,组件不要求相同尺寸。 组件由GridBagLayou管理,关联一个约束GridBagConstraints类。 约束组件属性,比如:位置,大小,外部填充,内部填充等。 GridBagConstraints Class 约束属性与值 int gridx,gridy;...
h.264 aac librtmp推流应用
librtmp + h.264(MediaCodec) + aac(MediaCodec) + ams5 demo:https://github.com/wangzuxing/myrtmplive pc需安装ams5, 作为流服务器,android端通过pc端ip + ams5 rtmp端口跟流服务器建立连接(NetConnection) h.264: 摄像头预览数据 MediaCodec 编码(...