当前位置:首页 > Java技术文章 > java加解密RSA使用方法代码示例

java加解密RSA使用的实例方法

  • 发布时间:
  • 作者:码农之家原创
  • 点击:176

这篇文章主要知识点是关于java加密、java解密、RSA、Java实现的数字签名算法RSA完整示例 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下java相关资源

Java JDK 8学习笔记

本书针对Java SE 8新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新,详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对照关系,从Java SE API的源代码分析,了解各种语法在Java SE API中的具体应用

查看详情

java加解密RSA使用方法代码示例

最近为了分析一段请求流,不得不去研究一下RSA加密。

首先,强调一点:密钥的“钥”读“yue”,不是“yao”,额。。。

网上关于RSA的原理一抓一大把的,这里只是简单说说我的理解:

1. 两个足够大的互质数p, q;
2. 用于模运算的模 n=p*q;
3. 公钥KU(e, n)中的e满足 1<e< (p-1)(q-1),且与(p-1)(q-1)互质;
4. 密钥KR(d, n)中的d满足  d*e % (p-1)(q-1)= 1,%是取余运算。

因为公钥是公开的,所以我知道了e和n,那么根据2,3,4式子的关系,我们只要从n的值推出p, q的值则可计算出d的值,也就能找到密钥。

然而,关键就在这里, n=p*q,如果两个互质数p和q足够大,那么根据目前的计算机技术和其他工具,至今也没能从n分解出p和q,这是数学上的一个难题,也正是这个难题成为了RSA加密至今被广泛使用的原因。换句话说,只要密钥长度n足够大(一般1024足矣),基本上不可能从公钥信息推出私钥信息。

好了,这里作为研究的随笔,记录一下java如何使用,以下主要有三种方法,基本大同小异,只是获取公钥私钥的途径不一样就是了:

方法一:

利用KeyPairGenerator直接生成公钥和密钥,一般私钥保留给服务端,公钥交给客户端。

public class RSACryptography {
	public static String data="hello world";
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		KeyPair keyPair=genKeyPair(1024);
		//获取公钥,并以base64格式打印出来
		PublicKey publicKey=keyPair.getPublic();		
		System.out.println("公钥:"+new String(Base64.getEncoder().encode(publicKey.getEncoded())));
		//获取私钥,并以base64格式打印出来
		PrivateKey privateKey=keyPair.getPrivate();		
		System.out.println("私钥:"+new String(Base64.getEncoder().encode(privateKey.getEncoded())));
		//公钥加密
		byte[] encryptedBytes=encrypt(data.getBytes(), publicKey);	
		System.out.println("加密后:"+new String(encryptedBytes));
		//私钥解密
		byte[] decryptedBytes=decrypt(encryptedBytes, privateKey);		
		System.out.println("解密后:"+new String(decryptedBytes));
	}
	//生成密钥对
	public static KeyPair genKeyPair(int keyLength) throws Exception{
		KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
		keyPairGenerator.initialize(1024);		
		return keyPairGenerator.generateKeyPair();
	}
	//公钥加密
	public static byte[] encrypt(byte[] content, PublicKey publicKey) throws Exception{
		Cipher cipher=Cipher.getInstance("RSA");//java默认"RSA"="RSA/ECB/PKCS1Padding"
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		return cipher.doFinal(content);
	}
	//私钥解密
	public static byte[] decrypt(byte[] content, PrivateKey privateKey) throws Exception{
		Cipher cipher=Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		return cipher.doFinal(content);
	}
}

运行结果:

