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

给定base64编码的RSA公钥和私钥,下面两段代码可以将string类型转换为PublicKey和PrivateKey类型,后面给出完整的测试程序。

转换代码如下:

 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 key 密钥字符串(经过base64编码)
 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 key 密钥字符串(经过base64编码)
 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测试成功,来分享一下,技术有限,不足之处望指正。

时间: 2024-11-09 03:57:08

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

String数据类型转换

String是final类,提供字符串不可修改.强制类型转换,String类型无处不在.下面介绍一些常见的String数据类型转换. String数据类型转换成long.int.double.float.boolean.char等七种数据类型 * 数据类型转换 * @author Administrator * */public class 数据类型转换 { public static void main(String[] args) { String c="123456"; //当S

0097 数据类型转换 之 转为字符串:toString()、String() 、隐式转换

什么是数据类型转换? ? 使用表单.prompt 获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算,而需要转换变量的数据类型.通俗来说,就是把一种数据类型的变量转换成另一种数据类型,通常会实现3种方式的转换: 转换为字符串类型 转换为数字型 转换为布尔型 8.4.1.转换为字符串 toString() 和 String() 使用方式不一样. 三种转换方式,更多第三种加号拼接字符串转换方式, 这一种方式也称之为隐式转换. // 1. 把数字型转换为字符串型 变量.toString

Delphi 常见数据类型转换

不同的类有不同的成员,一般子类的成员是在父类的成员的后面增加了新的成员,如果子类转为父类,那这些新增加的成员虽然还存在,但是就不可以访问得到了.如果父类转为子类,那可能导致不可预知的错误,因为某个成员的指针指向的地址根本就不是具有实际成员.类型的转换也有很多类的,有隐性的和显性的,一些专用的类型转换函数,会重新建立一个新类型目标对象,然后把就类型的数值移动过去,然后销毁旧对象.一些隐性的转换,对象本身没改变,就把指针类型换一了一下.@用于取地址!最方便的用法:在调用Api的时候,举个例子:我们调

RSA密钥之C#格式与Java格式转换

前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转换的代码(如:http://blog.csdn.net/road2010/article/details/40071881 ),本文将给出一种c#的实现方法. 密钥格式 java密钥格式如下: 私钥: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBA

关于SpringMVC中如何把查询数据全转成String类型

之前,本想与客户商量做几张固定的报表予使用,结果发现客户每个月都需要各种各样的报表,所以我们做了个窗口用于直接执行SQL语句:数据量一开始并不是很大查询出来的数据较少(约1-6W左右),所以刚开始几个月很好用,查询出来的数据直接从页面复制下来贴到Excel做月报表,就这样一年过去了,最近做三期,发现运维人员月底几天特别的忙,数据逾百万(汗),SQL查询语句都要写n多分页.... 伙伴们如此幸苦,还是我来拯救他们吧- 我的解决思路大致如下: A>界面增加查询倒出Excel表按钮(不需要分页,也不需

JavaScript中数据类型转换总结

在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = "123"; a = Number(a); 注意: a)如果转换的内容本身就是一个数值类型的字符串,那么将来在转换的时候会返回自己. b)如果转换的内容本身不是一个数值类型的字符串,那么在转换的时候结果是NaN. c)如果要转换的内容是空的字符串,那以转换的结果是0. d)如果是其它的字符,那么将来在转换的时候结果是NaN. 2)pars

Arduino中数据类型转换 int转换为char 亲测好使,itoa()函数

由于博主最近在做一个项目,需要采集不同传感器的数据,包括float型的HCHO,以及int型的PM2.5数据.但是最终向服务器上传的数据都得转换为char型才能发送,这是借鉴了一个github上面的实例实现了在Arduino上部署socket使之与服务器进行交互. github实例如下: https://github.com/washo4evr/Socket.io-v1.x-Library 在本项目中多次使用了数据类型转换,前文提到了float和double类型转换为char,如下:http:/

SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显

在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/

javaScript-数据类型和数据类型转换

特别声明,以下为达内科技web前端讲师张东张老师的原创笔记,未经允许,不可转于其他商用,仅供学习. 1. 什么是JavaScript:专门编写网页交互的语言 2. 什么变量:内存中存储*一个*数据的存储空间,再起一个名字 声明: 创建一个变量, var 变量名; 赋值: 将等号右边的数据保存到等号左边的变量中.变量名=值; 取值: 在任何位置使用变量名等效于直接使用变量中的值 特殊:1. 简写:var 变量名=值;——建议 ***2. 声明提前:在正式执行程序前,都会预读所有var声明的变量,集