给定base64编码的RSA公钥和私钥,下面两段代码可以将string类型转换为PublicKey和PrivateKey类型,后面会给出完整的测试程序。至于如何将其他形式(如16进制编码string或byte之类的)转换为base64 string就很简单了,可以使用Base64那个库,自己下个jar包,里面有encode和decode之类的方法,hex转base64网上也可以搜到。

转换代码如下:

 public static PublicKey getPublicKey(String key) throws Exception {
             byte[] keyBytes;
             keyBytes = (new BASE64Decoder()).decodeBuffer(key);
             X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
             PublicKey publicKey = keyFactory.generatePublic(keySpec);
             return publicKey;
       }

public static PrivateKey getPrivateKey(String key) throws Exception {byte[] keyBytes;keyBytes = (new BASE64Decoder()).decodeBuffer(key);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(keySpec);return privateKey;}

注意:不是随便敲一串字母就可以作为密钥string使用的,需要用严格的代码生成公钥串和私钥串。

完整的程序如下:

程序中包含密钥转换、加密和签名三个部分。

  1 package pack1;
  2
  3 import java.security.Key;
  4 import java.security.KeyFactory;
  5 import java.security.KeyPair;
  6 import java.security.KeyPairGenerator;
  7 import java.security.PrivateKey;
  8 import java.security.PublicKey;
  9 import java.security.Signature;
 10 import java.security.interfaces.RSAPrivateKey;
 11 import java.security.interfaces.RSAPublicKey;
 12 import java.security.spec.PKCS8EncodedKeySpec;
 13 import java.security.spec.X509EncodedKeySpec;
 14
 15 import javax.crypto.Cipher;
 16
 17 import org.apache.commons.codec.binary.Base64;
 18
 19 import sun.misc.BASE64Decoder;
 20 import sun.misc.BASE64Encoder;
 21
 22
 23 public class RSAtest{
 24     public static final String KEY_ALGORITHM="RSA";
 25     public static final String SIGNATURE_ALGORITHM="MD5withRSA";
 26     private static final int KEY_SIZE=1024;
 27     private static final String PUBLIC_KEY="RSAPublicKey";
 28     private static final String PRIVATE_KEY="RSAPrivateKey";
 29     public static String str_pubK = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqPvovSfXcwBbW8cKMCgwqNpsYuzF8RPAPFb7LGsnVo44JhM/xxzDyzoYtdfNmtbIuKVi9PzIsyp6rg+09gbuI6UGwBZ5DWBDBMqv5MPdOF5dCQkB2Bbr5yPfURPENypUz+pBFBg41d+BC+rwRiXELwKy7Y9caD/MtJyHydj8OUwIDAQAB";
 30     public static String str_priK = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKo++i9J9dzAFtbxwowKDCo2mxi7MXxE8A8VvssaydWjjgmEz/HHMPLOhi1182a1si4pWL0/MizKnquD7T2Bu4jpQbAFnkNYEMEyq/kw904Xl0JCQHYFuvnI99RE8Q3KlTP6kEUGDjV34EL6vBGJcQvArLtj1xoP8y0nIfJ2Pw5TAgMBAAECgYAGGB8IllMwxceLhjf6n1l0IWRH7FuHIUieoZ6k0p6rASHSgWiYNRMxfecbtX8zDAoG0QAWNi7rn40ygpR5gS1fWDAKhmnhKgQIT6wW0VmD4hraaeyP78iy8BLhlvblri2nCPIhDH5+l96v7D47ZZi3ZSOzcj89s1eS/k7/N4peEQJBAPEtGGJY+lBoCxQMhGyzuzDmgcS1Un1ZE2pt+XNCVl2b+T8fxWJH3tRRR8wOY5uvtPiK1HM/IjT0T5qwQeH8Yk0CQQC0tcv3d/bDb7bOe9QzUFDQkUSpTdPWAgMX2OVPxjdq3Sls9oA5+fGNYEy0OgyqTjde0b4iRzlD1O0OhLqPSUMfAkEAh5FIvqezdRU2/PsYSR4yoAdCdLdT+h/jGRVefhqQ/6eYUJJkWp15tTFHQX3pIe9/s6IeT/XyHYAjaxmevxAmlQJBAKSdhvQjf9KAjZKDEsa7vyJ/coCXuQUWSCMNHbcR5aGfXgE4e45UtUoIE1eKGcd6AM6LWhx3rR6xdFDpb9je8BkCQB0SpevGfOQkMk5i8xkEt9eeYP0fi8nv6eOUcK96EXbzs4jV2SAoQJ9oJegPtPROHbhIvVUmNQTbuP10Yjg59+8=";
 31       /**
 32        * 使用getPublicKey得到公钥,返回类型为PublicKey
 33        * @param base64 String to PublicKey
 34        * @throws Exception
 35        */
 36       public static PublicKey getPublicKey(String key) throws Exception {
 37             byte[] keyBytes;
 38             keyBytes = (new BASE64Decoder()).decodeBuffer(key);
 39             X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
 40             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
 41             PublicKey publicKey = keyFactory.generatePublic(keySpec);
 42             return publicKey;
 43       }
 44       /**
 45        * 转换私钥
 46        * @param base64 String to PrivateKey
 47        * @throws Exception
 48        */
 49       public static PrivateKey getPrivateKey(String key) throws Exception {
 50             byte[] keyBytes;
 51             keyBytes = (new BASE64Decoder()).decodeBuffer(key);
 52             PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
 53             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
 54             PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
 55             return privateKey;
 56       }
 57
 58       //***************************签名和验证*******************************
 59       public static byte[] sign(byte[] data) throws Exception{
 60         PrivateKey priK = getPrivateKey(str_priK);
 61           Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
 62           sig.initSign(priK);
 63           sig.update(data);
 64           return sig.sign();
 65       }
 66
 67       public static boolean verify(byte[] data,byte[] sign) throws Exception{
 68           PublicKey pubK = getPublicKey(str_pubK);
 69           Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
 70           sig.initVerify(pubK);
 71           sig.update(data);
 72           return sig.verify(sign);
 73       }
 74
 75       //************************加密解密**************************
 76       public static byte[] encrypt(byte[] bt_plaintext)throws Exception{
 77           PublicKey publicKey = getPublicKey(str_pubK);
 78           Cipher cipher = Cipher.getInstance("RSA");
 79           cipher.init(Cipher.ENCRYPT_MODE, publicKey);
 80         byte[] bt_encrypted = cipher.doFinal(bt_plaintext);
 81         return bt_encrypted;
 82       }
 83
 84       public static byte[] decrypt(byte[] bt_encrypted)throws Exception{
 85         PrivateKey privateKey = getPrivateKey(str_priK);
 86         Cipher cipher = Cipher.getInstance("RSA");
 87         cipher.init(Cipher.DECRYPT_MODE, privateKey);
 88         byte[] bt_original = cipher.doFinal(bt_encrypted);
 89         return bt_original;
 90       }
 91       //********************main函数:加密解密和签名验证*********************
 92       public static void main(String[] args) throws Exception {
 93             String str_plaintext = "这是一段用来测试密钥转换的明文";
 94             System.err.println("明文:"+str_plaintext);
 95             byte[] bt_cipher = encrypt(str_plaintext.getBytes());
 96             System.out.println("加密后:"+Base64.encodeBase64String(bt_cipher));
 97
 98             byte[] bt_original = decrypt(bt_cipher);
 99             String str_original = new String(bt_original);
100             System.out.println("解密结果:"+str_original);
101
102             String str="被签名的内容";
103             System.err.println("\n原文:"+str);
104             byte[] signature=sign(str.getBytes());
105             System.out.println("产生签名:"+Base64.encodeBase64String(signature));
106             boolean status=verify(str.getBytes(), signature);
107             System.out.println("验证情况:"+status);
108       }
109
110 }

