`
Franciswmf
  • 浏览: 800468 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

加密解密、加签验签

 
阅读更多
一、加密算法:

1.1 散列算法(单向散列,不可逆)
MD5: Message Digest Algorithm 5,信息-摘要算法
SHA: Secure Hash Algorithm,安全散列算法,诸如:SHA1 SHA256 SHA512
HMAC:Hash Message Authentication Code,散列消息鉴别码

1.2 对称加密(加密解密使用同一秘钥,速度快)
1.2.1 DES:
DES是一种基于56位密钥的对称算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。现在DES已经不是一种安全的加密算法,已被公开破解,现在DES已经被高级加密标准(AES)所代替
1.2.2 3DES
3DES是DES的一种派生算法,主要提升了DES的一些实用所需的安全性。
1.2.3 AES
AES是现在对称加密算法中最流行的算法之一。

1.3 非对称加密(公钥加密,私钥解密,可以签名,更安全)
RSA
DSA
ECC

1.4 BASE64
严格来说Base64并不是一种加密/解密算法,而是一种编码方式。
Base64不生成密钥,通过Base64编码后的密文就可以直接“翻译”为明文,但是可以通过向明文中添加混淆字符来达到加密的效果。

二、加签算法:
SHA1WithRSA(是一个常用的RSA加签算法):用SHA算法进行签名,用RSA算法进行加密

参考博客:
https://blog.csdn.net/qq_35605213/article/details/80591869
http://www.cnblogs.com/KKatherine/p/4128444.html
https://www.cnblogs.com/tancky/p/6409823.html
https://blog.csdn.net/it_beecoder/article/details/71480770
https://blog.csdn.net/UtopiaOfArtoria/article/details/82429467
https://blog.csdn.net/u013151053/article/details/81949810
https://blog.csdn.net/poiuyppp/article/details/81145982
https://www.cnblogs.com/shuqi/p/java.html
https://www.2cto.com/kf/201804/738493.html
//
https://blog.csdn.net/lovelichao12/article/details/75007189
https://www.cnblogs.com/xyzq/p/6679400.html
https://blog.csdn.net/john2522/article/details/53365358
https://blog.csdn.net/u011518120/article/details/52184725
https://blog.csdn.net/cheng9981/article/details/52825554

示例demo:
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
/**
 * @description: RSA加密解密工具类 
 * @title: RSAUtils.java 
 * @author: Administrator 
 * @date: 2019年2月12日 
 * @version: 1.0.0
 */
public class RSAUtils {
	    /*
	        解释:
	    RSA算法,需要两个密钥来进行加密和解密,分别是公钥和私钥。
	        需要注意的一点,这个公钥和私钥必须是一对的,如果用公钥对数据进行加密,那么只有使用对应的私钥才能解密,反之亦然。
	        由于加密和解密使用的是两个不同的密钥,因此,这种算法叫做非对称加密算法。
	        其算法具体实现基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
	    */
		/**
		 * 生产RSA密钥对
		 * @return
		 */
	    public static Map<String,Object> generateKey(){
	        try {
	        	//实例化一个密钥对生成器
	            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
	            // ‘1024’,表示生成的是512位字符
	            keyPairGenerator.initialize(1024);
	            KeyPair keyPair = keyPairGenerator.generateKeyPair();
	            RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
	            RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
	            Map<String,Object> keyPairs = new HashMap<>();
	            keyPairs.put("publicKey",rsaPublicKey);
	            keyPairs.put("privateKey",rsaPrivateKey);
	            return keyPairs;
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        return null;
	    }

	    /**
	     * RSA私钥加密
	     * @param message 要加密的信息
	     * @param rsaPrivateKey RSA私钥
	     * @return 加密后的字符串
	     */
	    public static String encrypt(String message, RSAPrivateKey rsaPrivateKey){
	        try {
	            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
	            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
	            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
	            Cipher cipher = Cipher.getInstance("RSA");
	            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
	            byte[] resultBytes = cipher.doFinal(message.getBytes());
	            return Hex.encodeHexString(resultBytes);
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        return null;
	    }

	    /**
	     * RSA公钥解密
	     * @param encryptMsg 要解密的信息
	     * @param rsaPublicKey RSA公钥
	     * @return 解密后的字符串
	     */
	    public static String decrypt(String encryptMsg, RSAPublicKey rsaPublicKey){
	        try {
	            X509EncodedKeySpec x509EncodedKeySpec =
	                    new X509EncodedKeySpec(rsaPublicKey.getEncoded());
	            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
	            PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
	            Cipher cipher = Cipher.getInstance("RSA");
	            cipher.init(Cipher.DECRYPT_MODE, publicKey);
	            byte[] resultBytes = cipher.doFinal(Hex.decodeHex(encryptMsg.toCharArray()));
	            return new String(resultBytes);
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        return null;
	    }
	    
	    /**
	     * RSA公钥加密
	     * @param message
	     * @param rsaPublicKey
	     * @return
	     */
	    public static String rsaPublicKeyEncode(String message,RSAPublicKey rsaPublicKey){
	        try {
	            Cipher cip = Cipher.getInstance("RSA");
	            cip.init(cip.ENCRYPT_MODE, rsaPublicKey);
	            byte[] by = cip.doFinal(message.getBytes());
	            return Base64.encodeBase64String(by);
	        } catch (Exception e) {
	            throw new RuntimeException(e);
	        }
	        
	    }
	    
	    /**
	     * RSA私钥解密
	     * @param encryptMsg
	     * @param rsaPrivateKey
	     * @return
	     */
	    public static String rsaPrivateKeyDecode(String encryptMsg,RSAPrivateKey rsaPrivateKey){
	        try {
	            Cipher cip = Cipher.getInstance("RSA");
	            cip.init(cip.DECRYPT_MODE, rsaPrivateKey);
	            byte[] by = Base64.decodeBase64(encryptMsg.getBytes());
	            return new String(cip.doFinal(by));
	        } catch (Exception e) {
	            throw new RuntimeException(e);
	        }
	        
	    }
	    
	    /**
	     * RSA公钥字符串转公钥
	     * @param publicKeyStr
	    */
	    public static RSAPublicKey getPublicKey(String publicKeyStr){
            byte[] keyBytes=null;
            try {
//	            keyBytes = (new BASE64Decoder()).decodeBuffer(publicKeyStr);//需引入jdk1.8
            	keyBytes=Base64.decodeBase64(publicKeyStr);
	            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
	            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
	            RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
	            return publicKey;
            } catch (Exception e) {
	            throw new RuntimeException(e);
	        }
	    }
	    
        /**
        * RSA私钥字符串转私钥
        * @param privateKeyStr
        */
	    public static RSAPrivateKey getPrivateKey(String privateKeyStr){
            byte[] keyBytes=null;
            try {
//	            keyBytes = (new BASE64Decoder()).decodeBuffer(privateKeyStr);//需引入jdk1.8
            	keyBytes=Base64.decodeBase64(privateKeyStr);
	            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
	            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
	            RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
	            return privateKey;
            } catch (Exception e) {
	            throw new RuntimeException(e);
	        }
	    }
	    
	    /**
	     * 测试
	     * @param args
	     */
	    public static void main(String[] args) {
	    	Map<String, Object> map=RSAUtils.generateKey();
	    	RSAPublicKey rsaPublicKey=(RSAPublicKey) map.get("publicKey");
	    	RSAPrivateKey rsaPrivateKey=(RSAPrivateKey) map.get("privateKey");
	    	//公钥
	    	String publicKey=Base64.encodeBase64String(rsaPublicKey.getEncoded());
	    	//私钥
	    	String privateKey=Base64.encodeBase64String(rsaPrivateKey.getEncoded());
	    	System.out.println("=========================生成RSA密钥对=======================");
	    	System.out.println("公钥:"+publicKey);
	    	System.out.println("私钥:"+privateKey);
	    	System.out.println("=========================示例1=======================");
	    	//【示例1】
	    	String message="123456javaHELLO#$%_";
	    	//rsa私钥加密
	    	String encryptMessage=RSAUtils.encrypt(message, rsaPrivateKey);
	    	System.out.println("私钥加密后encryptMessage="+encryptMessage);
	    	//rsa公钥解密
	    	String decryptMessage=RSAUtils.decrypt(encryptMessage, rsaPublicKey);
	    	System.out.println("公钥解密后decryptMessage="+decryptMessage);
	    	System.out.println("=========================示例2=======================");
	    	//【示例2】
	    	String msg="123456javaHELLO#$%_中国";
	    	//rsa公钥加密
	    	String encryptMsg=RSAUtils.rsaPublicKeyEncode(msg, rsaPublicKey);
	    	System.out.println("公钥加密后encryptMsg="+encryptMsg);
	    	//rsa私钥解密
	    	String decryptMsg=RSAUtils.rsaPrivateKeyDecode(encryptMsg, rsaPrivateKey);
	    	System.out.println("私钥解密后decryptMsg="+decryptMsg);
	    	System.out.println("==========================示例3======================");
	    	//【示例3】
	    	//前端js公钥加密后的字符串(注意"+"号的处理)
	    	//encodeURI(data).replace(/\+/g, '%2B'),后端处理时要将%2B转换回来
	    	String encryptMsg2="giBQsrwlpkoRYoSkwzvHjkkiEES0Qu2CmanWDPedYwCBfSuUzU2zwEiergH5G+YzR53ygLDBs174lgvzoo8nbac/VbV5wPmrY7Pm9pTFeJR3uZBKvMvO23VxKzLUEPv6FvYif/0PYeUwS9AylRqONTbkNV6PV6E052rSaZlcUOE=";
	    	//后端保存的私钥
	    	String privateKeyStr="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAN1tjHRYRk5q8qxx+v+PibdNNh7lrHjPyo+zC6IOG7XG1o1Yd/vZVhtqaGIICCjs3w2sSQuD87sJSKkO+apnOnGhFNgA2lJVyZqZ0Hp8WZxT0EB/CYNec0iUQ9AWFnDujcGcL/qlCrgFDpLLMWiv1l4A3oV/prqiFRTunFxVhVGbAgMBAAECgYBjVvR+deQE5mI9D13GLcVhIRi4v92izcZYtcDwUVgJM02qWBhsOtMwtYpjAKt4gNyJK9QRgH9mWAHrJrbHxkwnPKKiso+qNNSb9Dbjbua25AS9HP2VQwkQUWBGagFvLQGatddK4f5nh7137+Jmld7VbfpY59BQvqS7lmzHfEmPQQJBAPR6hzNLHjnDZZ9wL092Trk02CN0aXOQsItHpypCiCzF7gmi2xPOGG8K4aOp5w/nIO1rr8eyl/5agvYXE51LsqsCQQDn3O3dZxw/jwUrhyWZJemkd2vBe1gUT0dnzEGhAIfLDinGiAg9NEBiMyFFHMXvyCIhOY2fxc9OZ+M2oeVLiVzRAkEAl7rb4ifC0JLGpVdY5XZFkYiMhCShtcmc6DRGOWIlZbRJ8c0TLo2AeJpGQ+8UqrgFpZRp+gSLdJ70HIth7wOmFQJAcgTu5AWkmozWWgVns9w0/S/MyaTCN5qU3rJPQ8FjBbO9T2ftxUtArgm+vqHbpIKiZfxLbNp1i3UDAwayH2c5QQJAf9OhvMVT/K9FsGzRHlIPyfUPFa9zKRCTw7RGKbrhoromycqOD23HV8EwCBvXUrAtqOC7TxxcX6wdQgq/zJZ7EA==";
	    	//密钥转换
	    	RSAPrivateKey rsaPrivateKey2=RSAUtils.getPrivateKey(privateKeyStr);
	    	//私钥解密
	    	String decryptMsg2=RSAUtils.rsaPrivateKeyDecode(encryptMsg2, rsaPrivateKey2);
	    	System.out.println("前端js公钥加密,后端私钥解密后decryptMsg2="+decryptMsg2);
	    }
	}

分享到:
评论

相关推荐

    临商银行接口对接,加密解密加签验签整合,方便调用

    临商银行接口对接,加密解密加签验签整合,方便调用 临商银行接口对接,加密解密加签验签整合,方便调用 临商银行接口对接,加密解密加签验签整合,方便调用 临商银行接口对接,加密解密加签验签整合,方便调用 临商...

    Crptopp加密解密加签验签

    3,验证签名目前使用的UTF8格式,加签和验签必须保持统一,私钥加密,公钥解密。 4,静态库分release版本和debug版本 5,注意VC6.0中编译的使用的环境 MDd 还是MD 工程环境和静态库环境一直 6,本工程使用的库为:...

    加密解密签名验签通用工具

    SM2算法可以生成密钥和公钥,支持SM2的签名和验签;AES加密解密,支持各种常用的堆成非对称的加密算法的加密解密和验签

    C# 实现与JAVA互通 加签/验签,RSA加密/解密

    * RSA数字签名-俗称加签验签:私钥加签,公钥验签。  * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。  * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加...

    RSA sha-256加密解密,加签验签工具类

    在Spring框架中,我们经常需要处理加密解密和签名验证的问题,以确保数据传输的安全性和完整性。RSA与SHA-256结合使用可以提供更高级别的安全保护。RSA用于非对称加密,而SHA-256用于生成消息摘要,进行数字签名。 ...

    java(sm2公私钥生成、加签、验签、加密、解密)

    java(sm2公私钥生成、加签、验签、加密、解密)demo案列

    加签加密解密验签demo

    本示例"加签加密解密验签demo"旨在演示如何实现这一过程,通常涉及对称加密、非对称加密和数字签名等技术。 首先,我们来看“加签”。这里的“加签”指的是数字签名,它是公钥密码学的一种应用。数字签名并非传统的...

    RSA加密解密签名加签验签RsaUtils工具类

    RSA加密解密签名加签验签RsaUtils工具类 RSA算法基于大数因子分解难题,提供了公钥加密和私钥解密的能力。公钥用于加密,私钥则负责解密。这种特性使得RSA成为保证数据传输安全的理想选择。 公钥加密私钥解密与...

    RSA2--》加签+加密+解密+验签

    本文将详细讲解RSA算法的加签、加密、解密以及验签的过程,结合Java语言来实现这一系列操作,并涉及到证书的使用。 首先,我们需要理解RSA算法的基本原理。RSA算法基于两个大素数的乘积难以分解这一数学难题,生成...

    RSA加密解密、签名验签Demo

    在C#中实现RSA加密解密和签名验签,我们可以利用.NET框架提供的System.Security.Cryptography命名空间中的相关类。 1. RSA加密原理: RSA基于数论中的大数因子分解难题,即给定一个大合数N,找到它的两个素数因子p...

    SM2加密解密、签名验签Delphi Lazarus版本源码

    SM2加密解密、签名验签Delphi Lazarus版本源码 简介 本仓库提供了一个基于MIRACL大数库实现的国密2(SM2)非对称加密解密、签名验签工具的源码。该工具使用Delphi 7编写,适用于Delphi和Lazarus开发环境。 功能特点...

    C++使用Openssl进行RSA加密解密及签名验签功能(SHA256)

    本文将深入探讨如何使用OpenSSL库在C++中实现RSA加密、解密以及签名和验签功能,特别关注SHA256WithRSA这一安全强度更高的签名方法。 首先,RSA的核心原理是基于大整数因子分解的困难性。它包含一对密钥,即公钥和...

    国密SM2_SM3加密解密,加签验签操作C#源码

    国密SM2_SM3加密解密,加签验签操作C#源码,网络上很难找的资源,实现了密SM2_SM3加密解密,加签验签操作,.NET版

    java aes128/256 对称加密解密,rsa对称加密解密验签实现

    java aes128/256 对称加密解密,rsa对称加密解密验签实现,php java通用aes加密 支持任何形式的aes加密,文件,字符,字节等,内含php代码,可以与php平台实现aes加密,而且包含rsa非对称加密签名验签实现,都是对...

    ECC密钥生成、加密解密、签名验签工具

    在这个项目中,开发者使用C语言和Visual Studio 2010创建了三个工具:ECC密钥生成器、ECC加密解密工具以及ECC签名验签工具,这些工具都基于OpenSSL库进行关键操作。 首先,ECC密钥生成器是用于创建ECC密钥对的核心...

    国密SM2-SM3加密解密,加签验签操作C#源码 复刻Java

    国密SM2_SM3加密解密,加签验签操作C#源码 复刻Java 完整有效

    C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥

    C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 对应文章: http://blog.csdn.net/gzy11/article/details/54573973

    SM2 SM4 后端加密解密资源

    SM2 SM4 后端加密解密资源

    RSA加解解密加签验签

    亲自总结验证,源码可用,RSA加密、解密、加签、验签,提醒:私钥加签公租验签。其中一对测试的公钥和私钥,密码在资源说明文件中,还包括java生成公私钥的方法,后面会上传C#生成租钥pfx和证书的方法和操作说明。

Global site tag (gtag.js) - Google Analytics