公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSl6V7XNkVR9+NotekZm1FjHdL7oDqA66hrG5D/wgQ1XIF22mex7pnNc8PRBRScJQZJbzQ3ZnVmV5XqrVSCGbqaMPFmIXetu6lifQHoGptH9ghZsemanqp0sSd1TkHcPL2Njk/hZabWYBzPbjlidgfcMotehnFUdlIMGCusMV0awIDAQAB
私钥:MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJKXpXtc2RVH342i16RmbUWMd0vugOoDrqGsbkP/CBDVcgXbaZ7Humc1zw9EFFJwlBklvNDdmdWZXleqtVIIZupow8WYhd627qWJ9Aegam0f2CFmx6ZqeqnSxJ3VOQdw8vY2OT+FlptZgHM9uOWJ2B9wyi16GcVR2UgwYK6wxXRrAgMBAAECgYA8YBjX5jXCfgek3hzSqRz4OBIqQ+D0gO+7xrjjaHZ5+G8t2mB19Ozg9ViCgRednKBiexh5LcveHXytvrFPSAaagoa9DFKktaQmIQ15z3xXtgiHxg2dxDFJ1GNyhNjhMl8RSff2nSfQaRrgA8y36k0OZq240sdls6GbBMMoHRuRAQJBAOm6fw7cVXfmvzL0JBZmDl3SPK3sSNM6tfxaDy39W1g9rmGHKqs2XOubCe06ic/m9pxJnPmUXhgvYtiYLdC6NbkCQQCgj5O/sA0wYQQvW+WxQvleBLND9ZT2QOG5wvYRMoKP+uYE3SwsfKTZ1YsD5DjoyQPrc/lbCX7x+A8qRqLdRw1DAkAmhwJ4vaMtD5FG4e2s74fAuW4dMUzT3OKwxVupNhE/m3NKSlCjRmPMxpK9Ux/ycF0IaC4DCgz0qaL+lx8+P+OpAkA6Kol+AgtlIWBgv8wAYaDxPIas8gTbCTo9D7IRHNlLy7sUvANKwoT+HWxVJpKvUlNHMyZ8on4IrrLfv+M0go79AkAUwV5Nipi7ekScrzEMiaRJoYXgpFv2pQnRQzBQm5xVxtbuCpmuopNyk/9zm33RiwwjN6uYV9Hfg7e6HNsK2qIR
加密后:v?,Y9?檂o庬鉤h﹎m_?$惇櫤?p崃?4蹥bhhN?25/?6T駩樁w草遏鬼碙&柀&*軄Q晛1鱋A祉@眽`剪啃`噾?>x/运婣?HI砛奊瑘i?$B捞
?毟"ST
解密后:hello world

方法二:

实际上,方法一只是用来生成密钥就OK了,生成的密钥需要保存到本地文件中,所以一般不会在客户端调用KeyPairGenerator进行密钥的生成操作。

这里,我们可以将方法一得到的密钥保存到文件,下次我们直接读取就可以了。我假设以String的形式保存在文件内,那么接下来直接使用读取到的String生成密钥即可。

当然,你也可以使用openssl来生成也可以,不过我觉得麻烦就不弄了。

public class RSACryptography {
	public static String data="hello world";
	public static String publicKeyString="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCISLP98M/56HexX/9FDM8iuIEQozy6kn2JMcbZS5/BhJ+U4PZIChJfggYlWnd8NWn4BYr2kxxyO8Qgvc8rpRZCkN0OSLqLgZGmNvoSlDw80UXq90ZsVHDTOHuSFHw8Bv//B4evUNJBB8g9tpVxr6P5EJ6FMoR/kY2dVFQCQM4+5QIDAQAB";
	public static String privateKeyString="MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIhIs/3wz/nod7Ff/0UMzyK4gRCjPLqSfYkxxtlLn8GEn5Tg9kgKEl+CBiVad3w1afgFivaTHHI7xCC9zyulFkKQ3Q5IuouBkaY2+hKUPDzRRer3RmxUcNM4e5IUfDwG//8Hh69Q0kEHyD22lXGvo/kQnoUyhH+RjZ1UVAJAzj7lAgMBAAECgYAVh26vsggY0Yl/Asw/qztZn837w93HF3cvYiaokxLErl/LVBJz5OtsHQ09f2IaxBFedfmy5CB9R0W/aly851JxrI8WAkx2W2FNllzhha01fmlNlOSumoiRF++JcbsAjDcrcIiR8eSVNuB6ymBCrx/FqhdX3+t/VUbSAFXYT9tsgQJBALsHurnovZS1qjCTl6pkNS0V5qio88SzYP7lzgq0eYGlvfupdlLX8/MrSdi4DherMTcutUcaTzgQU20uAI0EMyECQQC6il1Kdkw8Peeb0JZMHbs+cMCsbGATiAt4pfo1b/i9/BO0QnRgDqYcjt3J9Ux22dPYbDpDtMjMRNrAKFb4BJdFAkBMrdWTZOVc88IL2mcC98SJcII5wdL3YSeyOZto7icmzUH/zLFzM5CTsLq8/HDiqVArNJ4jwZia/q6Fg6e8KO2hAkB0EK1VLF/ox7e5GkK533Hmuu8XGWN6I5bHnbYd06qYQyTbbtHMBrFSaY4UH91Qwd3u9gAWqoCZoGnfT/o03V5lAkBqq8jZd2lHifey+9cf1hsHD5WQbjJKPPIb57CK08hn7vUlX5ePJ02Q8AhdZKETaW+EsqJWpNgsu5wPqsy2UynO";
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		//获取公钥 
		PublicKey publicKey=getPublicKey(publicKeyString);
		//获取私钥 
		PrivateKey privateKey=getPrivateKey(privateKeyString);		
		//公钥加密
		byte[] encryptedBytes=encrypt(data.getBytes(), publicKey);	
		System.out.println("加密后:"+new String(encryptedBytes));
		//私钥解密
		byte[] decryptedBytes=decrypt(encryptedBytes, privateKey);		
		System.out.println("解密后:"+new String(decryptedBytes));
	}
	//将base64编码后的公钥字符串转成PublicKey实例
	public static PublicKey getPublicKey(String publicKey) throws Exception{
		byte[ ] keyBytes=Base64.getDecoder().decode(publicKey.getBytes());
		X509EncodedKeySpec keySpec=new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory=KeyFactory.getInstance("RSA");
		return keyFactory.generatePublic(keySpec);	
	}
	//将base64编码后的私钥字符串转成PrivateKey实例
	public static PrivateKey getPrivateKey(String privateKey) throws Exception{
		byte[ ] keyBytes=Base64.getDecoder().decode(privateKey.getBytes());
		PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory=KeyFactory.getInstance("RSA");
		return keyFactory.generatePrivate(keySpec);
	}
	//公钥加密
	public static byte[] encrypt(byte[] content, PublicKey publicKey) throws Exception{
		Cipher cipher=Cipher.getInstance("RSA");//java默认"RSA"="RSA/ECB/PKCS1Padding"
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		return cipher.doFinal(content);
	}
	//私钥解密
	public static byte[] decrypt(byte[] content, PrivateKey privateKey) throws Exception{
		Cipher cipher=Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		return cipher.doFinal(content);
	}
}

运行结果

加密后:.a羫閍Q瘿u鉵やAS祏@q??>?:sQ3?A_l'遥`t?6蔍NK%IC尊[鹰#枋リ礼?1i獙	l躕锇仩?"糍>Ij弻脶諾晦5uDq積嬨璼ey冖U'輵\L〥%
解密后:hello world

方法三:

除了保存密钥字符串之外,其他的做法一般是只保存 模n(modulus),公钥和私钥的e和d(exponent)。

其中,n, e, d可以这样获取到,获取到后可以保存到本地文件中。

//获取公钥 
RSAPublicKey publicKey=(RSAPublicKey) getPublicKey(publicKeyString); 
BigInteger modulus1=publicKey.getModulus(); 
BigInteger exponent1=publicKey.getPublicExponent(); 
   
//获取私钥 
RSAPrivateKey privateKey=(RSAPrivateKey) getPrivateKey(privateKeyString);     
BigInteger modulus2=privateKey.getModulus(); 
BigInteger exponent2=privateKey..getPrivateExponent(); 

这里,假设我已经从文件中读取到了modulus和exponent:

public class RSACryptography {
	public static String data="hello world";
	public static String modulusString="95701876885335270857822974167577168764621211406341574477817778908798408856077334510496515211568839843884498881589280440763139683446418982307428928523091367233376499779842840789220784202847513854967218444344438545354682865713417516385450114501727182277555013890267914809715178404671863643421619292274848317157";
	public static String publicExponentString="65537";
	public static String privateExponentString="15118200884902819158506511612629910252530988627643229329521452996670429328272100404155979400725883072214721713247384231857130859555987849975263007110480563992945828011871526769689381461965107692102011772019212674436519765580328720044447875477151172925640047963361834004267745612848169871802590337012858580097";
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub		
		//由n和e获取公钥
		PublicKey publicKey=getPublicKey(modulusString, publicExponentString);
		//由n和d获取私钥
		PrivateKey privateKey=getPrivateKey(modulusString, privateExponentString);
		//公钥加密
		byte[] encryptedBytes=encrypt(data.getBytes(), publicKey);	
		System.out.println("加密后:"+new String(encryptedBytes));
		//私钥解密
		byte[] decryptedBytes=decrypt(encryptedBytes, privateKey);		
		System.out.println("解密后:"+new String(decryptedBytes));
	}
	//将base64编码后的公钥字符串转成PublicKey实例
	public static PublicKey getPublicKey(String modulusStr, String exponentStr) throws Exception{
		BigInteger modulus=new BigInteger(modulusStr);
		BigInteger exponent=new BigInteger(exponentStr);
		RSAPublicKeySpec publicKeySpec=new RSAPublicKeySpec(modulus, exponent);
		KeyFactory keyFactory=KeyFactory.getInstance("RSA");
		return keyFactory.generatePublic(publicKeySpec);
	}
	//将base64编码后的私钥字符串转成PrivateKey实例
	public static PrivateKey getPrivateKey(String modulusStr, String exponentStr) throws Exception{
		BigInteger modulus=new BigInteger(modulusStr);
		BigInteger exponent=new BigInteger(exponentStr);
		RSAPrivateKeySpec privateKeySpec=new RSAPrivateKeySpec(modulus, exponent);
		KeyFactory keyFactory=KeyFactory.getInstance("RSA");
		return keyFactory.generatePrivate(privateKeySpec);
	}
	//公钥加密
	public static byte[] encrypt(byte[] content, PublicKey publicKey) throws Exception{
		Cipher cipher=Cipher.getInstance("RSA");//java默认"RSA"="RSA/ECB/PKCS1Padding"
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		return cipher.doFinal(content);
	}
	//私钥解密
	public static byte[] decrypt(byte[] content, PrivateKey privateKey) throws Exception{
		Cipher cipher=Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		return cipher.doFinal(content);
	}
}

运行结果:

加密后:g[>X锽.+?"s謉q琾B?,\??戮陇⒑e*y浌X蜤??眲Z秔豨Wm麞衹靫〩2孲*?X?9赉埤腴暎?~_邊槻U☉疀群廥5z钛?
媷Bdh}>i1运癑障a杽
解密后:hello world

这里三种方式总结起来也就是

1,.KeyPairGenerator获取key;
2. String获取key;
3. modulus和exponent获取key。

--------------------后来,我发现,数据太长抛异常了,好吧---------------------------

然而,当加密的数据太长的时候则需要分组加密,不然数据过长会抛异常,如“Encryt data is too much”,或者“data length is longer than 127”等。

上面三个方法使用的key的n值(modulus)是1024bit的,也就是128byte,根据RSA加密规则,加密1 byte字节的数据,需要12 byte,即其他11byte可能用于记录其他信息什么的,这里我就不清楚了,而1024bit长度的key则最多可以加密128-11=117byte的数据,所以,对于超过117byte的数据,我们需要以117byte为一组进行数据分割。

public class RSACryptography {
	public static String data="hello world";
	public static String modulusString="95701876885335270857822974167577168764621211406341574477817778908798408856077334510496515211568839843884498881589280440763139683446418982307428928523091367233376499779842840789220784202847513854967218444344438545354682865713417516385450114501727182277555013890267914809715178404671863643421619292274848317157";
	public static String publicExponentString="65537";
	public static String privateExponentString="15118200884902819158506511612629910252530988627643229329521452996670429328272100404155979400725883072214721713247384231857130859555987849975263007110480563992945828011871526769689381461965107692102011772019212674436519765580328720044447875477151172925640047963361834004267745612848169871802590337012858580097";
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub		
		//由n和e获取公钥
		PublicKey publicKey=getPublicKey(modulusString, publicExponentString);
		//由n和d获取私钥
		PrivateKey privateKey=getPrivateKey(modulusString, privateExponentString);
		//公钥加密
		String encrypted=encrypt(data, publicKey);	
		System.out.println("加密后:"+encrypted);	
		//私钥解密
		String decrypted=decrypt(encrypted, privateKey);		
		System.out.println("解密后:"+new String(decrypted));
	}
	//将base64编码后的公钥字符串转成PublicKey实例
	public static PublicKey getPublicKey(String modulusStr, String exponentStr) throws Exception{
		BigInteger modulus=new BigInteger(modulusStr);
		BigInteger exponent=new BigInteger(exponentStr);
		RSAPublicKeySpec publicKeySpec=new RSAPublicKeySpec(modulus, exponent);
		KeyFactory keyFactory=KeyFactory.getInstance("RSA");
		return keyFactory.generatePublic(publicKeySpec);
	}
	//将base64编码后的私钥字符串转成PrivateKey实例
	public static PrivateKey getPrivateKey(String modulusStr, String exponentStr) throws Exception{
		BigInteger modulus=new BigInteger(modulusStr);
		BigInteger exponent=new BigInteger(exponentStr);
		RSAPrivateKeySpec privateKeySpec=new RSAPrivateKeySpec(modulus, exponent);
		KeyFactory keyFactory=KeyFactory.getInstance("RSA");
		return keyFactory.generatePrivate(privateKeySpec);
	}
	//公钥加密,并转换成十六进制字符串打印出来
	public static String encrypt(String content, PublicKey publicKey) throws Exception{
		Cipher cipher=Cipher.getInstance("RSA");//java默认"RSA"="RSA/ECB/PKCS1Padding"
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		int splitLength=((RSAPublicKey)publicKey).getModulus().bitLength()/8-11;
		byte[][] arrays=splitBytes(content.getBytes(), splitLength);
		StringBuffer sb=new StringBuffer();
		for(byte[] array : arrays){			
			sb.append(bytesToHexString(cipher.doFinal(array)));
		}
		return sb.toString();
	}
	//私钥解密,并转换成十六进制字符串打印出来
	public static String decrypt(String content, PrivateKey privateKey) throws Exception{
		Cipher cipher=Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		int splitLength=((RSAPrivateKey)privateKey).getModulus().bitLength()/8;
		byte[] contentBytes=hexString2Bytes(content);
		byte[][] arrays=splitBytes(contentBytes, splitLength);
		StringBuffer sb=new StringBuffer();
		for(byte[] array : arrays){	
			sb.append(new String(cipher.doFinal(array)));
		}
		return sb.toString();
	}
	//拆分byte数组
	public static byte[][] splitBytes(byte[] bytes, int splitLength){
		int x; //商,数据拆分的组数,余数不为0时+1
		int y; //余数
		y=bytes.length%splitLength;
		if(y!=0){
			x=bytes.length/splitLength+1;
		}else{
			x=bytes.length/splitLength;
		}
		byte[][] arrays=new byte[x][];
		byte[] array;
		for(int i=0; i<x; i++){
			if(i==x-1 && bytes.length%splitLength!=0){
				array=new byte[bytes.length%splitLength];
				System.arraycopy(bytes, i*splitLength, array, 0, bytes.length%splitLength);
			}else{
				array=new byte[splitLength];
				System.arraycopy(bytes, i*splitLength, array, 0, splitLength);
			}
			arrays[i]=array;
		}
		return arrays;
	}
	//byte数组转十六进制字符串
	public static String bytesToHexString(byte[] bytes) {
    StringBuffer sb = new StringBuffer(bytes.length);
    String sTemp;
    for (int i = 0; i < bytes.length; i++) {
      sTemp = Integer.toHexString(0xFF & bytes[i]);
      if (sTemp.length() < 2)
        sb.append(0);
      sb.append(sTemp.toUpperCase());
    }
    return sb.toString();
  }
	//十六进制字符串转byte数组
	public static byte[] hexString2Bytes(String hex) {
    int len = (hex.length() / 2);
    hex=hex.toUpperCase();
    byte[] result = new byte[len];
    char[] achar = hex.toCharArray();
    for (int i = 0; i < len; i++) {
      int pos = i * 2;
      result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
    }
    return result;
  }
	private static byte toByte(char c) {
    byte b = (byte) "0123456789ABCDEF".indexOf(c);
    return b;
  }
}