曾经在百度知道上寻求过这个问题,一直都没能很好的解决。今日coding测试成功,来分享一下,技术有限,不足之处望指正。。。。。。by SHADOW.Delta

转载于:https://www.cnblogs.com/KKatherine/p/4128444.html

RSA密钥的数据类型转换:由合法的string到PublicKey或PrivateKey相关推荐

  1. java int.parse_java数据类型转换,parseXXX(String)或valueOf(String)有什么区别?

    JDK8源码 /** * Returns an {@code Integer} object holding the value * extracted from the specified {@co ...

  2. 数据类型转换:wstring和string

    wstring和string互相转换 摘自大佬 string转wstring #include<iostream> #include<locale> #include<v ...

  3. Java中如何实现Date与String之间的数据类型转换

    String 数据类型转换成 Date String inputDate = "2021-04-11";Date outputDate = null;SimpleDateForma ...

  4. 教学思路C#之入门五 数据类型转换

        本节课我们要实现的效果为: 加法 请输入一个数6 请输入二个数12 6+12=18 请按任意键继续. . . 根据上节课我们学过知识知道,当用户输入6时,读取后,这个6在内存中存放的是stri ...

  5. golang string转int8_golang一般常用数据类型转换总结

    在编程中经常会碰到一些数据类型转换问题,每次都要搜索查询好久,今天直接自己整理一下 string string到int (Atoi) int,err:=strconv.Atoi(string) str ...

  6. RSA密钥生成、加密解密、数据签名验签

    公钥.私钥生成 准备工作,基础的帮助类 使用java代码生成公钥私钥 使用openssl生成公钥私钥 加解密 数据签名及验签 数据加解密及签名验签测试 注意项 公钥.私钥生成 准备工作,基础的帮助类 ...

  7. JS中的数据类型转换:String转换成Number的3种方法

    今天有个学员问了个关于数据类型转换的问题,我觉得这个是可以给大家说一下的. JavaScript中,可以通过以下3种方法来将string值转换成number: 1.调用Number()来对string ...

  8. Java String常用的数据类型转换

    工作写代码经常遇到string的数据类型转换,每次都去搜索如何转换很不方便.写篇博客做个总结,以后看这篇就好了. 1.string-bigDecimal 2.string-date @Testpubl ...

  9. Java中的byte[]/char[]/int/String数据类型转换

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51743969 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  10. 异常处理:el表达式数据类型转换异常 Cannot convert B36 of type class java.lang.String to class java.lang.Long

    异常处理:el表达式数据类型转换异常 Cannot convert B36 of type class java.lang.String to class java.lang.Long 参考文章: ( ...

最新文章

  1. 由浅到深了解JavaScript类
  2. 大变天!刚刚,山东突然宣布!关乎800万人...
  3. 安装JAVA8要登录_JDK8的安装及环境配置
  4. 新华三助力公安构建新IT“警盾”
  5. 无障碍的 Web 环境应该如何打造?
  6. mysql给root开启远程访问权限
  7. Eclipse+Maven创建webapp项目一
  8. 微软人工智能-服务和 API
  9. ASF/WMV 文件格式解析
  10. 避坑11_VScode在vue文件内template无法使用tab补齐标签
  11. 第六章:纯策略纳什均衡
  12. Linux性能测试工具之filesystem(三)
  13. 解决办法: Cannot resolve the collation conflict between Japanese_CI_AS and SQL_...
  14. PyQt5端口映射TCP/UDP工具
  15. ez_website
  16. 车牌识别OCr技术,汽车后市场服务
  17. Java 集合深入理解(17):HashMap 在 JDK 1.8 后新增的红黑树结构
  18. h5在线1v1客服|web在线客服系统|h5即时聊天
  19. html5前端开发培训机构,CSS外边距塌陷问题
  20. 微信如何批量添加好友?

热门文章

  1. 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用
  2. ES6 Symbol之浅入解读
  3. 课程 3: Content Providers 简介
  4. 查询一个表插入数据的时间,按BLOCK时间
  5. Cocos2d-x 地图行走的实现3:A*算法
  6. linux mongo 搭建+集群
  7. Scala的那些匿名函数
  8. 对Oracle SQL Developer中 变量的学习
  9. Oracle Cluster verification utility failed 的解决方法
  10. 5.微服务:从设计到部署 --- 事件驱动数据管理