JDK自带方法实现RSA对称加密

  1 package jdbc.pro.lin;
  2
  3 import java.security.InvalidKeyException;
  4 import java.security.Key;
  5 import java.security.KeyFactory;
  6 import java.security.KeyPair;
  7 import java.security.KeyPairGenerator;
  8 import java.security.NoSuchAlgorithmException;
  9 import java.security.PrivateKey;
 10 import java.security.PublicKey;
 11 import java.security.interfaces.RSAPrivateKey;
 12 import java.security.interfaces.RSAPublicKey;
 13 import java.security.spec.InvalidKeySpecException;
 14 import java.security.spec.PKCS8EncodedKeySpec;
 15 import java.security.spec.X509EncodedKeySpec;
 16 import java.util.HashMap;
 17 import java.util.Map;
 18
 19 import javax.crypto.BadPaddingException;
 20 import javax.crypto.Cipher;
 21 import javax.crypto.IllegalBlockSizeException;
 22 import javax.crypto.NoSuchPaddingException;
 23
 24 import org.apache.commons.codec.binary.Base64;
 25
 26 public class MyRSA {
 27     public static final String KEY_ALGORITHM = "RSA";
 28     /** 貌似默认是RSA/NONE/PKCS1Padding,未验证 */
 29     public static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";
 30     public static final String PUBLIC_KEY = "publicKey";
 31     public static final String PRIVATE_KEY = "privateKey";
 32
 33     /** RSA密钥长度必须是64的倍数,在512~65536之间。默认是1024 */
 34     public static final int KEY_SIZE = 2048;
 35
 36     public static final String PLAIN_TEXT = "MANUTD is the greatest club in the world";
 37
 38     public static void main(String[] args) {
 39         Map<String, byte[]> keyMap = generateKeyBytes();
 40
 41         // 加密
 42         PrivateKey privateKey = restorePrivateKey(keyMap.get(PRIVATE_KEY));
 43         byte[] encodedText = RSAEncode(privateKey, PLAIN_TEXT.getBytes());
 44         System.out.println("RSA encoded: " + Base64.encodeBase64String(encodedText));
 45
 46         // 解密
 47         PublicKey publicKey = restorePublicKey(keyMap.get(PUBLIC_KEY));
 48         System.out.println("RSA decoded: "
 49                 + RSADecode(publicKey, encodedText));
 50     }
 51
 52     /**
 53      * 生成密钥对。注意这里是生成密钥对KeyPair,再由密钥对获取公私钥
 54      *
 55      * @return
 56      */
 57     public static Map<String, byte[]> generateKeyBytes() {
 58
 59         try {
 60             KeyPairGenerator keyPairGenerator = KeyPairGenerator
 61                     .getInstance(KEY_ALGORITHM);
 62             keyPairGenerator.initialize(KEY_SIZE);
 63             KeyPair keyPair = keyPairGenerator.generateKeyPair();
 64             RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
 65             RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
 66
 67             Map<String, byte[]> keyMap = new HashMap<String, byte[]>();
 68             keyMap.put(PUBLIC_KEY, publicKey.getEncoded());
 69             keyMap.put(PRIVATE_KEY, privateKey.getEncoded());
 70             return keyMap;
 71         } catch (NoSuchAlgorithmException e) {
 72             // TODO Auto-generated catch block
 73             e.printStackTrace();
 74         }
 75         return null;
 76     }
 77
 78     /**
 79      * 还原公钥,X509EncodedKeySpec 用于构建公钥的规范
 80      *
 81      * @param keyBytes
 82      * @return
 83      */
 84     public static PublicKey restorePublicKey(byte[] keyBytes) {
 85         X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
 86
 87         try {
 88             KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
 89             PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);
 90             return publicKey;
 91         } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
 92             // TODO Auto-generated catch block
 93             e.printStackTrace();
 94         }
 95         return null;
 96     }
 97
 98     /**
 99      * 还原私钥,PKCS8EncodedKeySpec 用于构建私钥的规范
100      *
101      * @param keyBytes
102      * @return
103      */
104     public static PrivateKey restorePrivateKey(byte[] keyBytes) {
105         PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
106                 keyBytes);
107         try {
108             KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
109             PrivateKey privateKey = factory
110                     .generatePrivate(pkcs8EncodedKeySpec);
111             return privateKey;
112         } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
113             // TODO Auto-generated catch block
114             e.printStackTrace();
115         }
116         return null;
117     }
118
119     /**
120      * 加密,三步走。
121      *
122      * @param key
123      * @param plainText
124      * @return
125      */
126     public static byte[] RSAEncode(PrivateKey key, byte[] plainText) {
127
128         try {
129             Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
130             cipher.init(Cipher.ENCRYPT_MODE, key);
131             return cipher.doFinal(plainText);
132         } catch (NoSuchAlgorithmException | NoSuchPaddingException
133                 | InvalidKeyException | IllegalBlockSizeException
134                 | BadPaddingException e) {
135             // TODO Auto-generated catch block
136             e.printStackTrace();
137         }
138         return null;
139
140     }
141
142     /**
143      * 解密,三步走。
144      *
145      * @param key
146      * @param encodedText
147      * @return
148      */
149     public static String RSADecode(PublicKey key, byte[] encodedText) {
150
151         try {
152             Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
153             cipher.init(Cipher.DECRYPT_MODE, key);
154             return new String(cipher.doFinal(encodedText));
155         } catch (NoSuchAlgorithmException | NoSuchPaddingException
156                 | InvalidKeyException | IllegalBlockSizeException
157                 | BadPaddingException e) {
158             // TODO Auto-generated catch block
159             e.printStackTrace();
160         }
161         return null;
162
163     }
164 }

