`
wusuoya
  • 浏览: 640271 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

Java使用RSA加密解密签名及校验

    博客分类:
  • Java
阅读更多

由于项目要用到非对称加密解密签名校验什么的,于是参考《Java加密解密的艺术》写一个RSA进行加密解密签名及校验的Demo,代码很简单,特此分享!

RSA加密解密类:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.ihep;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.BufferedWriter;  
  5. import java.io.FileReader;  
  6. import java.io.FileWriter;  
  7. import java.io.IOException;  
  8. import java.security.InvalidKeyException;  
  9. import java.security.KeyFactory;  
  10. import java.security.KeyPair;  
  11. import java.security.KeyPairGenerator;  
  12. import java.security.NoSuchAlgorithmException;  
  13. import java.security.SecureRandom;  
  14.   
  15. import java.security.interfaces.RSAPrivateKey;  
  16. import java.security.interfaces.RSAPublicKey;  
  17. import java.security.spec.InvalidKeySpecException;  
  18. import java.security.spec.PKCS8EncodedKeySpec;  
  19. import java.security.spec.X509EncodedKeySpec;  
  20.   
  21. import javax.crypto.BadPaddingException;  
  22. import javax.crypto.Cipher;  
  23. import javax.crypto.IllegalBlockSizeException;  
  24. import javax.crypto.NoSuchPaddingException;  
  25.   
  26. import com.fcplay.Base64;  
  27.   
  28. public class RSAEncrypt {  
  29.     /** 
  30.      * 字节数据转字符串专用集合 
  31.      */  
  32.     private static final char[] HEX_CHAR = { '0''1''2''3''4''5''6',  
  33.             '7''8''9''a''b''c''d''e''f' };  
  34.   
  35.     /** 
  36.      * 随机生成密钥对 
  37.      */  
  38.     public static void genKeyPair(String filePath) {  
  39.         // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象  
  40.         KeyPairGenerator keyPairGen = null;  
  41.         try {  
  42.             keyPairGen = KeyPairGenerator.getInstance("RSA");  
  43.         } catch (NoSuchAlgorithmException e) {  
  44.             // TODO Auto-generated catch block  
  45.             e.printStackTrace();  
  46.         }  
  47.         // 初始化密钥对生成器,密钥大小为96-1024位  
  48.         keyPairGen.initialize(1024,new SecureRandom());  
  49.         // 生成一个密钥对,保存在keyPair中  
  50.         KeyPair keyPair = keyPairGen.generateKeyPair();  
  51.         // 得到私钥  
  52.         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  
  53.         // 得到公钥  
  54.         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  
  55.         try {  
  56.             // 得到公钥字符串  
  57.             String publicKeyString = Base64.encode(publicKey.getEncoded());  
  58.             // 得到私钥字符串  
  59.             String privateKeyString = Base64.encode(privateKey.getEncoded());  
  60.             // 将密钥对写入到文件  
  61.             FileWriter pubfw = new FileWriter(filePath + "/publicKey.keystore");  
  62.             FileWriter prifw = new FileWriter(filePath + "/privateKey.keystore");  
  63.             BufferedWriter pubbw = new BufferedWriter(pubfw);  
  64.             BufferedWriter pribw = new BufferedWriter(prifw);  
  65.             pubbw.write(publicKeyString);  
  66.             pribw.write(privateKeyString);  
  67.             pubbw.flush();  
  68.             pubbw.close();  
  69.             pubfw.close();  
  70.             pribw.flush();  
  71.             pribw.close();  
  72.             prifw.close();  
  73.         } catch (Exception e) {  
  74.             e.printStackTrace();  
  75.         }  
  76.     }  
  77.   
  78.     /** 
  79.      * 从文件中输入流中加载公钥 
  80.      *  
  81.      * @param in 
  82.      *            公钥输入流 
  83.      * @throws Exception 
  84.      *             加载公钥时产生的异常 
  85.      */  
  86.     public static String loadPublicKeyByFile(String path) throws Exception {  
  87.         try {  
  88.             BufferedReader br = new BufferedReader(new FileReader(path  
  89.                     + "/publicKey.keystore"));  
  90.             String readLine = null;  
  91.             StringBuilder sb = new StringBuilder();  
  92.             while ((readLine = br.readLine()) != null) {  
  93.                 sb.append(readLine);  
  94.             }  
  95.             br.close();  
  96.             return sb.toString();  
  97.         } catch (IOException e) {  
  98.             throw new Exception("公钥数据流读取错误");  
  99.         } catch (NullPointerException e) {  
  100.             throw new Exception("公钥输入流为空");  
  101.         }  
  102.     }  
  103.   
  104.     /** 
  105.      * 从字符串中加载公钥 
  106.      *  
  107.      * @param publicKeyStr 
  108.      *            公钥数据字符串 
  109.      * @throws Exception 
  110.      *             加载公钥时产生的异常 
  111.      */  
  112.     public static RSAPublicKey loadPublicKeyByStr(String publicKeyStr)  
  113.             throws Exception {  
  114.         try {  
  115.             byte[] buffer = Base64.decode(publicKeyStr);  
  116.             KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
  117.             X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);  
  118.             return (RSAPublicKey) keyFactory.generatePublic(keySpec);  
  119.         } catch (NoSuchAlgorithmException e) {  
  120.             throw new Exception("无此算法");  
  121.         } catch (InvalidKeySpecException e) {  
  122.             throw new Exception("公钥非法");  
  123.         } catch (NullPointerException e) {  
  124.             throw new Exception("公钥数据为空");  
  125.         }  
  126.     }  
  127.   
  128.     /** 
  129.      * 从文件中加载私钥 
  130.      *  
  131.      * @param keyFileName 
  132.      *            私钥文件名 
  133.      * @return 是否成功 
  134.      * @throws Exception 
  135.      */  
  136.     public static String loadPrivateKeyByFile(String path) throws Exception {  
  137.         try {  
  138.             BufferedReader br = new BufferedReader(new FileReader(path  
  139.                     + "/privateKey.keystore"));  
  140.             String readLine = null;  
  141.             StringBuilder sb = new StringBuilder();  
  142.             while ((readLine = br.readLine()) != null) {  
  143.                 sb.append(readLine);  
  144.             }  
  145.             br.close();  
  146.             return sb.toString();  
  147.         } catch (IOException e) {  
  148.             throw new Exception("私钥数据读取错误");  
  149.         } catch (NullPointerException e) {  
  150.             throw new Exception("私钥输入流为空");  
  151.         }  
  152.     }  
  153.   
  154.     public static RSAPrivateKey loadPrivateKeyByStr(String privateKeyStr)  
  155.             throws Exception {  
  156.         try {  
  157.             byte[] buffer = Base64.decode(privateKeyStr);  
  158.             PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);  
  159.             KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
  160.             return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);  
  161.         } catch (NoSuchAlgorithmException e) {  
  162.             throw new Exception("无此算法");  
  163.         } catch (InvalidKeySpecException e) {  
  164.             throw new Exception("私钥非法");  
  165.         } catch (NullPointerException e) {  
  166.             throw new Exception("私钥数据为空");  
  167.         }  
  168.     }  
  169.   
  170.     /** 
  171.      * 公钥加密过程 
  172.      *  
  173.      * @param publicKey 
  174.      *            公钥 
  175.      * @param plainTextData 
  176.      *            明文数据 
  177.      * @return 
  178.      * @throws Exception 
  179.      *             加密过程中的异常信息 
  180.      */  
  181.     public static byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData)  
  182.             throws Exception {  
  183.         if (publicKey == null) {  
  184.             throw new Exception("加密公钥为空, 请设置");  
  185.         }  
  186.         Cipher cipher = null;  
  187.         try {  
  188.             // 使用默认RSA  
  189.             cipher = Cipher.getInstance("RSA");  
  190.             // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());  
  191.             cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
  192.             byte[] output = cipher.doFinal(plainTextData);  
  193.             return output;  
  194.         } catch (NoSuchAlgorithmException e) {  
  195.             throw new Exception("无此加密算法");  
  196.         } catch (NoSuchPaddingException e) {  
  197.             e.printStackTrace();  
  198.             return null;  
  199.         } catch (InvalidKeyException e) {  
  200.             throw new Exception("加密公钥非法,请检查");  
  201.         } catch (IllegalBlockSizeException e) {  
  202.             throw new Exception("明文长度非法");  
  203.         } catch (BadPaddingException e) {  
  204.             throw new Exception("明文数据已损坏");  
  205.         }  
  206.     }  
  207.   
  208.     /** 
  209.      * 私钥加密过程 
  210.      *  
  211.      * @param privateKey 
  212.      *            私钥 
  213.      * @param plainTextData 
  214.      *            明文数据 
  215.      * @return 
  216.      * @throws Exception 
  217.      *             加密过程中的异常信息 
  218.      */  
  219.     public static byte[] encrypt(RSAPrivateKey privateKey, byte[] plainTextData)  
  220.             throws Exception {  
  221.         if (privateKey == null) {  
  222.             throw new Exception("加密私钥为空, 请设置");  
  223.         }  
  224.         Cipher cipher = null;  
  225.         try {  
  226.             // 使用默认RSA  
  227.             cipher = Cipher.getInstance("RSA");  
  228.             cipher.init(Cipher.ENCRYPT_MODE, privateKey);  
  229.             byte[] output = cipher.doFinal(plainTextData);  
  230.             return output;  
  231.         } catch (NoSuchAlgorithmException e) {  
  232.             throw new Exception("无此加密算法");  
  233.         } catch (NoSuchPaddingException e) {  
  234.             e.printStackTrace();  
  235.             return null;  
  236.         } catch (InvalidKeyException e) {  
  237.             throw new Exception("加密私钥非法,请检查");  
  238.         } catch (IllegalBlockSizeException e) {  
  239.             throw new Exception("明文长度非法");  
  240.         } catch (BadPaddingException e) {  
  241.             throw new Exception("明文数据已损坏");  
  242.         }  
  243.     }  
  244.   
  245.     /** 
  246.      * 私钥解密过程 
  247.      *  
  248.      * @param privateKey 
  249.      *            私钥 
  250.      * @param cipherData 
  251.      *            密文数据 
  252.      * @return 明文 
  253.      * @throws Exception 
  254.      *             解密过程中的异常信息 
  255.      */  
  256.     public static byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData)  
  257.             throws Exception {  
  258.         if (privateKey == null) {  
  259.             throw new Exception("解密私钥为空, 请设置");  
  260.         }  
  261.         Cipher cipher = null;  
  262.         try {  
  263.             // 使用默认RSA  
  264.             cipher = Cipher.getInstance("RSA");  
  265.             // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());  
  266.             cipher.init(Cipher.DECRYPT_MODE, privateKey);  
  267.             byte[] output = cipher.doFinal(cipherData);  
  268.             return output;  
  269.         } catch (NoSuchAlgorithmException e) {  
  270.             throw new Exception("无此解密算法");  
  271.         } catch (NoSuchPaddingException e) {  
  272.             e.printStackTrace();  
  273.             return null;  
  274.         } catch (InvalidKeyException e) {  
  275.             throw new Exception("解密私钥非法,请检查");  
  276.         } catch (IllegalBlockSizeException e) {  
  277.             throw new Exception("密文长度非法");  
  278.         } catch (BadPaddingException e) {  
  279.             throw new Exception("密文数据已损坏");  
  280.         }  
  281.     }  
  282.   
  283.     /** 
  284.      * 公钥解密过程 
  285.      *  
  286.      * @param publicKey 
  287.      *            公钥 
  288.      * @param cipherData 
  289.      *            密文数据 
  290.      * @return 明文 
  291.      * @throws Exception 
  292.      *             解密过程中的异常信息 
  293.      */  
  294.     public static byte[] decrypt(RSAPublicKey publicKey, byte[] cipherData)  
  295.             throws Exception {  
  296.         if (publicKey == null) {  
  297.             throw new Exception("解密公钥为空, 请设置");  
  298.         }  
  299.         Cipher cipher = null;  
  300.         try {  
  301.             // 使用默认RSA  
  302.             cipher = Cipher.getInstance("RSA");  
  303.             // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());  
  304.             cipher.init(Cipher.DECRYPT_MODE, publicKey);  
  305.             byte[] output = cipher.doFinal(cipherData);  
  306.             return output;  
  307.         } catch (NoSuchAlgorithmException e) {  
  308.             throw new Exception("无此解密算法");  
  309.         } catch (NoSuchPaddingException e) {  
  310.             e.printStackTrace();  
  311.             return null;  
  312.         } catch (InvalidKeyException e) {  
  313.             throw new Exception("解密公钥非法,请检查");  
  314.         } catch (IllegalBlockSizeException e) {  
  315.             throw new Exception("密文长度非法");  
  316.         } catch (BadPaddingException e) {  
  317.             throw new Exception("密文数据已损坏");  
  318.         }  
  319.     }  
  320.   
  321.     /** 
  322.      * 字节数据转十六进制字符串 
  323.      *  
  324.      * @param data 
  325.      *            输入数据 
  326.      * @return 十六进制内容 
  327.      */  
  328.     public static String byteArrayToString(byte[] data) {  
  329.         StringBuilder stringBuilder = new StringBuilder();  
  330.         for (int i = 0; i < data.length; i++) {  
  331.             // 取出字节的高四位 作为索引得到相应的十六进制标识符 注意无符号右移  
  332.             stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);  
  333.             // 取出字节的低四位 作为索引得到相应的十六进制标识符  
  334.             stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);  
  335.             if (i < data.length - 1) {  
  336.                 stringBuilder.append(' ');  
  337.             }  
  338.         }  
  339.         return stringBuilder.toString();  
  340.     }  
  341. }  

 

 

签名及校验类:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.ihep;  
  2.   
  3. import java.security.KeyFactory;  
  4. import java.security.PrivateKey;  
  5. import java.security.PublicKey;  
  6. import java.security.spec.PKCS8EncodedKeySpec;  
  7. import java.security.spec.X509EncodedKeySpec;  
  8.   
  9.   
  10.   
  11. /** 
  12.  * RSA签名验签类 
  13.  */  
  14. public class RSASignature{  
  15.       
  16.     /** 
  17.      * 签名算法 
  18.      */  
  19.     public static final String SIGN_ALGORITHMS = "SHA1WithRSA";  
  20.   
  21.     /** 
  22.     * RSA签名 
  23.     * @param content 待签名数据 
  24.     * @param privateKey 商户私钥 
  25.     * @param encode 字符集编码 
  26.     * @return 签名值 
  27.     */  
  28.     public static String sign(String content, String privateKey, String encode)  
  29.     {  
  30.         try   
  31.         {  
  32.             PKCS8EncodedKeySpec priPKCS8    = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );   
  33.               
  34.             KeyFactory keyf                 = KeyFactory.getInstance("RSA");  
  35.             PrivateKey priKey               = keyf.generatePrivate(priPKCS8);  
  36.   
  37.             java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);  
  38.   
  39.             signature.initSign(priKey);  
  40.             signature.update( content.getBytes(encode));  
  41.   
  42.             byte[] signed = signature.sign();  
  43.               
  44.             return Base64.encode(signed);  
  45.         }  
  46.         catch (Exception e)   
  47.         {  
  48.             e.printStackTrace();  
  49.         }  
  50.           
  51.         return null;  
  52.     }  
  53.       
  54.     public static String sign(String content, String privateKey)  
  55.     {  
  56.         try   
  57.         {  
  58.             PKCS8EncodedKeySpec priPKCS8    = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );   
  59.             KeyFactory keyf = KeyFactory.getInstance("RSA");  
  60.             PrivateKey priKey = keyf.generatePrivate(priPKCS8);  
  61.             java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);  
  62.             signature.initSign(priKey);  
  63.             signature.update( content.getBytes());  
  64.             byte[] signed = signature.sign();  
  65.             return Base64.encode(signed);  
  66.         }  
  67.         catch (Exception e)   
  68.         {  
  69.             e.printStackTrace();  
  70.         }  
  71.         return null;  
  72.     }  
  73.       
  74.     /** 
  75.     * RSA验签名检查 
  76.     * @param content 待签名数据 
  77.     * @param sign 签名值 
  78.     * @param publicKey 分配给开发商公钥 
  79.     * @param encode 字符集编码 
  80.     * @return 布尔值 
  81.     */  
  82.     public static boolean doCheck(String content, String sign, String publicKey,String encode)  
  83.     {  
  84.         try   
  85.         {  
  86.             KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
  87.             byte[] encodedKey = Base64.decode(publicKey);  
  88.             PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));  
  89.   
  90.           
  91.             java.security.Signature signature = java.security.Signature  
  92.             .getInstance(SIGN_ALGORITHMS);  
  93.           
  94.             signature.initVerify(pubKey);  
  95.             signature.update( content.getBytes(encode) );  
  96.           
  97.             boolean bverify = signature.verify( Base64.decode(sign) );  
  98.             return bverify;  
  99.               
  100.         }   
  101.         catch (Exception e)   
  102.         {  
  103.             e.printStackTrace();  
  104.         }  
  105.           
  106.         return false;  
  107.     }  
  108.       
  109.     public static boolean doCheck(String content, String sign, String publicKey)  
  110.     {  
  111.         try   
  112.         {  
  113.             KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
  114.             byte[] encodedKey = Base64.decode(publicKey);  
  115.             PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));  
  116.   
  117.           
  118.             java.security.Signature signature = java.security.Signature  
  119.             .getInstance(SIGN_ALGORITHMS);  
  120.           
  121.             signature.initVerify(pubKey);  
  122.             signature.update( content.getBytes() );  
  123.           
  124.             boolean bverify = signature.verify( Base64.decode(sign) );  
  125.             return bverify;  
  126.               
  127.         }   
  128.         catch (Exception e)   
  129.         {  
  130.             e.printStackTrace();  
  131.         }  
  132.           
  133.         return false;  
  134.     }  
  135.       
  136. }  

 

再来一个Base64的类,当然你也可以用commons-codec-1.9.jar

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.ihep;  
  2.   
  3. public final class Base64 {  
  4.   
  5.     static private final int     BASELENGTH           = 128;  
  6.     static private final int     LOOKUPLENGTH         = 64;  
  7.     static private final int     TWENTYFOURBITGROUP   = 24;  
  8.     static private final int     EIGHTBIT             = 8;  
  9.     static private final int     SIXTEENBIT           = 16;  
  10.     static private final int     FOURBYTE             = 4;  
  11.     static private final int     SIGN                 = -128;  
  12.     static private final char    PAD                  = '=';  
  13.     static private final boolean fDebug               = false;  
  14.     static final private byte[]  base64Alphabet       = new byte[BASELENGTH];  
  15.     static final private char[]  lookUpBase64Alphabet = new char[LOOKUPLENGTH];  
  16.   
  17.     static {  
  18.         for (int i = 0; i < BASELENGTH; ++i) {  
  19.             base64Alphabet[i] = -1;  
  20.         }  
  21.         for (int i = 'Z'; i >= 'A'; i--) {  
  22.             base64Alphabet[i] = (byte) (i - 'A');  
  23.         }  
  24.         for (int i = 'z'; i >= 'a'; i--) {  
  25.             base64Alphabet[i] = (byte) (i - 'a' + 26);  
  26.         }  
  27.   
  28.         for (int i = '9'; i >= '0'; i--) {  
  29.             base64Alphabet[i] = (byte) (i - '0' + 52);  
  30.         }  
  31.   
  32.         base64Alphabet['+'] = 62;  
  33.         base64Alphabet['/'] = 63;  
  34.   
  35.         for (int i = 0; i <= 25; i++) {  
  36.             lookUpBase64Alphabet[i] = (char) ('A' + i);  
  37.         }  
  38.   
  39.         for (int i = 26, j = 0; i <= 51; i++, j++) {  
  40.             lookUpBase64Alphabet[i] = (char) ('a' + j);  
  41.         }  
  42.   
  43.         for (int i = 52, j = 0; i <= 61; i++, j++) {  
  44.             lookUpBase64Alphabet[i] = (char) ('0' + j);  
  45.         }  
  46.         lookUpBase64Alphabet[62] = (char'+';  
  47.         lookUpBase64Alphabet[63] = (char'/';  
  48.   
  49.     }  
  50.   
  51.     private static boolean isWhiteSpace(char octect) {  
  52.         return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);  
  53.     }  
  54.   
  55.     private static boolean isPad(char octect) {  
  56.         return (octect == PAD);  
  57.     }  
  58.   
  59.     private static boolean isData(char octect) {  
  60.         return (octect < BASELENGTH && base64Alphabet[octect] != -1);  
  61.     }  
  62.   
  63.     /** 
  64.      * Encodes hex octects into Base64 
  65.      * 
  66.      * @param binaryData Array containing binaryData 
  67.      * @return Encoded Base64 array 
  68.      */  
  69.     public static String encode(byte[] binaryData) {  
  70.   
  71.         if (binaryData == null) {  
  72.             return null;  
  73.         }  
  74.   
  75.         int lengthDataBits = binaryData.length * EIGHTBIT;  
  76.         if (lengthDataBits == 0) {  
  77.             return "";  
  78.         }  
  79.   
  80.         int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;  
  81.         int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;  
  82.         int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;  
  83.         char encodedData[] = null;  
  84.   
  85.         encodedData = new char[numberQuartet * 4];  
  86.   
  87.         byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;  
  88.   
  89.         int encodedIndex = 0;  
  90.         int dataIndex = 0;  
  91.         if (fDebug) {  
  92.             System.out.println("number of triplets = " + numberTriplets);  
  93.         }  
  94.   
  95.         for (int i = 0; i < numberTriplets; i++) {  
  96.             b1 = binaryData[dataIndex++];  
  97.             b2 = binaryData[dataIndex++];  
  98.             b3 = binaryData[dataIndex++];  
  99.   
  100.             if (fDebug) {  
  101.                 System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);  
  102.             }  
  103.   
  104.             l = (byte) (b2 & 0x0f);  
  105.             k = (byte) (b1 & 0x03);  
  106.   
  107.             byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);  
  108.             byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);  
  109.             byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);  
  110.   
  111.             if (fDebug) {  
  112.                 System.out.println("val2 = " + val2);  
  113.                 System.out.println("k4   = " + (k << 4));  
  114.                 System.out.println("vak  = " + (val2 | (k << 4)));  
  115.             }  
  116.   
  117.             encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];  
  118.             encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];  
  119.             encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];  
  120.             encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];  
  121.         }  
  122.   
  123.         // form integral number of 6-bit groups  
  124.         if (fewerThan24bits == EIGHTBIT) {  
  125.             b1 = binaryData[dataIndex];  
  126.             k = (byte) (b1 & 0x03);  
  127.             if (fDebug) {  
  128.                 System.out.println("b1=" + b1);  
  129.                 System.out.println("b1<<2 = " + (b1 >> 2));  
  130.             }  
  131.             byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);  
  132.             encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];  
  133.             encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];  
  134.             encodedData[encodedIndex++] = PAD;  
  135.             encodedData[encodedIndex++] = PAD;  
  136.         } else if (fewerThan24bits == SIXTEENBIT) {  
  137.             b1 = binaryData[dataIndex];  
  138.             b2 = binaryData[dataIndex + 1];  
  139.             l = (byte) (b2 & 0x0f);  
  140.             k = (byte) (b1 & 0x03);  
  141.   
  142.             byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);  
  143.             byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);  
  144.   
  145.             encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];  
  146.             encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];  
  147.             encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];  
  148.             encodedData[encodedIndex++] = PAD;  
  149.         }  
  150.   
  151.         return new String(encodedData);  
  152.     }  
  153.   
  154.     /** 
  155.      * Decodes Base64 data into octects 
  156.      * 
  157.      * @param encoded string containing Base64 data 
  158.      * @return Array containind decoded data. 
  159.      */  
  160.     public static byte[] decode(String encoded) {  
  161.   
  162.         if (encoded == null) {  
  163.             return null;  
  164.         }  
  165.   
  166.         char[] base64Data = encoded.toCharArray();  
  167.         // remove white spaces  
  168.         int len = removeWhiteSpace(base64Data);  
  169.   
  170.         if (len % FOURBYTE != 0) {  
  171.             return null;//should be divisible by four  
  172.         }  
  173.   
  174.         int numberQuadruple = (len / FOURBYTE);  
  175.   
  176.         if (numberQuadruple == 0) {  
  177.             return new byte[0];  
  178.         }  
  179.   
  180.         byte decodedData[] = null;  
  181.         byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;  
  182.         char d1 = 0, d2 = 0, d3 = 0, d4 = 0;  
  183.   
  184.         int i = 0;  
  185.         int encodedIndex = 0;  
  186.         int dataIndex = 0;  
  187.         decodedData = new byte[(numberQuadruple) * 3];  
  188.   
  189.         for (; i < numberQuadruple - 1; i++) {  
  190.   
  191.             if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))  
  192.                 || !isData((d3 = base64Data[dataIndex++]))  
  193.                 || !isData((d4 = base64Data[dataIndex++]))) {  
  194.                 return null;  
  195.             }//if found "no data" just return null  
  196.   
  197.             b1 = base64Alphabet[d1];  
  198.             b2 = base64Alphabet[d2];  
  199.             b3 = base64Alphabet[d3];  
  200.             b4 = base64Alphabet[d4];  
  201.   
  202.             decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);  
  203.             decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));  
  204.             decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);  
  205.         }  
  206.   
  207.         if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {  
  208.             return null;//if found "no data" just return null  
  209.         }  
  210.   
  211.         b1 = base64Alphabet[d1];  
  212.         b2 = base64Alphabet[d2];  
  213.   
  214.         d3 = base64Data[dataIndex++];  
  215.         d4 = base64Data[dataIndex++];  
  216.         if (!isData((d3)) || !isData((d4))) {//Check if they are PAD characters  
  217.             if (isPad(d3) && isPad(d4)) {  
  218.                 if ((b2 & 0xf) != 0)//last 4 bits should be zero  
  219.                 {  
  220.                     return null;  
  221.                 }  
  222.                 byte[] tmp = new byte[i * 3 + 1];  
  223.                 System.arraycopy(decodedData, 0, tmp, 0, i * 3);  
  224.                 tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);  
  225.                 return tmp;  
  226.             } else if (!isPad(d3) && isPad(d4)) {  
  227.                 b3 = base64Alphabet[d3];  
  228.                 if ((b3 & 0x3) != 0)//last 2 bits should be zero  
  229.                 {  
  230.                     return null;  
  231.                 }  
  232.                 byte[] tmp = new byte[i * 3 + 2];  
  233.                 System.arraycopy(decodedData, 0, tmp, 0, i * 3);  
  234.                 tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);  
  235.                 tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));  
  236.                 return tmp;  
  237.             } else {  
  238.                 return null;  
  239.             }  
  240.         } else { //No PAD e.g 3cQl  
  241.             b3 = base64Alphabet[d3];  
  242.             b4 = base64Alphabet[d4];  
  243.             decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);  
  244.             decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));  
  245.             decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);  
  246.   
  247.         }  
  248.   
  249.         return decodedData;  
  250.     }  
  251.   
  252.     /** 
  253.      * remove WhiteSpace from MIME containing encoded Base64 data. 
  254.      * 
  255.      * @param data  the byte array of base64 data (with WS) 
  256.      * @return      the new length 
  257.      */  
  258.     private static int removeWhiteSpace(char[] data) {  
  259.         if (data == null) {  
  260.             return 0;  
  261.         }  
  262.   
  263.         // count characters that's not whitespace  
  264.         int newSize = 0;  
  265.         int len = data.length;  
  266.         for (int i = 0; i < len; i++) {  
  267.             if (!isWhiteSpace(data[i])) {  
  268.                 data[newSize++] = data[i];  
  269.             }  
  270.         }  
  271.         return newSize;  
  272.     }  
  273. }  

 

最后是一个MainTest:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.ihep;  
  2.   
  3. public class MainTest {  
  4.   
  5.     public static void main(String[] args) throws Exception {  
  6.         String filepath="G:/tmp/";  
  7.   
  8.         //RSAEncrypt.genKeyPair(filepath);  
  9.           
  10.           
  11.         System.out.println("--------------公钥加密私钥解密过程-------------------");  
  12.         String plainText="ihep_公钥加密私钥解密";  
  13.         //公钥加密过程  
  14.         byte[] cipherData=RSAEncrypt.encrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile(filepath)),plainText.getBytes());  
  15.         String cipher=Base64.encode(cipherData);  
  16.         //私钥解密过程  
  17.         byte[] res=RSAEncrypt.decrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile(filepath)), Base64.decode(cipher));  
  18.         String restr=new String(res);  
  19.         System.out.println("原文:"+plainText);  
  20.         System.out.println("加密:"+cipher);  
  21.         System.out.println("解密:"+restr);  
  22.         System.out.println();  
  23.           
  24.         System.out.println("--------------私钥加密公钥解密过程-------------------");  
  25.         plainText="ihep_私钥加密公钥解密";  
  26.         //私钥加密过程  
  27.         cipherData=RSAEncrypt.encrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile(filepath)),plainText.getBytes());  
  28.         cipher=Base64.encode(cipherData);  
  29.         //公钥解密过程  
  30.         res=RSAEncrypt.decrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile(filepath)), Base64.decode(cipher));  
  31.         restr=new String(res);  
  32.         System.out.println("原文:"+plainText);  
  33.         System.out.println("加密:"+cipher);  
  34.         System.out.println("解密:"+restr);  
  35.         System.out.println();  
  36.           
  37.         System.out.println("---------------私钥签名过程------------------");  
  38.         String content="ihep_这是用于签名的原始数据";  
  39.         String signstr=RSASignature.sign(content,RSAEncrypt.loadPrivateKeyByFile(filepath));  
  40.         System.out.println("签名原串:"+content);  
  41.         System.out.println("签名串:"+signstr);  
  42.         System.out.println();  
  43.           
  44.         System.out.println("---------------公钥校验签名------------------");  
  45.         System.out.println("签名原串:"+content);  
  46.         System.out.println("签名串:"+signstr);  
  47.           
  48.         System.out.println("验签结果:"+RSASignature.doCheck(content, signstr, RSAEncrypt.loadPublicKeyByFile(filepath)));  
  49.         System.out.println();  
  50.           
  51.     }  
  52. }  

 

看看运行截图:

 

分享到:
评论
1 楼 飕飕飞 2018-01-29  
比如说 我用私匙加密一段数据,并加密成功。那签名时用什么生成的?是新的内容还是用私匙加密的内容?签名时和加密以后的内容一起发送给另外一方吗?

相关推荐

    Java实现RSA加密解密签名校验

    Java实现RSA加密解密签名校验是信息安全领域中常见的任务,尤其在数据传输和网络通信中,RSA算法因其非对称性的特点,被广泛应用于数据的加密、解密以及数字签名。下面将详细介绍RSA算法的基本原理,以及如何使用...

    C#RSA加密与JAVA解密,实现相互通信

    总的来说,C#和Java之间的RSA加密解密通信涉及到多方面的知识,包括非对称加密原理、公钥私钥的生成和管理、不同编程语言间的互操作、数据安全传输以及可能的错误处理策略。掌握这些知识对于开发跨平台、高安全性的...

    RSA2--》加签+加密+解密+验签

    本文将详细讲解RSA算法的加签、加密、解密以及验签的过程,结合Java语言来实现这一系列操作,并涉及到证书的使用。 首先,我们需要理解RSA算法的基本原理。RSA算法基于两个大素数的乘积难以分解这一数学难题,生成...

    RSA加密解密,签名验证代码

    RSA加密算法是一种非对称...总的来说,RSA加密解密和签名验证是网络安全的基础,理解和掌握这些知识对于开发安全的Android和Java应用至关重要。通过实践,开发者可以更好地应对数据安全挑战,保护用户信息不被泄露。

    java RSA加解密 zip加解密, js MD5 SHA1 RSA加密

    本文将深入探讨Java中的RSA加解密、ZIP加密压缩以及JavaScript中的MD5、SHA1和RSA加密算法。这些技术在网络安全、数据传输、用户认证等多个领域中广泛应用。 首先,我们来看RSA加密算法。RSA是一种非对称加密算法,...

    C# .net版 RSA 公钥加密私钥解密 私钥加密公钥解密

    - RSA加密过程是不可逆的,因此在使用前需确认加密和解密的对象匹配。 在给出的链接中(https://blog.csdn.net/qq_37835111/article/details/87358779),作者提供了一个具体的示例,演示了如何在C# .NET环境下...

    java 使用RSA生成公私钥对、加解密、及签名验签

    在IT行业中,尤其是在网络安全和数据保护领域,非对称加密...总之,RSA在Java中的应用是网络安全和隐私保护的重要手段,通过理解并熟练运用其生成公私钥、加密解密和签名验签等操作,我们可以构建更加安全的应用系统。

    Android+Java中使用RSA加密实现接口调用时的校验功能的工具类.rar

    下面我们将详细探讨如何在Android和Java中使用RSA加密来实现接口调用时的校验功能。 首先,理解RSA加密的基本原理: 1. 密钥生成:RSA算法基于大数因子分解的困难性,通过随机选取两个大素数p和q,计算它们的乘积n=...

    java数字签名,md5大小文件验证,DES加密解密RSA加密解密,SWT浏览器插件的等源码工程实例

    4. **RSA加密解密**:RSA是一种非对称加密算法,安全性更高,适合大量数据的安全传输。`RSAUtil.java`可能包含了生成公钥和私钥、以及使用这些密钥进行加密和解密的函数。`KeyPairs.java`可能存储了公钥和私钥对的...

    RSA sha-256加密解密,加签验签工具类

    在Spring框架中,我们经常需要处理加密解密和签名验证的问题,以确保数据传输的安全性和完整性。RSA与SHA-256结合使用可以提供更高级别的安全保护。RSA用于非对称加密,而SHA-256用于生成消息摘要,进行数字签名。 ...

    跨平台 AES MD5 ECC DES RSA 加密解密 支持 进度 支持多种编码.源码.FlyUtils_md5加密解密工具类

    在"Demos"目录下,可能包含了一些示例代码,用于演示如何使用"FlyUtils"库进行实际的加密解密操作,这对于初学者和开发者来说是非常有价值的资源,他们可以通过阅读和运行这些示例来快速理解和应用这些加密算法。...

    RSA前台公钥加密后台私钥解密 jdk 1.5-1.8版本

    4. JDK支持:在Java环境中,从JDK 1.5到1.8,JDK已经内置了对RSA加密的支持。Java的`java.security`包下的`KeyPairGenerator`类可以用来生成RSA密钥对,`Cipher`类用于进行加密和解密操作。在实际应用中,通常还需要...

    MD5加密,DES,RSA加解密工具

    DES(Data Encryption Standard)是一种对称加密算法,使用56位的密钥对64位的数据块进行加密和解密。DES虽然历史悠久,但因其密钥长度较短,在现代计算能力下容易被破解。尽管如此,DES仍然是理解对称加密原理的...

    AES+RSA加解密demo源码(js和java互通).zip

    JavaScript代码会使用公钥对数据进行RSA加密,然后发送到服务器。服务器端的Java程序接收这些数据,使用私钥进行RSA解密,接着可能再使用AES解密数据,或者在服务器端使用AES对新生成的数据进行加密后再返回给前端。...

    java_加密解密简单实现

    标题和描述均提到了“Java加密解密简单实现”,这主要涵盖了消息摘要、单匙密码体制(DES)、数字签名(RSA)以及非对称密匙密码体制(公匙体系)等核心概念及其在Java中的应用。 ### 消息摘要 消息摘要是一种用于...

    VC++ RSA加密解密

    **VC++ RSA加密解密** 在信息技术领域,数据的安全传输和存储是至关重要的。RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用两个不同的密钥,一个用于加密,另一个用于解密。这种加密方式的安全性基于大...

    Java压缩解压RSA加密程序源代码

    总的来说,这个Java压缩解压RSA加密程序源代码结合了数据压缩和非对称加密两大技术,提供了一种在传输或存储数据时兼顾效率和安全性的解决方案。理解并掌握这些概念对于任何从事Java开发,尤其是涉及网络安全和数据...

    RSA签名验签工具windows_V1.4.zip_rsa_rsa2生成签名_rsa签名工具_工具_验签

    在这个工具中,“RSA签名”指的是使用私钥对数据进行的加密操作,它可以证明数据的来源和完整性。签名过程通常包括以下几个步骤: 1. 数据哈希:首先,原始数据通过哈希函数(如SHA-1或SHA-256)进行摘要处理,生成...

    前端纯js加密、以及后端java解密代码 js 实现国密sm2、sm3、sm4 加密解密demo

    前端纯js加密、以及后端java解密代码。国密即国家密码局认定的国产密码算法。常用的主要有SM2,SM3,SM4。 SM2:椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,为非对称加密,基于ECC。该算法已公开。由于该...

Global site tag (gtag.js) - Google Analytics