JDK自带方法实现RSA非对称加密
来源:互联网 发布:京东java面试流程 编辑:程序博客网 时间:2024/05/22 00:24
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 PublicKey publicKey = restorePublicKey(keyMap.get(PUBLIC_KEY)); 43 44 byte[] encodedText = RSAEncode(publicKey, PLAIN_TEXT.getBytes()); 45 System.out.println("RSA encoded: " + Base64.encodeBase64String(encodedText)); 46 47 // 解密 48 PrivateKey privateKey = restorePrivateKey(keyMap.get(PRIVATE_KEY)); 49 System.out.println("RSA decoded: " 50 + RSADecode(privateKey, encodedText)); 51 } 52 53 /** 54 * 生成密钥对。注意这里是生成密钥对KeyPair,再由密钥对获取公私钥 55 * 56 * @return 57 */ 58 public static Map<String, byte[]> generateKeyBytes() { 59 60 try { 61 KeyPairGenerator keyPairGenerator = KeyPairGenerator 62 .getInstance(KEY_ALGORITHM); 63 keyPairGenerator.initialize(KEY_SIZE); 64 KeyPair keyPair = keyPairGenerator.generateKeyPair(); 65 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); 66 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); 67 68 Map<String, byte[]> keyMap = new HashMap<String, byte[]>(); 69 keyMap.put(PUBLIC_KEY, publicKey.getEncoded()); 70 keyMap.put(PRIVATE_KEY, privateKey.getEncoded()); 71 return keyMap; 72 } catch (NoSuchAlgorithmException e) { 73 // TODO Auto-generated catch block 74 e.printStackTrace(); 75 } 76 return null; 77 } 78 79 /** 80 * 还原公钥,X509EncodedKeySpec 用于构建公钥的规范 81 * 82 * @param keyBytes 83 * @return 84 */ 85 public static PublicKey restorePublicKey(byte[] keyBytes) { 86 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); 87 88 try { 89 KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM); 90 PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec); 91 return publicKey; 92 } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { 93 // TODO Auto-generated catch block 94 e.printStackTrace(); 95 } 96 return null; 97 } 98 99 /**100 * 还原私钥,PKCS8EncodedKeySpec 用于构建私钥的规范101 * 102 * @param keyBytes103 * @return104 */105 public static PrivateKey restorePrivateKey(byte[] keyBytes) {106 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(107 keyBytes);108 try {109 KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);110 PrivateKey privateKey = factory111 .generatePrivate(pkcs8EncodedKeySpec);112 return privateKey;113 } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {114 // TODO Auto-generated catch block115 e.printStackTrace();116 }117 return null;118 }119 120 /**121 * 加密,三步走。122 * 123 * @param key124 * @param plainText125 * @return126 */127 public static byte[] RSAEncode(PublicKey key, byte[] plainText) {128 129 try {130 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);131 cipher.init(Cipher.ENCRYPT_MODE, key);132 return cipher.doFinal(plainText);133 } catch (NoSuchAlgorithmException | NoSuchPaddingException134 | InvalidKeyException | IllegalBlockSizeException135 | BadPaddingException e) {136 // TODO Auto-generated catch block137 e.printStackTrace();138 }139 return null;140 141 }142 143 /**144 * 解密,三步走。145 * 146 * @param key147 * @param encodedText148 * @return149 */150 public static String RSADecode(PrivateKey key, byte[] encodedText) {151 152 try {153 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);154 cipher.init(Cipher.DECRYPT_MODE, key);155 return new String(cipher.doFinal(encodedText));156 } catch (NoSuchAlgorithmException | NoSuchPaddingException157 | InvalidKeyException | IllegalBlockSizeException158 | BadPaddingException e) {159 // TODO Auto-generated catch block160 e.printStackTrace();161 }162 return null;163 164 }165 }
几点注意:
1.用到了KeyFactory。
2.用到了公私钥的规范。
3.RSA密钥长度从512~65536,必须是64的整数倍
1 0
- JDK自带方法实现RSA非对称加密
- JDK自带方法实现RSA非对称加密
- JDK自带方法实现AES对称加密
- JDK自带方法实现RSA数字签名
- RSA非对称加密和解密方法
- C# 非对称加密RSA实现
- C#实现非对称加密RSA算法
- Java实现Rsa非对称加密
- Java实现RSA非对称加密
- JAVA实现RSA加密,非对称加密算法
- RSA非对称加密工具JAVA实现
- java+JavaScript 实现 非对称加密 rsa
- AES对称加密+RSA非对称加密实现
- AES对称加密+RSA非对称加密实现
- RSA 非对称加密
- RSA非对称加密
- RSA非对称加密
- RSA非对称加密
- java的分隔符、注释、标识符及关键字
- leetcode_257. Binary Tree Paths 二叉树深度优先遍历,深拷贝的运用
- hdu 2276 Kiki & Little Kiki 2 矩阵快速幂
- React native 中遇到问题(1)
- ibatis传入数组或List类型参数小结
- JDK自带方法实现RSA非对称加密
- 0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
- iOS开发之跑马灯
- Mysql:Mysql主键
- 修改状态栏字体颜色
- LoadRunner录制时IE8崩溃的解决办法
- 从拉普拉斯矩阵说到谱聚类
- Android Studio系列教程--基本设置与运行
- QT 钟表的实现