RSA密鑰的數據類型轉換:由合法的string到PublicKey或PrivateKey


給定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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM