Java中RSA非对称密钥加解密使用示例
一、简介:
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。
二、RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表
三、使用方式:
① 假设A、B机器进行通信,已A机器为主;
② A首先需要用自己的私钥为发送请求数据签名,并将公钥一同发送给B;
③ B收到数据后,需要用A发送的公钥进行验证,已确保收到的数据是未经篡改的;
④ B验签通过后,处理逻辑,并把处理结果返回,返回数据需要用A发送的公钥进行加密(公钥加密后,只能用配对的私钥解密);
⑤ A收到B返回的数据,使用私钥解密,至此,一次数据交互完成。
四、代码示例:
- 第一步获取私钥,为签名做准备。
/** * 读取私钥 返回PrivateKey * @param path 包含私钥的证书路径 * @param password 私钥证书密码 * @return 返回私钥PrivateKey * @throws KeyStoreException * @throws NoSuchAlgorithmException * @throws CertificateException * @throws IOException * @throws UnrecoverableKeyException */ private static PrivateKey getPrivateKey(String path,String password) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException { KeyStore ks = KeyStore.getInstance("PKCS12"); FileInputStream fis = new FileInputStream(path); char[] nPassword = null; if ((password == null) || password.trim().equals("")) { nPassword = null; } else { nPassword = password.toCharArray(); } ks.load(fis, nPassword); fis.close(); Enumeration<String> en = ks.aliases(); String keyAlias = null; if (en.hasMoreElements()) { keyAlias = (String) en.nextElement(); } return (PrivateKey) ks.getKey(keyAlias, nPassword); }
- 签名示例 通过第一步得到的私钥,进行签名操作,具体请看以下代码:
/** * 私钥签名: 签名方法如下:BASE64(RSA(MD5(src),privatekey)),其中src为需要签名的字符串, privatekey是商户的CFCA证书私钥。 * @param plainText 待签名字符串 * @param path 签名私钥路径 * @param password 签名私钥密码 * @return 返回签名后的字符串 * @throws Exception */ public static String sign(String plainText,String path,String password) throws Exception { /* * MD5加密 */ MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(plainText.getBytes("utf-8")); byte[] digestBytes = md5.digest(); /* * 用私钥进行签名 RSA * Cipher负责完成加密或解密工作,基于RSA */ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); //ENCRYPT_MODE表示为加密模式 cipher.init(Cipher.ENCRYPT_MODE, getPrivateKey(path, password)); //加密 byte[] rsaBytes = cipher.doFinal(digestBytes); //Base64编码 return Base64.byteArrayToBase64(rsaBytes);
- B收到数据后,需要使用A提供的公钥信息进行验签,此处使用公钥的N、E进行验签
首先通过公钥N、E得到公钥PublicKey,如下:/** * 根据公钥n、e生成公钥 * @param modulus 公钥n串 * @param publicExponent 公钥e串 * @return 返回公钥PublicKey * @throws Exception */ public static PublicKey getPublickKey(String modulus, String publicExponent) throws Exception { KeySpec publicKeySpec = new RSAPublicKeySpec( new BigInteger(modulus, 16), new BigInteger(publicExponent, 16)); KeyFactory factory = KeyFactory.getInstance("RSA"); PublicKey publicKey = factory.generatePublic(publicKeySpec); return publicKey; }
得到公钥PublicKey后,再去验证签名,代码如下:
/** * 用公钥证书进行验签 * @param message 签名之前的原文 * @param cipherText 签名 * @param pubKeyn 公钥n串 * @param pubKeye 公钥e串 * @return boolean 验签成功为true,失败为false * @throws Exception */ public static boolean verify(String message, String cipherText,String pubKeyn, String pubKeye) throws Exception { Cipher c4 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示解密模式 c4.init(Cipher.DECRYPT_MODE, getPublickKey(pubKeyn,pubKeye)); // 解密 byte[] desDecTextBytes = c4.doFinal(Base64.base64ToByteArray(cipherText)); // 得到前置对原文进行的MD5 String md5Digest1 = Base64.byteArrayToBase64(desDecTextBytes); MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(message.getBytes("utf-8")); byte[] digestBytes = md5.digest(); // 得到商户对原文进行的MD5 String md5Digest2 = Base64.byteArrayToBase64(digestBytes); // 验证签名 if (md5Digest1.equals(md5Digest2)) { return true; } else { return false; } }
至此,签名验签已经完毕
- 提供一个从.cer文件读取公钥的方法:
/** * 读取公钥cer * @param path .cer文件的路径 如:c:/abc.cer * @return base64后的公钥串 * @throws IOException * @throws CertificateException */ public static String getPublicKey(String path) throws IOException, CertificateException{ InputStream inStream = new FileInputStream(path); ByteArrayOutputStream out = new ByteArrayOutputStream(); int ch; String res = ""; while ((ch = inStream.read()) != -1) { out.write(ch); } byte[] result = out.toByteArray(); res = Base64.byteArrayToBase64(result); return res; }
- 附上所有代码: http://pan.baidu.com/share/link?shareid=23044&uk=2986731784
本文转自:http://www.huosen.net/archives/124.html
相关推荐
### RSA密码算法及其Java实现 #### 一、引言 随着计算机技术和互联网的快速发展,信息安全问题日益凸显。...通过Java语言实现这一算法,有助于更好地理解和掌握非对称密钥体制的关键概念和技术。
RSA是一种非对称加密算法,由两个密钥——公钥和私钥组成。公钥用于加密,私钥用于解密。在QQ通信中,为了保护用户信息和聊天内容的安全,我们可以使用RSA进行数据加密。发送方使用接收方的公钥加密数据,只有持有...
在可搜索加密的实现中,一般会结合使用对称加密(如DES)和公钥加密(如RSA)技术。对称加密用于高效地加密大量数据,而公钥加密则用于安全地交换对称密钥,使得只有客户端和服务器才能解密通信内容。这种混合策略在...
RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,例如数字签名、数据加密等。本项目是一个使用Java实现的RSA加密模拟程序,旨在帮助开发者理解和运用RSA算法。 在RSA加密中,有两个关键的密钥:公钥...
- **RSA**:非对称加密算法,安全性高,但速度相对较慢,常用于密钥交换和数字签名。 - **DES(Data Encryption Standard)**:较老的对称加密算法,已被AES取代,但在某些场景下仍有应用。 3. **对称加密与非...
RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是现代密码学的基石之一。它广泛应用于数据加密、数字签名等领域,尤其在移动应用如Android中,用于保护敏感数据的安全传输和...
RSA算法是一种非对称加密算法,它在信息安全领域扮演着重要的角色,特别是在数据加密和数字签名中。这个压缩包文件包含了一些与RSA攻击方式相关的Java程序,分别命名为Brocast、Factor、Together、Choose和Main。...
RSA 是一种非对称加密算法,它使用一对公钥和私钥,其中公钥用于加密,私钥用于解密。在 JMeter 中,你需要获取 RSA 加密的 Java 代码或由开发人员提供的加密库(jar 包)。如果已获得 jar 包,将其放入 JMeter 安装...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
可能使用的是对称加密如AES(Advanced Encryption Standard)或非对称加密如RSA,保证信息在传输过程中的安全性。 6. **网络安全**:网络安全在聊天系统中至关重要。HTTPS协议可能被用于提供安全的网络通信,防止...
这些API支持各种加密算法,包括对称加密(如AES、DES)、非对称加密(RSA、ECC)以及哈希函数(MD5、SHA系列)等。 2. **对称加密**: 在这个模拟程序中,可能使用了对称加密算法,例如AES(高级加密标准)。对称...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
1. **加密与解密**:使用`Cipher`接口,我们可以实现对称加密和非对称加密。对称加密如AES(高级加密标准),非对称加密如RSA。以下是一个简单的AES加密和解密的示例: ```java import javax.crypto.Cipher; import...
RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因其发明者的名字首字母而得名。这种算法基于大数因子分解的困难性,为数据传输和存储提供了安全保障。 **RSA算法原理** RSA的...
Java的`javax.crypto.Cipher`类提供了对称加密(如AES)和非对称加密(如RSA)的支持。对称加密用于大量数据的快速加密,而非对称加密用于密钥交换,确保只有合法用户能解密信息。SSL/TLS协议在Web通信中广泛用于...
2. **公钥与私钥原理**:在SSL/TLS中,非对称加密算法如RSA、DSA等被用于密钥交换。公钥是公开的,任何人都可以获取,而私钥必须保密。公钥用于加密数据,私钥用于解密。 3. **SSL握手过程**: - 客户端发起连接...
Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四”...