Android RSA加密代码

       RSA优缺点: RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,这是RSA最大的缺陷,因此通常只能用于加密少量数据或者加密密钥,但RSA仍然不失为一种高强度的算法。

       加密方法:

       

/**
 * @description:RSA公钥/私钥/签名工具包
 */
public class RSAUtils {

    /**
     * 加密算法RSA
     * /RSA/ECB/PKCS1Padding  RSA
     */
    public static final String KEY_ALGORITHM = "RSA/ECB/PKCS1Padding";

    /**
     * 签名算法
     */
    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";

    /**
     * 获取公钥的key
     */
    //    public static final String PUBLIC_KEY ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClOB/q2myynP4c6cJq8tmWOcOw7N4fDhL9QeqWWYOERlnyl4ZAeuUIJpuP0FUHNESvlFIrxiYaYjVVKjMEcwbRUJP8EMWtO4dNRrbxJFKPXpCk2fF82WBxt81dLhgvYPX77EEcqzGNMrTRX6/EuOEVawKgBOUywtCNe2ZijSGccwIDAQAB";
//    public static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7VEIlt7cbOC61b0tLHS1OTx5RixSNewAhUFH10h63H2Xp27SKy039YeTb337TxPuErP0+DBGmXRLyyp64AqUH5aaVHn8geOsoUEjKBv78ics1IU1c5mZxzsgpnCVmkq7uEFauDsjKs5Bbf+RviX4te4WPRoGHX4txdEK+7QMeUQIDAQAB";
    public static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7VEIlt7cbOC61b0tLHS1OTx5RixSNewAhUFH10h63H2Xp27SKy039YeTb337TxPuErP0+DBGmXRLyyp64AqUH5aaVHn8geOsoUEjKBv78ics1IU1c5mZxzsgpnCVmkq7uEFauDsjKs5Bbf+RviX4te4WPRoGHX4txdEK+7QMeUQIDAQAB";
    /**
     * 获取私钥的key
     */
    //    public static final String PRIVATE_KEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKU4H+rabLKc/hzpwmry2ZY5w7Ds3h8OEv1B6pZZg4RGWfKXhkB65Qgmm4/QVQc0RK+UUivGJhpiNVUqMwRzBtFQk/wQxa07h01GtvEkUo9ekKTZ8XzZYHG3zV0uGC9g9fvsQRyrMY0ytNFfr8S44RVrAqAE5TLC0I17ZmKNIZxzAgMBAAECgYBlmLmnxWEKBJgOV4CCG4vJYQQBC+ca2aC7s4j5o1nIQSqWjq6zf97OwE7whH+EypNiFKbi3BoaJ0H8eNKebc1Gc6lQz3d7EA/kT4Z+OQnj5PTaAC7CjewFUb2+Gbt0Rppd3Z6rwBWnWX4xXANF1q8FO5s8skyhaJQuafp3XEOAgQJBAN8/xkZfYbHOs+AhOnvYrfCptXmM9hLYrtCuZvV+OS2G5h2nfx53XdcfNN04B4OBz2RmvyRGeEhePHYY2aJBEDECQQC9dQK89MZrvp5vfFgCzk9onLiC0U/wCHCDpiQWpQCHjDoQ/dJOvqkgClL8dFKNfJI2RiUkjnFeIV5SUDG+7RHjAkBht7qD5xAOEhntyt2cg/Vu1/nVIHw9N5cdRJlQb1V7tgZXiI89uKXcmY48HmA7kcBDhC26JRZVJtp0HuB0AuKhAkASebGtqZUb9rfOmWqfw2y8/+OCZlUMTFZkkDQevTKDBWq4M3hp02/8vuT+130hbQ95GXgPy5BEpK5lCor/WnEPAkAUfUhXXUIJ+W2rbabcOc2bv5Hpx6DaALniyL5fQIrFuZSd0MeUdtmzdLi5xezjUNuiXub6s5io9TxrwY5I1osZ";
//    public static final String PRIVATE_KEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKU4H+rabLKc/hzpwmry2ZY5w7Ds3h8OEv1B6pZZg4RGWfKXhkB65Qgmm4/QVQc0RK+UUivGJhpiNVUqMwRzBtFQk/wQxa07h01GtvEkUo9ekKTZ8XzZYHG3zV0uGC9g9fvsQRyrMY0ytNFfr8S44RVrAqAE5TLC0I17ZmKNIZxzAgMBAAECgYBlmLmnxWEKBJgOV4CCG4vJYQQBC+ca2aC7s4j5o1nIQSqWjq6zf97OwE7whH+EypNiFKbi3BoaJ0H8eNKebc1Gc6lQz3d7EA/kT4Z+OQnj5PTaAC7CjewFUb2+Gbt0Rppd3Z6rwBWnWX4xXANF1q8FO5s8skyhaJQuafp3XEOAgQJBAN8/xkZfYbHOs+AhOnvYrfCptXmM9hLYrtCuZvV+OS2G5h2nfx53XdcfNN04B4OBz2RmvyRGeEhePHYY2aJBEDECQQC9dQK89MZrvp5vfFgCzk9onLiC0U/wCHCDpiQWpQCHjDoQ/dJOvqkgClL8dFKNfJI2RiUkjnFeIV5SUDG+7RHjAkBht7qD5xAOEhntyt2cg/Vu1/nVIHw9N5cdRJlQb1V7tgZXiI89uKXcmY48HmA7kcBDhC26JRZVJtp0HuB0AuKhAkASebGtqZUb9rfOmWqfw2y8/+OCZlUMTFZkkDQevTKDBWq4M3hp02/8vuT+130hbQ95GXgPy5BEpK5lCor/WnEPAkAUfUhXXUIJ+W2rbabcOc2bv5Hpx6DaALniyL5fQIrFuZSd0MeUdtmzdLi5xezjUNuiXub6s5io9TxrwY5I1osZ";
//    public static final String PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAL2Qnu/XXW6cE4T5WH6Ycb1nvEqgBwgeEL7xC7/SIq4rsBQj8XOWv793JCH56UacP0+6Qd65pXgRaXi/MS2bClweB1IgfnRG/a3X7kOMMOBVe7A/JXDq+sH9xXqehg4u6KD4SkQaASARHPeKkTAyaPEt1A/JTJ1N4GKRo5w3df7DAgMBAAECgYB+bjxy/pLkONiT8bHiDU6e4tckdoL6GQNWNnJ9p2tV+vFfHXHmg/6zdoT03DeHzqIzTKiuIeeIoyRTUkE8h5FqJECwP5VFBVKN26SbLJ3prtQVbaABUG4bZiI9b49r9alJIyIOpHFw9VxOl51782uAzf30AeQvjbyxAlA48v/oUQJBAO0JyQoITpACMytOWoNJbhOK6sPWfAHQcSFLmEmdGUH4H1o3zOHkLVs4Gz8l6QRNEzpXXDsaOqmuPUkJkad5t0cCQQDMuqXpye5RXqCsBkg2SayuNdtFRu1pXKlqFWJctMmOOl4NeQ3vShJ/Fyuqi2MxlEr45PO/KIyWj1Kb9cBHkTKlAkB1K/0g5HJRZYT9x0Ge3FF5f5YFMKUkEHGbz857tRijL4/v/N1eXHi/OsDdOlQxOBhlIoIJBTIyZlsNG5nQe65JAkBcbQtIP6zCuXjKEM/7CknWIGRMo1e9UGL/jIXqmofAGSOq63LaC9PL4pcJGIKAuJUcRqiwLUtDEZNW65yR8sAtAkEAgDEoCgYn8jfo+SV5Vk0fGWZMjGfEP5I47G8Be294M56lBGFqpp5xsFOch+guNTcSC9l5Bh8/dzpvoyC172mGcQ==";
    public static final String PRIVATE_KEY = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALtUQiW3txs4LrVvS0sdLU5PHlGLFI17ACFQUfXSHrcfZenbtIrLTf1h5NvfftPE+4Ss/T4MEaZdEvLKnrgCpQflppUefyB46yhQSMoG/vyJyzUhTVzmZnHOyCmcJWaSru4QVq4OyMqzkFt/5G+Jfi17hY9GgYdfi3F0Qr7tAx5RAgMBAAECgYEAufUFiO2bbgDSlTc61gDLtb3iie33ZA7i7S8PfWetJ/maMJDx4wm4jLw99GojO1OCno0fAxX1+2DPa4bqEh5F9SMjybuhC+RnJwzy0iqFHCbh6IrUSwa36Sh1FZS0GnD2v7751zBWCo5yxNvGZ4d/wig8HfW4sb69tOnunYD/70ECQQDbAwMqC9DXhHn+MSfxyxvkRFjUqzc69Xclrym0qygR18jsxH85L/7QBUVeIuYynrrpamgWgymPO/dCVcIDzwn5AkEA2vdyBUgGHWWk7Wpiznc/ByFtFMvV0QRZhzxmGejscz6D2AxJIqG0qpo4I9guZ9LgZJm71krff4bfMEFVSvWNGQJAMDPBhoeDN2vYzbFT8Uuan+rLAkOMrFVKG+kpbLIe545ukm3M8nE1y+LdGZLkx09YI/dfYVUM2JGCIf9t7BitQQJAPk0/lP8cNksQdTja6jIFreq11b/1k2YwbwkhZ+fdNyEndFZyjLcD57K/nHtLIOFgVV9kkaF2HBvs7xb3xL8/KQJBALNCcIwLEWdYdMu+HaGDWZ4W5Yz9lZI5NHVFA8WD2UNfmmZasNzsl1FuBrjq7ohoZqlOtGdOARdBIakmL/ZY//w=";
    /**
     * RSA最大加密明文大小
     */
    private static final int MAX_ENCRYPT_BLOCK = 117;