运行结果

加密后:0681CEA1051892E038CEB83EDCD5D549B61F31787FEF92123E0961F2E8FAF2590BAD88A2341C9684E6B3791D03D95BDFFF852EFD79B6748364A8A2369828A6E5752FE3910EA162970BAED78ABDE37F2DB2523CB3B47A46A9B2BC2C2C828D6024913B9B52E43837BCD0A6DF74BE14EB593EB732351961EA33732CE5347281EEAE
解密后:hello world

最后,有一点必须强调,因为中间磨了我不少时间。

中间加密后,如果要打印出来,必须以十六进制或者BCD码的形式打印,不能new String(byte[])后,再从这个String里getbytes(),也不要用base64,不然会破坏原数据。

比如,举个例子:

byte[ ] bytes=new byte[ ]{108, -56, 111, 34, -67}; 
byte[ ] newBytes=new String(bytes).getBytes(); 
StringBuffer sb=new StringBuffer(); 
for(int i=0; i<newBytes.length; i++){ 
  sb.append(newBytes[i]+"|"); 
} 
System.out.println(sb.toString()); 

将一个byte数组new String后再getbytes出来后,看看运行结果:

108|-56|111|34|63

最后一个byte由-67变为了63,这个务必注意啊~

总结

以上就是本文关于java加解密RSA使用方法代码示例的全部内容,希望对大家有所帮助。欢迎参阅:Java大数字运算之BigInteger 、Java探索之Thread+IO文件的加密解密代码实例等,有什么问题可以留言指出,欢迎大家交流讨论。

