http://blog.csdn.net/wxyfighting/article/details/9075215
java实现RSA加密
流程分析:
1、甲方构建密钥对儿,将公钥公布给乙方,将私钥保留。
2、甲方使用私钥加密数据,然后用私钥对加密后的数据签名,发送给乙方签名以及加密后的数据;乙方使用公钥、签名来验证待解密数据是否有效,如果有效使用公钥对数据解密。
3、乙方使用公钥加密数据,向甲方发送经过加密后的数据;甲方获得加密数据,通过私钥解密。
通过java代码实现如下:
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 java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;
/** *//**
* RSA安全编码组件
*
* @version 1.0
* @since 1.0
*/
public abstract class RSACoder extends Coder {
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";
/** *//**
* 用私钥对信息生成数字签名
*
* @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>
* 用私钥解密 http://www.5a520.cn http://www.feng123.com
*
* @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;
}
}
再给出一个测试类:
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import java.util.Map;
/** *//**
*
* @version 1.0
* @since 1.0
*/
public class RSACoderTest {
private String publicKey;
private String privateKey;
@Before
public void setUp() throws Exception {
Map<String, Object> keyMap = RSACoder.initKey();
publicKey = RSACoder.getPublicKey(keyMap);
privateKey = RSACoder.getPrivateKey(keyMap);
System.err.println("公钥: \n\r" + publicKey);
System.err.println("私钥: \n\r" + privateKey);
}
@Test
public void test() throws Exception {
System.err.println("公钥加密——私钥解密");
String inputStr = "abc";
byte[] data = inputStr.getBytes();
byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);
byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData,
privateKey);
String outputStr = new String(decodedData);
System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);
assertEquals(inputStr, outputStr);
}
@Test
public void testSign() throws Exception {
System.err.println("私钥加密——公钥解密");
String inputStr = "sign";
byte[] data = inputStr.getBytes();
byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);
byte[] decodedData = RSACoder
.decryptByPublicKey(encodedData, publicKey);
String outputStr = new String(decodedData);
System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);
assertEquals(inputStr, outputStr);
System.err.println("私钥签名——公钥验证签名");
// 产生签名
String sign = RSACoder.sign(encodedData, privateKey);
System.err.println("签名:\r" + sign);
// 验证签名
boolean status = RSACoder.verify(encodedData, publicKey, sign);
System.err.println("状态:\r" + status);
assertTrue(status);
}
}
相关推荐
在C++实现TransE的过程中,需要注意内存管理和计算效率,因为可能需要处理大量的三元组数据。同时,为了提高计算速度,可以使用多线程或者GPU加速。 压缩包中的"TransE算法"文件可能包含了C++源代码,包括数据...
ieee trans 类文章总结 例如IEEE TRANSACTIONS ON ADVANCED PACKAGING ADVP IEEE Trans. Adv. Packag. CPMTB* IEEE Trans. Compon., Packag., Manuf. Technol. B* (1994–1998) IEEE TRANSACTIONS ON AEROSPACE ...
Data Trans(2003 版).xls, 用于SSR数据处理宏程序DataTrans 1.0,数据处理,数据转换
这意味着`lang-trans`可能依赖Zookeeper来实现某些分布式功能,比如跨节点的协调或一致性管理。 云原生(Cloud Native)是指设计和构建应用程序的方式,使其能够在云环境中高效运行,利用容器化、微服务、持续交付...
TransMac可以读、写、格式化Macintosh的磁盘,CDROMs,与SCSI Drives。Mac OS支持读取FAT格式的Windows磁盘,而Windows却不支持Mac的专有格式,如果你的PC上挂有MacOS的机器和光盘,可以使用TransMac来读取。Trans...
"trans____.zip" 这个压缩包文件很可能包含了用于创建大转盘活动的源代码和相关资源。大转盘是一种常见的互动游戏,通常在网页上实现,用于抽奖或者增加用户参与度。从标签"html"我们可以推断,这个项目的基础是HTML...
在Java 3D编程中,实现对场景中物体的键盘控制是一项常见的需求,这使得用户可以通过键盘交互式地操纵三维空间中的对象。Java 3D库提供了丰富的功能,允许开发者创建复杂的3D图形并实现各种交互操作。在这个场景中,...
"TRANS-RESPOSE-1.rar_transient"这一压缩包文件,其标题暗示了我们将深入探讨瞬态响应的相关知识,通过其中包含的"TRANS RESPOSE 1.docx"文档,我们可以更详细地了解这一主题。 瞬态响应是指当一个系统受到阶跃、...
本文将深入探讨标题"Trans-callback-demo.tar.gz"所涉及的回调概念以及如何在C与C++中实现回调,并结合描述中的例子进行详细说明。 首先,我们来理解一下什么是回调。回调是一种编程技术,它允许我们将一个函数(或...
由于苹果对其操作系统与硬件的严格绑定,实现这一目标通常需要对计算机硬件配置有深入了解,并可能涉及驱动程序的自定义和调整。 2. **TransMac**: TransMac 是由 Acronis 公司开发的一款强大的工具,主要用于非 ...
Corrigendum For ECE-TRANS-300 (Vol.I):2021 European Agreement Concerning the International Carriage of Dangerous Goods by Road(ADR) - 完整英文电子版(1页).zip
macOS 镜像刻录工具,刻录后可以 UEFI 启动,安装黑苹果
- 处理结果:转换完成后,可以通过`Trans.getErrors()`和`Trans.getResult()`等方法获取执行结果。 3. 调用KJB文件(作业): - 加载作业:使用`JobMeta`类解析KJB文件,获取作业的元数据。 - 创建执行器:使用`...
在这个"vc_data_format_trans.rar_VC.Format_format_format_VC_uwb_synchr"压缩包中,主要涵盖了关于VC++中的数据类型转换以及UWB(Ultra-Wideband)同步相关的知识。下面将对这些主题进行深入的探讨。 首先,我们...
本项目"spring_trans.zip"是一个基于Spring框架、DBUtils和XML配置的简单事务控制实例,非常适合初学者入门。以下是这个项目涉及的知识点详解: 1. **Spring框架**:Spring是一个开源的应用框架,提供了依赖注入...
知识图谱是一种结构化的知识表达形式,它以...总之,知识图谱是一个大规模、多领域、多源异构知识集成的载体,是实现智能化信息系统的基础工具和关键基础设施,对于提升信息检索质量、推动智能应用研发具有重要作用。
//存为MoFang.java import java.applet.Applet ; import java.awt.*; import com.sun.j3d.utils.applet.MainFrame ; import java.awt.BorderLayout ; import com.sun.j3d.utils.universe.SimpleUniverse ; import ...
在win系统中的黑苹果U盘制作工具,无须密码,直接使用,
车联网是指通过各种信息通信技术,实现车与车、车与路、车与人、车与网络之间智能信息的交换、共享,以及由此实现的智能交通管理和控制的一种新型技术网络。在现代化的汽车中,车联网技术已经成为标配,它通过为汽车...