一、简介:
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=298673178
- 转载自http://www.huosen.net/archives/124.html
相关推荐
"RSA加解密及公钥密生成工具"这个文件可能是包含上述功能的Delphi源码文件或者一个简单的GUI应用程序,它提供了一个用户友好的界面,使得用户能够轻松地生成RSA密钥对,并进行加密和解密操作。 通过学习和理解这段...
对于大量数据,通常会结合使用RSA和对称加密算法(如AES),使用RSA加密对称密钥,然后用对称密钥加密大量数据。 在提供的压缩包文件中,"www.pudn.com.txt"可能包含了关于RSA加密解密的代码示例或相关资源,而"Rsa...
以上就是Java中使用RSA加密解密的基本操作,包括生成密钥对、保存和加载密钥文件,以及处理超长字符的分块加密和解密。这些知识点在实际的项目开发中非常实用,特别是涉及到敏感数据传输和存储时。在处理过程中,...
工程根目录下mds5/src/com/目录下有两个例子: 其中DES.java是DES算法的对称加密解密 其中RSA.java是RSA算法的非对称加密解密 项目只给出了加密解密方法,并没有给出保存密钥的方法
在Java中,可以使用Java Cryptography Architecture(JCA)来实现RSA加密解密算法。JCA提供了一个完整的加密解决方案,包括密钥对生成、加密和解密等功能。 知识点3:密钥对生成 在RSA加密解密算法中,密钥对的...
我的博客中有一篇相关的技术文章: https://linge.blog.csdn.net/article/details/139730668 本程序包是使用PHP开发实现了RSA非对称加解密的一些程序示例。文章中也有使用Python进行处理的技术介绍。RSA非对称加...
在Java中,我们可以使用`java.security`包下的`KeyPairGenerator`和`Cipher`类来生成和操作RSA密钥对,并进行加密和解密操作。 **AES对称加密** AES(Advanced Encryption Standard),即高级加密标准,是一种常用...
在Java中,我们可以使用`java.security`包中的`KeyPairGenerator`, `PublicKey`, 和 `PrivateKey` 类来实现RSA加密解密。例如,`RSASecurityUtil.java` 文件可能包含以下内容: ```java import java.security.Key...
本文详细介绍了如何在SQL Server 2012中使用非对称密钥进行数据的加密与解密操作,包括创建非对称密钥、创建加密和解密函数以及非对称密钥的管理等关键步骤。通过这种方式,可以有效地提高数据的安全性和隐私保护...
非对称加密与对称加密的主要区别在于,它使用两个不同的密钥:一个公钥用于加密,另一个私钥用于解密。RSA的名字来源于它的发明者Ron Rivest、Adi Shamir和Leonard Adleman。 在Java中实现RSA公钥加密,你需要先生...
在"C# RSA非对称加密与解密"的demo中,MvcApplication3可能是一个ASP.NET MVC项目,包含了实现上述功能的代码示例。在这样的项目中,通常会有控制器(Controller)处理加密和解密请求,视图(View)显示结果,以及...
而在Java中,我们可以利用`java.security`包中的`KeyPairGenerator`,`PublicKey`,`PrivateKey`等类来生成和管理密钥,`Cipher`类则用于实际的加解密操作。 对于"PHP_JAVA_RSA互通加解密"项目,关键在于两个平台间...
RSA非对称加密算法在IT领域中被广泛用于安全通信,特别是在登录系统中,它能够确保用户信息的安全传输。在给定的上下文中,我们看到一个C#和JavaScript结合的应用,用于实现登录过程中的密码加密和解密。下面将详细...
Java RSA2048加密解密技术是一种广泛应用于网络通信中的安全机制,它结合了非对称加密算法RSA和2048位的密钥长度,以提供强大的数据保护。在给定的“java_RSA2048加密解密.zip”压缩包中,包含了前后端实现RSA2048...
RSA是一种非对称加密算法,适用于小量数据加密,如密钥交换;而DES是对称加密算法,适合大量数据的快速加密,但安全性相对较低。 首先,我们来理解RSA算法。RSA是由Ron Rivest、Adi Shamir和Leonard Adleman三位...
本篇将详细讲解Java中的对称加密和非对称加密,并结合实际例子进行阐述。 1. 对称加密: 对称加密是一种常见的加密方式,它使用相同的密钥进行加密和解密。Java中常见的对称加密算法有DES(Data Encryption ...
3. **Java中的RSA加密**: 在Java中,我们可以使用`java.security`包下的`KeyPairGenerator`和`Cipher`类来生成RSA密钥对并进行加密和解密操作。`KeyPairGenerator`用于生成密钥对,`Cipher`负责实际的加密和解密工作...
总的来说,RSA非对称加密在前端加密和后端解密的应用中,提供了一种强安全性的解决方案。前端使用公钥加密,保护数据在传输过程中的安全;后端用私钥解密,确保只有合法的服务器才能访问到敏感信息。这种方式广泛...
RSA算法是一种广泛应用于网络安全的非...总之,RSA算法在Java中的实现涉及了非对称加密的核心原理,包括密钥对的生成、加密解密过程,以及可能的用户界面设计。理解这些概念对于深入学习网络安全和Java编程都至关重要。