`
umbrellall1
  • 浏览: 146303 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

RSA加密例子和中途遇到的问题

阅读更多
在进行RSA加密例子

package test;
import java.io.IOException;
import java.security.Key;
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 sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder;

import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;

public abstract class RSACoder {
	public static final String KEY_ALGORITHM = "RSA";
	public static final String SIGNATURE_ALGORITHM = "MD5withRSA";

	private static final String PUBLIC_KEY = "RSAPublicKey";
	private static final String PRIVATE_KEY = "RSAPrivateKey";

	
	public static byte[] decryptBASE64(String privateKey){
		byte[] output = null;
		try {
			output = (new BASE64Decoder()).decodeBuffer(privateKey);
			return  output;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return output;  
	}
	
	
	public static String encryptBASE64( byte[] keyBytes){
         String s = (new BASE64Encoder()).encode(keyBytes);
         return s;
	}
	
	/**
	 * 用私钥对信息生成数字签名
	 * 
	 * @param data
	 *            加密数据
	 * @param privateKey
	 *            私钥
	 * 
	 * @return
	 * @throws Exception
	 */
	public static String sign(byte[] data, String privateKey) throws Exception {
		// 解密由base64编码的私钥
		byte[] keyBytes = decryptBASE64(privateKey);

		// 构造PKCS8EncodedKeySpec对象
		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);

		// KEY_ALGORITHM 指定的加密算法
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

		// 取私钥匙对象
		PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);

		// 用私钥对信息生成数字签名
		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
		signature.initSign(priKey);
		signature.update(data);
		
		return encryptBASE64(signature.sign());
	}

	/**
	 * 校验数字签名
	 * 
	 * @param data
	 *            加密数据
	 * @param publicKey
	 *            公钥
	 * @param sign
	 *            数字签名
	 * 
	 * @return 校验成功返回true 失败返回false
	 * @throws Exception
	 * 
	 */
	public static boolean verify(byte[] data, String publicKey, String sign)
			throws Exception {

		// 解密由base64编码的公钥
		byte[] keyBytes = decryptBASE64(publicKey);

		// 构造X509EncodedKeySpec对象
		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);

		// KEY_ALGORITHM 指定的加密算法
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

		// 取公钥匙对象
		PublicKey pubKey = keyFactory.generatePublic(keySpec);

		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
		signature.initVerify(pubKey);
		signature.update(data);

		// 验证签名是否正常
		return signature.verify(decryptBASE64(sign));
	}

	/**
	 * 解密<br>
	 * 用私钥解密
	 * 
	 * @param data
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] decryptByPrivateKey(byte[] data, String key)
			throws Exception {
		// 对密钥解密
		byte[] keyBytes = decryptBASE64(key);

		// 取得私钥
		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

		// 对数据解密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, privateKey);

		return cipher.doFinal(data);
	}

	/**
	 * 解密<br>
	 * 用公钥解密
	 * 
	 * @param data
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] decryptByPublicKey(byte[] data, String key)
			throws Exception {
		// 对密钥解密
		byte[] keyBytes = decryptBASE64(key);

		// 取得公钥
		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		Key publicKey = keyFactory.generatePublic(x509KeySpec);

		// 对数据解密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.DECRYPT_MODE, publicKey);

		return cipher.doFinal(data);
	}

	/**
	 * 加密<br>
	 * 用公钥加密
	 * 
	 * @param data
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] encryptByPublicKey(byte[] data, String key)
			throws Exception {
		// 对公钥解密
		byte[] keyBytes = decryptBASE64(key);

		// 取得公钥
		X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		Key publicKey = keyFactory.generatePublic(x509KeySpec);

		// 对数据加密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);

		return cipher.doFinal(data);
	}

	/**
	 * 加密<br>
	 * 用私钥加密
	 * 
	 * @param data
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] encryptByPrivateKey(byte[] data, String key)
			throws Exception {
		// 对密钥解密
		byte[] keyBytes = decryptBASE64(key);

		// 取得私钥
		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

		// 对数据加密
		Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);

		return cipher.doFinal(data);
	}

	/**
	 * 取得私钥
	 * 
	 * @param keyMap
	 * @return
	 * @throws Exception
	 */
	public static String getPrivateKey(Map<String, Object> keyMap)
			throws Exception {
		Key key = (Key) keyMap.get(PRIVATE_KEY);

		return encryptBASE64(key.getEncoded());
	}

	/**
	 * 取得公钥
	 * 
	 * @param keyMap
	 * @return
	 * @throws Exception
	 */
	public static String getPublicKey(Map<String, Object> keyMap)
			throws Exception {
		Key key = (Key) keyMap.get(PUBLIC_KEY);

		return encryptBASE64(key.getEncoded());
	}

	/**
	 * 初始化密钥
	 * 
	 * @return
	 * @throws Exception
	 */
	public static Map<String, Object> initKey() throws Exception {
		KeyPairGenerator keyPairGen = KeyPairGenerator
				.getInstance(KEY_ALGORITHM);
		keyPairGen.initialize(1024);

		KeyPair keyPair = keyPairGen.generateKeyPair();

		// 公钥
		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

		// 私钥
		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

		Map<String, Object> keyMap = new HashMap<String, Object>(2);

		keyMap.put(PUBLIC_KEY, publicKey);
		keyMap.put(PRIVATE_KEY, privateKey);
		return keyMap;
	}
}




测试类


package test;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder;
public class RSACoderTest {
	
package com;
import java.util.Map;
import sun.misc.BASE64Encoder;
public class RSACoderTest {
		static String privateKey ;
		static String publicKey ;
		public static void getKey() throws Exception {
		Map<String, Object> keyMap = RSACoder.initKey();

		publicKey = RSACoder.getPublicKey(keyMap);
		privateKey = RSACoder.getPrivateKey(keyMap);
		//公钥生成
		System.out.println("public : "+publicKey);
		//私钥生成
		System.out.println("private : "+privateKey);
	}
	public static void main(String[] args) throws Exception {
		 getKey() ;
//		System.err.println("公钥加密——私钥解密");
                //将明文转换为字节数组
		byte[] data = "serricee1".getBytes();
               //用公钥加密
		byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);
                //打印加密字符串 为什么使用BASE64Encoder 因为在RSACoder里加密用的是 BASE64Encoder 加密
		String s = (new BASE64Encoder()).encode(encodedData);  
		System.err.println("加密: " +s);
//                //用私钥解密
		byte[] decodedData = RSACoder.decryptByPrivateKey(RSACoder.decryptBASE64(s),privateKey);
//
//		
		System.out.println( "解密后: " + new String(decodedData));
	}
	

}







遇到的问题在
解密的时候 用new BASE64Encoder()).encode(keyBytes); 获得明文发现明文长度只能是4的倍数而且不支持特殊字符串和中文不然解密出来不是多出来 就是解密不对 后面解密
直接用.getBytes() 和new String(decodedData)不用Base64的就好了

分享到:
评论
1 楼 mfkxk298 2015-11-06  
很有用,感谢!!

相关推荐

    易语言 rsa加密 易语言 rsa加密易语言 rsa加密

    易语言 rsa加密 易语言 rsa加密易语言 rsa加密

    RSA加密示例

    RSA加密算法是信息安全...通过简化数字的示例,我们不但能够直观地学习到RSA的加密和解密过程,还能够深刻理解其背后的数学原理和安全性基础。随着对这个示例的理解加深,读者将能够更好地应用RSA算法,保障信息安全。

    rsa.zip_QT RSA加密算法_Qt rsa加密_qt rsa加密步骤_rsa_rsa算法 qt

    在`mainwindow.ui`文件中,可以找到界面的设计布局,比如输入框、按钮等,用于输入明文、展示密文以及控制加密和解密的操作。 5. `main.cpp`是项目的主入口点,它初始化Qt应用并处理事件循环。`RSA.pro`和`RSA.pro....

    RSA加密解密工具,用于文件的加密和解密* RSA加密解密:私钥解密,公钥加密

    在本压缩包中,提供了RSA加密解密的工具——PRO_TDES_RSA.exe,这是一个执行程序,能够帮助用户对文件进行加密和解密操作。结合"RSATool工具简易操作指南 .doc",用户可以详细了解如何使用这个工具来保护他们的敏感...

    unity工具类RSA加密和解密

    本文将深入探讨RSA加密和解密的基础知识以及如何在Unity中实现这一功能。 首先,RSA加密的核心原理是基于大整数因子分解的困难性。它生成一对密钥:公钥和私钥。公钥可以公开,用于加密;而私钥必须保密,用于解密...

    RSA.rar_RSA加密文件_RSA加密解密和_rsa加密算法_对称 加密文件_对称加密

    10. **源代码与实践**:提供的RAR文件可能包含RSA加密和解密的源代码及可执行文件,这对于学习密码学理论和实践非常有价值。通过阅读和运行这些代码,可以深入理解RSA的工作机制。 总之,RSA加密算法是现代密码学的...

    C# RSA加密解密

    1. 设计UI:添加两个文本框(分别用于输入明文和显示密文)、两个按钮(加密和解密)以及可能的其他元素。 2. 在按钮的点击事件处理程序中,获取用户输入的明文,执行加密或解密操作,然后将结果展示在相应的文本框...

    java js RSA加密支持超长加密

    RSA算法基于大数因子分解的困难性,由三个步骤组成:密钥生成、加密和解密。公钥是公开的,任何人都可以用来加密信息,而私钥必须保密,用于解密信息。加密时,信息被大整数模指数运算处理;解密则通过逆运算实现。 ...

    C++写的实现RSA加密

    1. RSA加密算法:RSA加密是一种常用的非对称加密算法,广泛应用于数据加密和身份验证等领域。 2. 大数运算:RSA加密算法基于大数运算,因此需要定义大数类型的数据结构和运算函数。 3. 数据结构:struct slink ...

    RSA加密算法实验报告.pdf

    本实验报告主要介绍了RSA加密算法的实现和原理,包括密钥对的产生、加密和解密过程、数字签名等。下面是该实验报告的详细知识点总结: 一、RSA加密算法的原理 RSA加密算法是基于大数分解问题的安全性,公钥和私钥...

    RSA.zip_RSA 加密解密_rsa_rsa加密算法_rsa加密解密_rsa加密解密算法

    `RSA.C`可能包含了RSA算法的具体实现,如密钥生成、加密和解密的函数。`RSA.H`可能是头文件,定义了相关的数据结构和函数原型,供其他模块调用。`www.pudn.com.txt`可能是下载这个资源的网站信息或者一些说明文档。 ...

    rsa加密算法(Delphi实现).zip

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏...

    pb_rsa.zip_PB做加密解密_RSA PB_pb 加密_rsa pb_rsa加密

    用PowerBuilder实现RSA加密算法

    RSA.rar_RSA加密文件_RSA加密明文_RSA加密解密和_rsa c_rsa文件加密

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据传输的安全保护上。这个RAR压缩包文件“RSA.rar”包含了关于...对于学习RSA算法和实践加密应用的开发者来说,这是一个非常有价值的资源。

    RSA加密算法在VB中的实现.rar_RSA VB_VB RSA_rsa加密算法_vb rsa_vb 加密

    这种算法基于大整数因子分解的困难性,使得它在信息安全领域被广泛用于数据加密和数字签名。在VB(Visual Basic)环境中实现RSA加密算法,可以帮助开发者更好地理解加密过程,并在实际项目中应用。 首先,我们需要...

    C#RSA加密DEMO

    RSA是一种非对称加密算法,它的特点是拥有两个密钥:公钥和私钥,分别用于加密和解密。 在这个"C# RSA加密DEMO"中,我们主要关注如何在C#环境中使用RSA加密。首先,我们需要理解RSA的基本工作原理。RSA基于大数因子...

    PB12.5可实用的RSA加密算法(源码含Demo).zip

    1. **源码**:这是实现RSA算法的关键部分,通常会包含一系列函数或类,用于生成密钥对、加密和解密数据。这些函数可能会使用PowerBuilder内置的数学库或者第三方库来处理大整数运算。 2. **Demo**:演示程序展示了...

    RSA加密,rsa加密解密过程,matlab

    RSA加密是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它在信息安全领域有着广泛的应用,尤其是在数据加密、数字签名和安全通信中。RSA的核心特点是使用一对公钥和...

    POSTMAN RSA加密 - forge.js

    `forge.js`是Forge.js库本身,包含所有加密和解密功能。`RSAUtils.js`可能是一个自定义的工具集,封装了上述步骤,以简化在Postman中的RSA加密操作。你可以查看这个文件以了解如何更方便地在Postman环境中使用Forge....

    RSA加密解密(C#)实现

    RSA加密解密C#实现调用实例 public string RSAEncrypt(string xmlPublicKey, string m_strEncryptString) { try { byte[] PlainTextBArray; byte[] CypherTextBArray; string Result; System.Security....

Global site tag (gtag.js) - Google Analytics