Java实现的数字签名算法RSA完整示例

本文实例讲述了Java实现的数字签名算法RSA。分享给大家供大家参考,具体如下:

一 背景介绍

数字签名:带有密钥(公钥、私钥)的消息摘要算法。
验证数据完整性、认证数据来源、抗否认。
私钥签名、公钥验证。
常用算法:RSA、DSA、ECDSA

二 RSA介绍

包括MD和SHA两类

Java实现的数字签名算法RSA完整示例

三 Java代码实现

package com.imooc.security.rsa2;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import org.apache.commons.codec.binary.Hex;
public class ImoocRSA {
    private static String src = "cakin security rsa";
    public static void main(String[] args) {
        jdkRSA();
    }
    public static void jdkRSA() {
        try {
            //1.初始化密钥
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(512);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
            RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
            //2.执行签名
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
            Signature signature = Signature.getInstance("MD5withRSA");
            signature.initSign(privateKey);
            signature.update(src.getBytes());
            byte[] result = signature.sign();
            System.out.println("jdk rsa sign : " + Hex.encodeHexString(result));
            //3.验证签名
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
            keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
            signature = Signature.getInstance("MD5withRSA");
            signature.initVerify(publicKey);
            signature.update(src.getBytes());
            boolean bool = signature.verify(result);
            System.out.println("jdk rsa verify : " + bool);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四 实现效果

jdk rsa sign : 64b62967438d05f8f9837a089aaecd3b1379fd8eef89b924632536deb95d94d8389da456014ee953a1ac1befe44612c61b750b48c8574b98a9855a07a724e7e4
jdk rsa verify : true

五 应用场景

Java实现的数字签名算法RSA完整示例

PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

在线RSA加密/解密工具:
http://tools.jb51.net/password/rsa_encode

文字在线加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode

MD5在线加密工具:
http://tools.jb51.net/password/CreateMD5Password

在线散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha

在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode

更多关于java相关内容感兴趣的读者可查看本站专题:《Java数学运算技巧总结》、《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

以上就是本次给大家分享的关于Java的全部知识点内容总结,大家还可以在下方相关文章里找到Java文件和base64流相互转换、 java图形界面编程的代码详、 Java实现快速排序原理分析、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:Java中通过Class类获取Class对象的实例方法

下一篇:Java用POI解析excel并获取所有单元格数据的方法整理

展开 +

收起 -

java加密解密 相关内容
Java中MD5加密工具类实例分享

这篇文章主要介绍了Java语言描述MD5加密工具类实例代码,具有一定借鉴价值,需要的朋友可以参考下。

查看详情
Java实现的Base64加密算法知识点总结

这篇文章主要介绍了Java实现的Base64加密算法,结合实例形式分析了Java实现的base64编码转换相关使用方法及操作注意事项,需要的朋友可以参考下

查看详情
java微信小程序开发中加密解密算法总结

这篇文章主要为大家详细介绍了java实现微信小程序加密数据解密算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

查看详情
Java程序设计基础

《Java程序设计基础》是一本关于java的电子书资源,涉及Java、程序设计等相关内容,本文提供大小为158MB的扫描第5PDF格式电子书下载,希望大家能够喜欢。

查看详情
OpenCV3.0 Computer Vision with Java

本文档是OpenCV 3.0 Computer Vision with Java的中文翻译版,如果你是Java开发者、学生、研究者或爱好者,想要在Java中创建计算机视觉应用,那么这本书是为你准备的,感兴趣的就下载来了解一下吧

查看详情
Java EE框架整合开发入门到实战

初学者新手入门,重视实战演练教学视频,全线视频语音解读教育资源丰富 这书详细解读了JavaEE中Spring、SpringMVC和MyBatis三大框架(SSM)的基本知识和实际应用。为了方便帮助用户学习SSM框架,

查看详情
黑马程序员java面试宝典Beta6.0

黑马老师整理的比较全的面试宝典,你面试会提到的技术问题都在这里,有这一本就够了,感兴趣的可以了解一下

查看详情
写给大忙人的Java SE 9核心技术

JavaSE9引进众多关键特性,这种特性危害Java服务平台基地的核心技术和API。很多旧的Java习惯用法已不必须,而新的特性,比如模块化设计,能够让程序流程更高效率。可是把握这种转变并不易

查看详情
精通lambda表达式:Java多核编程

lambda表达式权威指南 《 精通lambda表达式:Java多核编程 》介绍Java SE 8中与lambda相关的特性是如何帮助Java迎接下一代并行硬件架构的挑战的。本书讲解了如何编写lambda、如何在流与集合处理中使

查看详情
RxJava 2.x 实战

《RxJava 2.x 实战》 首先讲解了函数式响应式编程的概念,包括Observables、Subject、Processor 等,以及RxJava的优点和用途。然后讲解了RxJava 中必不可少的操作符,包括创建操作符、变换操作符、过滤

查看详情
java加密解密 学习笔记
网友NO.909334

Java实现的数字签名算法RSA完整示例

本文实例讲述了Java实现的数字签名算法RSA。分享给大家供大家参考,具体如下: 一 背景介绍 数字签名:带有密钥(公钥、私钥)的消息摘要算法。 验证数据完整性、认证数据来源、抗否认。 私钥签名、公钥验证。 常用算法:RSA、DSA、ECDSA 二 RSA介绍 包括MD和SHA两类 三 Java代码实现 package com.imooc.security.rsa2;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import org.apache.commons.codec.binary.Hex;public class ImoocRSA { private static String src = "cakin security rsa"; public static void main(String[] args) { jdkRSA(); } public static void jdkRSA() { try { //1.初始化密……

网友NO.145599

java 非对称加密算法RSA实现详解

现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1、公钥加密,私钥解密;2、私钥加密,公钥解密。下面就为大家分析一下实现代码,相对于DH算法,RSA显得有些简单。 初始化密钥: KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); RSAPrivateKey rsaprivateKey = (RSAPrivateKey)keyPair.getPrivate();//私有密钥 RSAPublicKey rsapublicKey = (RSAPublicKey)keyPair.getPublic();//公有密钥 System.out.println("privateKey : "+Base64.encodeBase64String(rsaprivateKey.getEncoded())); System.out.println("publicKey : "+Base64.encodeBase64String(rsapublicKey.getEncoded())); 1、私钥加密,公钥解密: //私钥加密,公钥解密--加密 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaprivateKey.getEncoded()); KeyFactory privateKeyFactory = KeyFactory.getInstan……

网友NO.332669

java 加密之RSA算法加密与解密的实例详解

java 加密之RSA算法加解密与解密的实例详解 前言: RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。 RSA加密与解密 RSA算法的密钥由公钥和私钥组成,公钥用于加密,私钥用于解密。顾名思义,公钥就是可以进行公开的密钥,一般可以公开给你的合作伙伴;私钥就是私有的,也就是只有你知道的,……

网友NO.950347

Java RSA加密解密实现方法分析【附BASE64 jar包下载】

本文实例讲述了Java RSA加密解密实现方法。分享给大家供大家参考,具体如下: 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar javabase64-1.3.1.jar 本站 下载地址 。 注意: RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常: Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes at com.sun.crypto.provider.RSACipher.a(DashoA13*..) at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..) at javax.crypto.Cipher.doFinal(DashoA13*..) RSAUtils.java package security;import java.io.ByteArrayOutputStream;import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey……

网友NO.693848

java使用RSA与AES加密解密的实例代码详解

首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA •先看代码(先会用在研究) 相关依赖: dependency groupIdorg.bouncycastle/groupId artifactIdbcprov-jdk15on/artifactId version1.58/version /dependency 1,RSA工具类: package cn.wangtao.utils;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.crypto.Cipher;import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;/** * @ClassName RSAUtils * @Auth 桃子 * @Date 2019-6-25 15:15 * @Version 1.0 * @Description **/public class RSAUtils { private static final String RSA = "RSA"; /……

<
1
>

Copyright 2018-2020 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

版权投诉 / 书籍推广 / 赞助:QQ:520161757