zoukankan      html  css  js  c++  java
  • RSA签名,加解密处理核心文件

    import java.io.ByteArrayOutputStream;

    import java.io.UnsupportedEncodingException;

    import java.security.InvalidKeyException;

    import java.security.Key;

    import java.security.KeyFactory;

    import java.security.KeyPair;

    import java.security.KeyPairGenerator;

    import java.security.NoSuchAlgorithmException;

    import java.security.PrivateKey;

    import java.security.PublicKey;

    import java.security.Signature;

    import java.security.SignatureException;

    import java.security.cert.Certificate;

    import java.security.interfaces.RSAPrivateKey;

    import java.security.interfaces.RSAPublicKey;

    import java.security.spec.PKCS8EncodedKeySpec;

    import java.security.spec.X509EncodedKeySpec;

    import java.util.HashMap;

    import java.util.Map;

    import javax.crypto.Cipher;

    import org.apache.commons.codec.binary.Base64;

    /**

     *

     * <p>RSA签名,加解密处理核心文件,注意:密钥长度1024</p>

     * @author leelun

     * @version $Id: RSA.java, v 0.1 2013-11-15 下午2:33:53 lilun Exp $

     */

    public class RSA {

        /**

         * 签名算法

         */

        public static final String  SIGNATURE_ALGORITHM = "SHA1withRSA";

        /**

         * 加密算法RSA

         */

        public static final String  KEY_ALGORITHM       = "RSA";

        /**

         * RSA最大加密明文大小

         */

        private static final int    MAX_ENCRYPT_BLOCK   = 117;

        /**

         * RSA最大解密密文大小

         */

        private static final int    MAX_DECRYPT_BLOCK   = 128;

        /**

         * 获取公钥的key

         */

        private static final String PUBLIC_KEY          = "RSAPublicKey";

        /**

         * 获取私钥的key

         */

        private static final String PRIVATE_KEY         = "RSAPrivateKey";

        /**

         * <p>

         * 生成密钥对(公钥和私钥)

         * </p>

         *

         * @return

         * @throws Exception

         */

        public static Map<String, Object> genKeyPair() throws Exception {

            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);

            keyPairGen.initialize(1024);

            KeyPair keyPair = keyPairGen.generateKeyPair();

            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

            Map<String, Object> keyMap = new HashMap<String, Object>(2);

            keyMap.put(PUBLIC_KEY, publicKey);

            keyMap.put(PRIVATE_KEY, privateKey);

            return keyMap;

        }

        public static void main(String[] args) throws Exception {

            Map<String, Object> genKeyPair = genKeyPair();

            String base64publicKey = getPublicKey(genKeyPair);

            System.out.println("公钥 " + base64publicKey);

            String base64privateKey = getPrivateKey(genKeyPair);

            System.out.println("私钥 " + base64privateKey);

            String passwd = "cat123113";

            String charsetName = "utf-8";

            String encryptByPublicKey = Base64.encodeBase64String((encryptByPublicKey(

                passwd.getBytes(charsetName), base64publicKey)));

            System.out.println("加密 " + encryptByPublicKey);

            byte[] decryptByPrivateKey = decryptByPrivateKey(Base64.decodeBase64(encryptByPublicKey),

                base64privateKey);

            String string = new String(decryptByPrivateKey, "utf-8");

            System.out.println("解密后 " + string);

        }

        /**

         * 签名字符串

         *

         * @param text

         *            需要签名的字符串

         * @param privateKey 私钥(BASE64编码)

         *

         * @param charset

         *            编码格式

         * @return 签名结果(BASE64编码)

         */

        public static String sign(String text, String privateKey, String charset) throws Exception {

            byte[] keyBytes = Base64.decodeBase64(privateKey);

            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);

            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

            PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);

            Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);

            signature.initSign(privateK);

            signature.update(getContentBytes(text, charset));

            byte[] result = signature.sign();

            return Base64.encodeBase64String(result);

        }

        public static String sign(String text, PrivateKey privateKey, String charset)

                                                                                     throws SignatureException,

                                                                                     InvalidKeyException {

            try {

                Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);

                signature.initSign(privateKey);

                signature.update(getContentBytes(text, charset));

                byte[] result = signature.sign();

                return Base64.encodeBase64String(result);

            } catch (NoSuchAlgorithmException e) {

                //不可能发生,

                return null;

            }

        }

        /**

         * 签名字符串

         *

         * @param text

         *            需要签名的字符串

         * @param sign

         *            客户签名结果

         * @param publicKey

         *            公钥(BASE64编码)

         * @param charset

         *            编码格式

         * @return 验签结果

         */

        public static boolean verify(String text, String sign, String publicKey, String charset)

                                                                                                throws Exception {

            byte[] keyBytes = Base64.decodeBase64(publicKey);

            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);

            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

            PublicKey publicK = keyFactory.generatePublic(keySpec);

            Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);

            signature.initVerify(publicK);

            signature.update(getContentBytes(text, charset));

            return signature.verify(Base64.decodeBase64(sign));

        }

        /**

         * <P>

         * 私钥解密

         * </p>

         *

         * @param encryptedData 已加密数据

         * @param privateKey 私钥(BASE64编码)

         * @return

         * @throws Exception

         */

        public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)

                                                                                         throws Exception {

            byte[] keyBytes = Base64.decodeBase64(privateKey);

            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);

            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

            Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);

            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

            cipher.init(Cipher.DECRYPT_MODE, privateK);

            int inputLen = encryptedData.length;

            ByteArrayOutputStream out = new ByteArrayOutputStream();

            int offSet = 0;

            byte[] cache;

            int i = 0;

            // 对数据分段解密

            while (inputLen - offSet > 0) {

                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {

                    cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);

                } else {

                    cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);

                }

                out.write(cache, 0, cache.length);

                i++;

                offSet = i * MAX_DECRYPT_BLOCK;

            }

            byte[] decryptedData = out.toByteArray();

            out.close();

            return decryptedData;

        }

        /**

         * <p>

         * 公钥解密

         * </p>

         *

         * @param encryptedData 已加密数据

         * @param publicKey 公钥(BASE64编码)

         * @return

         * @throws Exception

         */

        public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)

                                                                                       throws Exception {

            byte[] keyBytes = Base64.decodeBase64(publicKey);

            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);

            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

            Key publicK = keyFactory.generatePublic(x509KeySpec);

            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

            cipher.init(Cipher.DECRYPT_MODE, publicK);

            int inputLen = encryptedData.length;

            ByteArrayOutputStream out = new ByteArrayOutputStream();

            int offSet = 0;

            byte[] cache;

            int i = 0;

            // 对数据分段解密

            while (inputLen - offSet > 0) {

                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {

                    cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);

                } else {

                    cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);

                }

                out.write(cache, 0, cache.length);

                i++;

                offSet = i * MAX_DECRYPT_BLOCK;

            }

            byte[] decryptedData = out.toByteArray();

            out.close();

            return decryptedData;

        }

        /**

         * <p>

         * 公钥加密

         * </p>

         *

         * @param data 源数据

         * @param publicKey 公钥(BASE64编码)

         * @return

         * @throws Exception

         */

        public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {

            byte[] keyBytes = Base64.decodeBase64(publicKey);

            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);

            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

            Key publicK = keyFactory.generatePublic(x509KeySpec);

            // 对数据加密

            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

            cipher.init(Cipher.ENCRYPT_MODE, publicK);

            int inputLen = data.length;

            ByteArrayOutputStream out = new ByteArrayOutputStream();

            int offSet = 0;

            byte[] cache;

            int i = 0;

            // 对数据分段加密

            while (inputLen - offSet > 0) {

                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {

                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);

                } else {

                    cache = cipher.doFinal(data, offSet, inputLen - offSet);

                }

                out.write(cache, 0, cache.length);

                i++;

                offSet = i * MAX_ENCRYPT_BLOCK;

            }

            byte[] encryptedData = out.toByteArray();

            out.close();

            return encryptedData;

        }

        /**

         * <p>

         * 公钥加密

         * </p>

         *

         * @param data 源数据

         * @param cert 证书

         * @return

         * @throws Exception

         */

        public static byte[] encryptByPublicKey(byte[] data, Certificate cert) throws Exception {

            // 对数据加密

            PublicKey uk = cert.getPublicKey();

            Cipher cipher = Cipher.getInstance(uk.getAlgorithm());

            cipher.init(Cipher.ENCRYPT_MODE, uk);

            int inputLen = data.length;

            ByteArrayOutputStream out = new ByteArrayOutputStream();

            int offSet = 0;

            byte[] cache;

            int i = 0;

            // 对数据分段加密

            while (inputLen - offSet > 0) {

                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {

                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);

                } else {

                    cache = cipher.doFinal(data, offSet, inputLen - offSet);

                }

                out.write(cache, 0, cache.length);

                i++;

                offSet = i * MAX_ENCRYPT_BLOCK;

            }

            byte[] encryptedData = out.toByteArray();

            out.close();

            return encryptedData;

        }

        /**

         * <p>

         * 私钥加密

         * </p>

         *

         * @param data 源数据

         * @param privateKey 私钥(BASE64编码)

         * @return

         * @throws Exception

         */

        public static byte[] encryptByPrivateKey(byte[] data, String privateKey) throws Exception {

            byte[] keyBytes = Base64.decodeBase64(privateKey);

            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);

            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

            Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);

            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

            cipher.init(Cipher.ENCRYPT_MODE, privateK);

            int inputLen = data.length;

            ByteArrayOutputStream out = new ByteArrayOutputStream();

            int offSet = 0;

            byte[] cache;

            int i = 0;

            // 对数据分段加密

            while (inputLen - offSet > 0) {

                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {

                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);

                } else {

                    cache = cipher.doFinal(data, offSet, inputLen - offSet);

                }

                out.write(cache, 0, cache.length);

                i++;

                offSet = i * MAX_ENCRYPT_BLOCK;

            }

            byte[] encryptedData = out.toByteArray();

            out.close();

            return encryptedData;

        }

        /**

         * @param content

         * @param charset

         * @return

         * @throws SignatureException

         * @throws UnsupportedEncodingException

         */

        private static byte[] getContentBytes(String content, String charset) {

            if (charset == null || "".equals(charset)) {

                return content.getBytes();

            }

            try {

                return content.getBytes(charset);

            } catch (UnsupportedEncodingException e) {

                throw new RuntimeException("签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);

            }

        }

        /**

         * <p>

         * 获取私钥

         * </p>

         *

         * @param keyMap 密钥对

         * @return

         * @throws Exception

         */

        public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {

            Key key = (Key) keyMap.get(PRIVATE_KEY);

            return Base64.encodeBase64String(key.getEncoded());

        }

        /**

         * <p>

         * 获取公钥

         * </p>

         *

         * @param keyMap 密钥对

         * @return

         * @throws Exception

         */

        public static String getPublicKey(Map<String, Object> keyMap) throws Exception {

            Key key = (Key) keyMap.get(PUBLIC_KEY);

            return Base64.encodeBase64String(key.getEncoded());

        }

    }

  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/chinaifae/p/10400669.html
Copyright © 2011-2022 走看看