几点注意:

1.用到了KeyFactory。

2.用到了公私钥的规范。

3.RSA密钥长度从512~65536,必须是64的整数倍

时间: 2024-10-05 23:16:49

JDK自带方法实现RSA对称加密的相关文章

JDK自带方法实现AES对称加密

请看代码. 1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 import java.security.InvalidKeyException; 5 import java.security.NoSuchAlgorithmException; 6 7 import javax.crypto.BadPaddingException; 8 import javax.crypto

JDK自带方法实现RSA数字签名

JDK只支持MD2withRSA, MD5withRSA, SHA1withRSA 其他的如SHA512withRSA需要第三方包支持,如BC(bouncy castle) JDK的密钥长度默认仍是1024 1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.NoSuchAlgorithmException; 5 import java.security.Priv

JDK自带方法实现消息摘要运算

啊,有点小注释,懒得介绍了,就贴个代码吧,大意理解就可以了. 1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.MessageDigest; 5 import java.security.NoSuchAlgorithmException; 6 7 import javax.crypto.KeyGenerator; 8 import javax.crypto.Ma

使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据

本文全部源代码下载:/Files/chnking/EncryptLongData.rar 一.  使用证书结合对称加密算法加.解密长数据 上一章节讨论了如何使用RSA证书加密数据,文中提到:“Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实际测试,明文最多为117字节,留下的空间用来填充随机数”.也就是说对于1024位密钥的RSA来说,一次只能加密128字节的数据,对于Dotnet的RSA实现更是只能加密117个字节的数据. 这就引出一个问题,超

RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价. .NET提供常用的加密算法类,支持RSA的类是RSACryptoServiceProvider(命名空间:System.Security.Cryptography),但只支持公钥加密,私钥解密.RSACr

[Node.js] 对称加密、公钥加密和RSA

原文地址:http://www.moye.me/2015/06/14/cryptography_rsa/ 引子 对于加解密,我一直处于一种知其然不知其所以然的状态,项目核心部分并不倚重加解密算法时,可以勉强对付过去,一旦需要频繁应用诸如 AES/RSA等算法,这种状态就颇令人捉急了. 是时候了解一下原理了,所以找来了这本图解密码技术 给自己补补课: 在该书深入浅出的指引下 ,补充了一些常识,在此进行一番梳理: 对称加密算法(共享密钥) 顾名思义,对称加密就是用相同的密钥进行加密和解密.说到对称加

jdk自带的MD5进行数据的加密与解密

package com.tools.util; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.crypto.Cipher;

三重Des对称加密在Android、Ios 和Java 平台的实现

引言 如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在android.ios.java平台的使用方法: DES加密是目前最常用的对称加密方式,性能优于非对称加密(RSA),是手机app请求数据加密的优先选择.   DES简介: DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法, 算法的入口参数有三个:Key.Data.Mode. Key:为7个字节共56位,是DES算法的工作密钥; Data:

MD5算法介绍及jdk自带实现方式

MD5算法,已经被人们熟知,作为一名资深或者入门级的开发者,都号称"MD5啊,知道知道".前几天程序略有小问题,原因是有的地方加密了,有的地方没加密.有个同事很得意的说,MD5就是个hash算法,很容易被解密的.当时我是无言以对了.因为俺记得MD5是不可逆的,既然不可逆,又哪里来的"解密"呢.于是我们在网上搜索"MD5解密",哇kao,竟然真的有结果,然则,事实并非那么简单,我们把MD5的一串序列放到"在线MD5解密"中去解密