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());

        }

    }

  • 相关阅读:
    script 执行顺序
    webpack 引入外部资源 webpack-require-http runtime-import
    react dnd
    require.contex 自动话引入
    git rebase
    文档在线转化
    moment 多语言 包问题
    Python 修改在使用ddt时测试报告默认显示用例名称与预期不符
    Robot Framework:随机数
    Robot Framework:变量与运算
  • 原文地址:https://www.cnblogs.com/chinaifae/p/10400669.html
Copyright © 2011-2022 走看看