SHA256withRSA签名,RSA加解密

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);
        }
    }

}

版权声明:本文为weixin_39219874原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39219874/article/details/105192578

智能推荐

[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的数值...

2019.3.11

2019.3.11...

猜你喜欢

面试题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 编码(...