    /**
     * RSA最大解密密文大小
     */
    private static final int MAX_DECRYPT_BLOCK = 128;

    /**
     * 私钥
     */
    public static RSAPrivateKey PRIVATE_KEY_RSA;

    /**
     * 公钥
     */
    public static RSAPublicKey PUBLIC_KEY_RSA;

    /**
     * 生成密钥对(公钥和私钥)
     */
    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<>(2);
        keyMap.put(PUBLIC_KEY, publicKey);
        keyMap.put(PRIVATE_KEY, privateKey);
        return keyMap;
    }

    /**
     * 用私钥对信息生成数字签名
     */
    public static String sign(String dataStr) throws Exception {
        byte[] data = new BASE64Decoder().decodeBuffer(dataStr);
        RSAUtils.loadPrivateKey(PRIVATE_KEY);
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initSign(PRIVATE_KEY_RSA);
        signature.update(data);
        return new BASE64Encoder().encodeBuffer(signature.sign());
    }

    /**
     * 校验数字签名
     *
     * @param sign 数字签名
     */
    public static boolean verify(String dataStr, String sign) throws Exception {
        byte[] data = new BASE64Decoder().decodeBuffer(dataStr);
        RSAUtils.loadPublicKey(PUBLIC_KEY);
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initVerify(PUBLIC_KEY_RSA);
        signature.update(data);
        return signature.verify(new BASE64Decoder().decodeBuffer(sign));
    }

    /**
     * 私钥解密
     *
     * @param encryptedData 已加密数据
     */
    public static byte[] decryptByPrivateKey(byte[] encryptedData) throws Exception {
        if (PRIVATE_KEY_RSA == null) {
            throw new Exception("解密私钥为空,请设置");
        }
        Cipher cipher = null;
        try {
            cipher = Cipher.getInstance(KEY_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, PRIVATE_KEY_RSA);
            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;
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此解密算法");
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new Exception("解密私钥非法,请检查");
        } catch (IllegalBlockSizeException e) {
            throw new Exception("密文长度非法");
        } catch (BadPaddingException e) {
            throw new Exception("密文数据已损坏==");
        }
    }

    /**
     * 公钥解密
     */
    public static byte[] decryptByPublicKey(byte[] encryptedData) throws Exception {
        if (PUBLIC_KEY_RSA == null) {
            throw new Exception("解密公钥为空,请设置");
        }
        Cipher cipher = null;
        try {
            cipher = Cipher.getInstance(KEY_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, PUBLIC_KEY_RSA);
            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;
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此解密算法");
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new Exception("解密公钥非法,请检查");
        } catch (IllegalBlockSizeException e) {
            throw new Exception("密文长度非法");
        } catch (BadPaddingException e) {
            throw new Exception("密文数据已损坏");
        }
    }

    /**
     * 公钥加密
     *
     * @param data 源数据
     */
    public static byte[] encryptByPublicKey(byte[] data) throws Exception {
        if (PUBLIC_KEY_RSA == null) {
            throw new Exception("加密公钥为空,请设置");
        }
        Cipher cipher = null;
        try {
            cipher = Cipher.getInstance(KEY_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, PUBLIC_KEY_RSA);
            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;
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此加密算法");
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new Exception("加密公钥非法,请检查");
        } catch (IllegalBlockSizeException e) {
            throw new Exception("明文长度非法");
        } catch (BadPaddingException e) {
            throw new Exception("明文数据已损坏");
        }
    }

    /**
     * 私钥加密
     *
     * @param data 源数据
     */
    public static byte[] encryptByPrivateKey(byte[] data) throws Exception {
        if (PRIVATE_KEY_RSA == null) {
            throw new Exception("加密私钥为空,请设置");
        }
        Cipher cipher = null;
        try {
            cipher = Cipher.getInstance(KEY_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, PRIVATE_KEY_RSA);
            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;
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此加密算法");
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new Exception("加密私钥非法,请检查");
        } catch (IllegalBlockSizeException e) {
            throw new Exception("明文长度非法");
        } catch (BadPaddingException e) {
            throw new Exception("明文数据已损坏");
        }
    }

    /**
     * 获取私钥
     *
     * @param keyMap 密钥对
     */
    public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
        Key key = (Key) keyMap.get(PRIVATE_KEY);
        return new BASE64Encoder().encodeBuffer(key.getEncoded());
    }

    /**
     * 获取公钥
     *
     * @param keyMap 密钥对
     */
    public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
        Key key = (Key) keyMap.get(PUBLIC_KEY);
        return new BASE64Encoder().encodeBuffer(key.getEncoded());
    }

    /**
     * 从字符串中加载公钥
     *
     * @param publicKeyStr 公钥数据字符串
     * @throws Exception 加载公钥时产生的异常
     */
    public static void loadPublicKey(String publicKeyStr) throws Exception {
        try {
            BASE64Decoder base64Decoder = new BASE64Decoder();
            byte[] buffer = base64Decoder.decodeBuffer(publicKeyStr);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
            RSAUtils.PUBLIC_KEY_RSA = (RSAPublicKey) keyFactory.generatePublic(keySpec);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此算法");
        } catch (InvalidKeySpecException e) {
            throw new Exception("公钥非法");
        } catch (NullPointerException e) {
            throw new Exception("公钥数据为空");
        } catch (Exception e) {
            throw new Exception("所有---" + e.getLocalizedMessage());
        }
    }

    /**
     * 从字符串中加载私钥
     *
     * @throws Exception 加载私钥时产生的异常
     */
    public static void loadPrivateKey(String privateKeyStr) throws Exception {
        try {
            BASE64Decoder base64Decoder = new BASE64Decoder();
            byte[] buffer = base64Decoder.decodeBuffer(privateKeyStr);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            RSAUtils.PRIVATE_KEY_RSA = (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此算法");
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
            throw new Exception("私钥非法");
        } catch (NullPointerException e) {
            throw new Exception("私钥数据为空");
        } catch (Exception e) {
            throw new Exception("所有-----" + e.getLocalizedMessage());
        }
    }

    /**
     * 私钥解密后的字符串
     */
    public static String decryptPrivateWithBase64(String base64String) throws Exception {
        RSAUtils.loadPrivateKey(PRIVATE_KEY);
        byte[] binaryData = decryptByPrivateKey(new BASE64Decoder().decodeBuffer(base64String));
        String string = new String(binaryData);
        return string;
    }

    /**
     * 公钥加密后的字符串
     */
    public static String encryptPublicWithBase64(String string) throws Exception {
        //获取公钥
        RSAUtils.loadPublicKey(PUBLIC_KEY);
        //字符串进行加密
        byte[] binaryData = encryptByPublicKey(string.getBytes());
        //        LogUtil.e("RSA:" + new String(binaryData));
        //结果进行base64转换
        String base64String = new BASE64Encoder().encodeBuffer(binaryData);
        return base64String;
    }

    /**
     * 公钥解密后的字符串
     */
    public static String decryptPublicWithBase64(String base64String) throws Exception {
        RSAUtils.loadPublicKey(PUBLIC_KEY);
        byte[] binaryData = decryptByPublicKey(new BASE64Decoder().decodeBuffer(base64String));
        String string = new String(binaryData);
        return string;
    }

    /**
     * 私钥加密后的字符串
     */
    public static String encryptPrivateWithBase64(String string) throws Exception {
        RSAUtils.loadPrivateKey(PRIVATE_KEY);
        byte[] binaryData = encryptByPrivateKey(string.getBytes());
        String base64String = new BASE64Encoder().encodeBuffer(binaryData);
        return base64String;
    }

    public static void main(String args[]) throws Exception {
        String v = "{\"id\":\"0dd2242adf9d47eeb8194a887812c48e\"}";
//        mbBlfQRjg03Hv0OW5RmD4kyLjHfzNjbuxW1NYlwSR/vA8d7tYl6cLP88Jfaj595OXJuToqBNrJ9uO8Ey54kfZEDPMcjt++3NVHGSix8aJoPGqDgKwuGqmhmnYUx5o0RTRUq6nGQT2QlxMN/BSgm86yDMZ5C2aqMAETox/lJqe1E=
        String str1 = RSAUtils.encryptPublicWithBase64(v);
//        String str1 = "oaI7FMlh1ExJSC0WQmOTcArbA2Vk4sRxH7TmXWY/lbI9LCAXdFWY91f9tuJq0BwDlGm1dZZDrZOacZVfhqPGwnRumlzrW8H8i2EGXPiyyn8lpWhdZzmDMrWcCkqEdoyvRCHz8jk2wWTV58SvoQjFIvH2XpdvCmCcT8ZcwBiEGfY=";
        String str2 = RSAUtils.decryptPrivateWithBase64(str1);
    }
}

 

        RSA分段加密资源压缩包地址:https://download.csdn.net/my

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

直到世界尽头szk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值