RSA非对称加密工具JAVA实现
2017-05-26 12:01
519 查看
第三方服务与交易系统交互,需要对交易数据进行安全性较高的加密,采用RSA加密。
本文分享java实现的RSA加密工具类,及在linux环境中公私密钥对的生成
生成密钥对,在linux下
1. 生成私钥 (也可以用2048,但是加密过程负责)
openssl genrsa -out private.pem 1024
2. 生成公钥
openssl rsa -in private.pem -pubout -out public.pem
3. 私钥转码
(某些语言需要pkcs8格式的公钥, 否则报错
Java报错:java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence)
openssl pkcs8 -topk8 -inform PEM -in private.pem -outform PEM -nocrypt
将1,2,3步后得到的密钥对作为公私密钥
直接上代码,注意可加密的长度,超出会报错 javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
彩蛋,使用RSA推荐阅读 http://blog.csdn.net/defonds/article/details/42775183
本文分享java实现的RSA加密工具类,及在linux环境中公私密钥对的生成
生成密钥对,在linux下
1. 生成私钥 (也可以用2048,但是加密过程负责)
openssl genrsa -out private.pem 1024
2. 生成公钥
openssl rsa -in private.pem -pubout -out public.pem
3. 私钥转码
(某些语言需要pkcs8格式的公钥, 否则报错
Java报错:java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence)
openssl pkcs8 -topk8 -inform PEM -in private.pem -outform PEM -nocrypt
将1,2,3步后得到的密钥对作为公私密钥
直接上代码,注意可加密的长度,超出会报错 javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
package cipher; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import org.apache.commons.codec.binary.Base64; public class RSACodeUtil { public static final String KEY_ALGORTHM = "RSA"; private static final String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2R1XOJeXrCYAsKOHA7ELiIVzrfrFI7eD9LexmFe0Gs2i47zhoicTUP2MKvU5/s14Ze0fLeDe8hG8To+hL7oviTH4MF8SpY+lojj7vUMBzeu3v5Q1Px2VW1eNJ0aE7Bs1V7+LMYl/tjWIQbaFHxEXfguzb9X0o/SANSwS5cUyVzQIDAQAB"; private static final String privateKeyStr = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALZHVc4l5esJgCwo4cDsQuIhXOt+sUjt4P0t7GYV7QazaLjvOGiJxNQ/Ywq9Tn+zXhl7R8t4N7yEbxOj6Evui+JMfgwXxKlj6WiOPu9QwHN67e/lDU/HZVbV40nRoTsGzVXv4sxiX+2NYhBtoUfERd+C7Nv1fSj9IA1LBLlxTJXNAgMBAAECgYAFm2woS0InWMN4mElZhesIyb3yAJOzip3BLAh5m3MPIbW2+qThkltbrBd/3RLtGrdqUUCEIc6VHf3MvN4Id+4VmriQdTFi9SEr7GxVGJbHAstQrKfglyFPDhYTIFikDvxl4D98cEXy74Epr5wwgnQbQFi8+Z+Wp+vt5UW/MPSkgQJBAN9wT17D2rEW+VC8xJnJ8tAEfZDDUDvqfL8BQ0NXQri7HGYvsFMSax5rek5cjJVPangKUImOY3+5M/xf3geSbYMCQQDQ134F+a1c9t9KrqwfGx/1yoeqkXWDHJsunMrR38KC1q/OGR4fQOlcKDaILFXEucvXla2pUkqhpRgjg8hGs15vAkEAqj75ytvyMsKtfm4GYqN0Jjl1ryqSZMS6/hIpPRMs3HJ9JgMqF3HOOqRr0W9FErMrDYHWcakTeQsVaDNnil9wnwJAZ7Y8bXc6suoepZXtAF2WF5gGm5w1AXGZVyKiTmuSyysWj4FFxjuUKCIIQsPRrCqgomVAos+tJG06eZieQw4cnQJATuVeuGSu8zy8cm2r93KZ+mlqSu7ijwY2BjRI/1rqWF4dhScfZ+aLw72O7I8yPbeKEOWRZuHfzLEajOA3b4/wCg=="; private static String encrypt(String content, PrivateKey privateKey) throws Exception{ String encodeContent = null; Cipher cipher = Cipher.getInstance( "rsa" ); cipher.init(Cipher.ENCRYPT_MODE, privateKey); Base64 base64 = new Base64(); byte [] cipherData = cipher.doFinal(content.getBytes()); encodeContent = base64.encodeToString(cipherData); return encodeContent; } private static String decrypt(String content, PublicKey publicKey) throws Exception{ Base64 base64 = new Base64(); byte[] byteArray = base64.decodeBase64(content); String decodeContent = null; Cipher cipher = Cipher.getInstance( "rsa" ); cipher.init(Cipher.DECRYPT_MODE, publicKey); byte [] cipherData = cipher.doFinal(byteArray); return new String(cipherData); } private static PrivateKey getPrivateKey(String privateKeyStr2) throws Exception { byte[] keyBytes = decryptBASE64(privateKeyStr2); PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory; keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); return privateKey; } private static PublicKey getPublicKey(String publicKey) throws Exception{ byte[] keyBytes = decryptBASE64(publicKey); //构造X509EncodedKeySpec对象 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); //指定加密算法 KeyFactory keyFactory; keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); PublicKey publicKey2 = keyFactory.generatePublic(x509EncodedKeySpec); return publicKey2; } private static byte[] decryptBASE64(String keys) { Base64 base64 = new Base64(); return base64.decode(keys); } public static String encode(String content) throws Exception{ return encrypt(content, getPrivateKey(privateKeyStr)); } public static String decode(String content) throws Exception{ return decrypt(content, getPublicKey(publicKeyStr)); } public static void main(String[] args) { try { String content = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"; // String content = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"; String code = encode(content); System.out.println("code:"+code); String content2 = decode(code); System.out.println("content:"+content2); } catch (Exception e) { e.printStackTrace(); } } }
彩蛋,使用RSA推荐阅读 http://blog.csdn.net/defonds/article/details/42775183
相关文章推荐
- Java实现的RSA非对称加密工具
- RSA非对称加密Java实现
- Java实现Rsa非对称加密
- JAVA实现RSA加密,非对称加密算法
- Java实现RSA非对称加密
- Java 实现 RSA 非对称加密
- JAVA实现RSA加密解密 非对称算法
- Java 实现 RSA 非对称加密
- java实现RSA非对称加密算法 对数据进行加密【附代码】
- 基于公私钥文件的RSA非对称加密的Java端实现
- android Java语言非对称加密的实现
- java RSA加密解密实现
- Java非对称加密的源代码(RSA)
- 非对称加密技术RSA详解(python实现版本)
- java实现字符串非对称加密(私钥加密,公钥解密并对比)
- 用JAVA实现RSA加密解密
- JAVA实现RSA非对称加密算法
- RSA加密解密JAVA实现
- java实现RSA加密
- php利用openssl实现RSA非对称加密签名