`

Java RSA加密(一)--BCD输出

阅读更多

代码如下:

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.util.HashMap;

import javax.crypto.Cipher;

public class RSAUtils {

	/**
	 * 生成公钥和私钥
	 * @throws NoSuchAlgorithmException 
	 *
	 */
	public static HashMap<String, Object> getKeys() throws NoSuchAlgorithmException{
		HashMap<String, Object> map = new HashMap<String, Object>();
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        keyPairGen.initialize(1024);
        KeyPair keyPair = keyPairGen.generateKeyPair();
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        map.put("public", publicKey);
        map.put("private", privateKey);
        return map;
	}
	/**
	 * 使用模和指数生成RSA公钥
	 * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA
	 * /None/NoPadding】
	 * 
	 * @param modulus
	 *            模
	 * @param exponent
	 *            指数
	 * @return
	 */
	public static RSAPublicKey getPublicKey(String modulus, String exponent) {
		try {
			BigInteger b1 = new BigInteger(modulus);
			BigInteger b2 = new BigInteger(exponent);
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);
			return (RSAPublicKey) keyFactory.generatePublic(keySpec);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 使用模和指数生成RSA私钥
	 * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA
	 * /None/NoPadding】
	 * 
	 * @param modulus
	 *            模
	 * @param exponent
	 *            指数
	 * @return
	 */
	public static RSAPrivateKey getPrivateKey(String modulus, String exponent) {
		try {
			BigInteger b1 = new BigInteger(modulus);
			BigInteger b2 = new BigInteger(exponent);
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2);
			return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 公钥加密
	 * 
	 * @param data
	 * @param publicKey
	 * @return
	 * @throws Exception
	 */
	public static String encryptByPublicKey(String data, RSAPublicKey publicKey)
			throws Exception {
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		// 模长
		int key_len = publicKey.getModulus().bitLength() / 8;
		// 加密数据长度 <= 模长-11
		String[] datas = splitString(data, key_len - 11);
		String mi = "";
		//如果明文长度大于模长-11则要分组加密
		for (String s : datas) {
			mi += bcd2Str(cipher.doFinal(s.getBytes()));
		}
		return mi;
	}

	/**
	 * 私钥解密
	 * 
	 * @param data
	 * @param privateKey
	 * @return
	 * @throws Exception
	 */
	public static String decryptByPrivateKey(String data, RSAPrivateKey privateKey)
			throws Exception {
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		//模长
		int key_len = privateKey.getModulus().bitLength() / 8;
		byte[] bytes = data.getBytes();
		byte[] bcd = ASCII_To_BCD(bytes, bytes.length);
		System.out.println(bcd.length);
		//如果密文长度大于模长则要分组解密
		String ming = "";
		byte[][] arrays = splitArray(bcd, key_len);
		for(byte[] arr : arrays){
			ming += new String(cipher.doFinal(arr));
		}
		return ming;
	}
	/**
	 * ASCII码转BCD码
	 * 
	 */
	public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {
		byte[] bcd = new byte[asc_len / 2];
		int j = 0;
		for (int i = 0; i < (asc_len + 1) / 2; i++) {
			bcd[i] = asc_to_bcd(ascii[j++]);
			bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4));
		}
		return bcd;
	}
	public static byte asc_to_bcd(byte asc) {
		byte bcd;

		if ((asc >= '0') && (asc <= '9'))
			bcd = (byte) (asc - '0');
		else if ((asc >= 'A') && (asc <= 'F'))
			bcd = (byte) (asc - 'A' + 10);
		else if ((asc >= 'a') && (asc <= 'f'))
			bcd = (byte) (asc - 'a' + 10);
		else
			bcd = (byte) (asc - 48);
		return bcd;
	}
	/**
	 * BCD转字符串
	 */
	public static String bcd2Str(byte[] bytes) {
		char temp[] = new char[bytes.length * 2], val;

		for (int i = 0; i < bytes.length; i++) {
			val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);
			temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');

			val = (char) (bytes[i] & 0x0f);
			temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
		}
		return new String(temp);
	}
	/**
	 * 拆分字符串
	 */
	public static String[] splitString(String string, int len) {
		int x = string.length() / len;
		int y = string.length() % len;
		int z = 0;
		if (y != 0) {
			z = 1;
		}
		String[] strings = new String[x + z];
		String str = "";
		for (int i=0; i<x+z; i++) {
			if (i==x+z-1 && y!=0) {
				str = string.substring(i*len, i*len+y);
			}else{
				str = string.substring(i*len, i*len+len);
			}
			strings[i] = str;
		}
		return strings;
	}
	/**
	 *拆分数组 
	 */
	public static byte[][] splitArray(byte[] data,int len){
		int x = data.length / len;
		int y = data.length % len;
		int z = 0;
		if(y!=0){
			z = 1;
		}
		byte[][] arrays = new byte[x+z][];
		byte[] arr;
		for(int i=0; i<x+z; i++){
			arr = new byte[len];
			if(i==x+z-1 && y!=0){
				System.arraycopy(data, i*len, arr, 0, y);
			}else{
				System.arraycopy(data, i*len, arr, 0, len);
			}
			arrays[i] = arr;
		}
		return arrays;
	}
	public static void main(String[] args) throws Exception {
		HashMap<String, Object> map = RSAUtils.getKeys();
		//生成公钥和私钥
		RSAPublicKey publicKey = (RSAPublicKey) map.get("public");
		RSAPrivateKey privateKey = (RSAPrivateKey) map.get("private");
		
		//模
		String modulus = publicKey.getModulus().toString();
		//公钥指数
		String public_exponent = publicKey.getPublicExponent().toString();
		//私钥指数
		String private_exponent = privateKey.getPrivateExponent().toString();
		//明文
		String ming = "123456789";
		//使用模和指数生成公钥和私钥
		RSAPublicKey pubKey = RSAUtils.getPublicKey(modulus, public_exponent);
		RSAPrivateKey priKey = RSAUtils.getPrivateKey(modulus, private_exponent);
		//加密后的密文
		String mi = RSAUtils.encryptByPublicKey(ming, pubKey);
		System.out.println("密文:"+mi);
		//解密后的明文
		ming = RSAUtils.decryptByPrivateKey(mi, priKey);
		System.out.println("原文:"+ming);
	}
}

 

输出结果:

密文:42010FD3240247C44623D3B94A75D817B3C6BDF1782D9431A674DB0D0563566E8BE793A64978F15C50FFD678A0A58F9D3749A794F6EA7EED0770FE52240ED45F95C14FBDB7B353E7EFBDE3DB14AC953349D000720CB9D57EDD0FF3172F8B83E784BAB5AB3778D76D969F6D4A160293B01C3017E7D30BE17DF0F4656DFEEDA3EB
128
原文:123456789

 

分享到:
评论

相关推荐

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

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

    Object-C-在iOS上使用Object-C进行RSA算法的加密+解密实现代码

    RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于数据安全领域,如数字签名、密钥交换等。本教程将详细讲解如何在iOS项目中使用Object-C实现RSA算法的加密和解密功能。 了解RSA的基本原理至关重要。...

    RSA加密工具-可生成秘钥-自定义加密文本

    RSA加密工具-可生成秘钥-自定义加密文本

    RSA加密算法--java实现

    在实际项目中,`ss4c_rsa`可能是一个包含RSA密钥对的文件,或者是用于演示RSA加密的Java代码。具体实现细节可能包括如何读取和写入密钥文件,如何进行加密和解密操作,以及如何处理可能出现的安全问题。学习和理解...

    Java RSA加密前后端实现

    Java RSA加密技术是一种广泛应用于网络通信安全中的非对称加密算法,主要特点是公钥和私钥成对出现,其中公钥用于加密,私钥用于解密。这种加密方式的安全性较高,因为即使加密数据被截获,没有相应的私钥也无法解密...

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

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

    javaRSA加密C++RSA解密

    JAVA也是通过包来实现加密和解密的,那么我的C++是通过OPENSSL的库来实现的。 重点来到了:RSA使用过程 1、C++随机生成一对公钥和私钥 2、JAVA用公钥给明文打包形成密文 3、C++用私钥解密密文

    java rsa加密算法实现

    在Java中实现RSA加密算法,主要涉及以下几个核心概念和步骤: 1. **RSA原理**:RSA算法基于数论中的大数因子分解难题,由两个大素数P和Q相乘得到N,然后计算N的欧拉函数φ(N) = (P-1) * (Q-1),选取一个与φ(N)互质...

    Rsa加密解密.rar_RSA 加密解密_java rsa_rsa加密_rsa加密java_加密 解密

    RSA加密解密是一种广泛应用于网络安全领域的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家在1977年提出,因此得名RSA。这种算法基于大整数因子分解的困难性,使得只有持有正确密钥的人才能...

    java js RSA加密支持超长加密

    RSA加密是一种非对称加密算法,它基于两个不同的密钥:公钥和私钥。在Java和JavaScript中实现RSA加密,对于处理较长的数据至关重要,因为这两种语言的标准库默认的RSA加密只能处理相对较小的块。这里我们将深入探讨...

    微信小程序-微信小程序-RSA-签名-验签-加密-解密

    &gt; 一个适用于微信小程序的RSA签名库。 RSA签名的小程序DEMO:https://github.com/zhangzhaopds/WeixinApp_RSA_Signature.git 使用 1、引入文件 var RSA = require('../../utils/wxapp_rsa.js') 2、调用 var private...

    RSA-Digital-Signature-master_加密_RSA数字签名_

    这个"RSA-Digital-Signature-master"压缩包可能包含了一个关于如何使用RSA算法实现数字签名的示例代码或教程。 在RSA算法中,一对密钥被生成:公钥和私钥。公钥可以公开给任何人,而私钥则必须由密钥拥有者妥善保管...

    java与oc使用rsa加密

    - 文件名为`RSA-finnal`可能包含Java和Objective-C的加密示例代码,或者加密后的数据文件。 6. 注意事项: - RSA加密效率较低,不适合大量数据的加密,通常用于加密对称密钥,而非直接加密大量数据。 - 确保私钥...

    C#RSA加密与JAVA解密,实现相互通信

    最后,涉及到ConsoleApplication1可能是一个C#的控制台应用程序示例,这个项目可能包含了实现RSA加密和解密的代码,用于演示如何在C#和Java之间进行安全的数据交换。通过阅读和理解这个示例代码,开发者可以更好地...

    Java实现文件的RSA和DES加密

    Java 实现文件的 RSA 和 DES 加密 在现代密码技术中,根据密钥类型的不同,可以将其分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对称加密算法用来对敏感数据等信息进行加密,常用的...

    Java RSA 加密解密

    在`android-rsa-master`这个项目中,可能包含了完整的Android RSA加密解密示例,包括如何在Android环境中生成和使用密钥对,以及如何处理文件的加解密。这个项目可能包括了Android特有的安全存储,如Keystore系统,...

    POSTMAN RSA加密 - forge.js

    POSTMAN RSA加密是一种在Postman测试工具中使用RSA加密技术的方法,主要涉及到JavaScript库Forge.js。Forge.js是一个强大的开源加密库,提供了多种加密算法,包括RSA(Rivest-Shamir-Adleman),这对于安全地传输...

    java RSA加密 解密

    Java RSA 加密解密是一种常用的非对称加密算法,广泛应用于数据加密和数字签名等领域。但是,RSA 加密算法的速度相对较慢,一般不用于加密大数据,而是用于加密对称加密的密钥,以保证数据的安全。 相关知识点: *...

    C# .net 使用Java公钥实现RSA加密

    C# .net 使用Java公钥实现RSA加密

    java_RSA2048加密解密.zip

    Java RSA2048加密解密技术是一种广泛应用于网络通信中的安全机制,它结合了非对称加密算法RSA和2048位的密钥长度,以提供强大的数据保护。在给定的“java_RSA2048加密解密.zip”压缩包中,包含了前后端实现RSA2048...

Global site tag (gtag.js) - Google Analytics