數(shù)據(jù)加密工具類集合

1.引入依賴

 <!-- 加密工具包 包含MD5襟锐、RSA钢拧、AES等加密方式-->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
        </dependency>

AES加焙贷、解密算法工具類

package pers.darcy.flower.utils.util;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * AES加楞抡、解密算法工具類
 */
public class AESUtil {
    /**
     * 加密算法AES
     */
    private static final String KEY_ALGORITHM = "AES";

    /**
     * key的長(zhǎng)度,Wrong key size: must be equal to 128, 192 or 256
     * 傳入時(shí)需要16、24、36
     */
    private static final Integer KEY_LENGTH = 16 * 8;

    /**
     * 算法名稱/加密模式/數(shù)據(jù)填充方式
     * 默認(rèn):AES/ECB/PKCS5Padding
     */
    private static final String ALGORITHMS = "AES/ECB/PKCS5Padding";

    /**
     * 后端AES的key,由靜態(tài)代碼塊賦值
     */
    public static String key;

    static {
        key = getKey();
    }

    /**
     * 獲取key
     */
    public static String getKey() {
        StringBuilder uid = new StringBuilder();
        //產(chǎn)生16位的強(qiáng)隨機(jī)數(shù)
        Random rd = new SecureRandom();
        for (int i = 0; i < KEY_LENGTH / 8; i++) {
            //產(chǎn)生0-2的3位隨機(jī)數(shù)
            int type = rd.nextInt(3);
            switch (type) {
                case 0:
                    //0-9的隨機(jī)數(shù)
                    uid.append(rd.nextInt(10));
                    break;
                case 1:
                    //ASCII在65-90之間為大寫,獲取大寫隨機(jī)
                    uid.append((char) (rd.nextInt(25) + 65));
                    break;
                case 2:
                    //ASCII在97-122之間為小寫颅筋,獲取小寫隨機(jī)
                    uid.append((char) (rd.nextInt(25) + 97));
                    break;
                default:
                    break;
            }
        }
        return uid.toString();
    }

    /**
     * 加密
     *
     * @param content    加密的字符串
     * @param encryptKey key值
     */
    public static String encrypt(String content, String encryptKey) throws Exception {
        //設(shè)置Cipher對(duì)象
        Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), KEY_ALGORITHM));

        //調(diào)用doFinal
        byte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));

        // 轉(zhuǎn)base64
        return Base64.encodeBase64String(b);

    }

    /**
     * 解密
     *
     * @param encryptStr 解密的字符串
     * @param decryptKey 解密的key值
     */
    public static String decrypt(String encryptStr, String decryptKey) throws Exception {
        //base64格式的key字符串轉(zhuǎn)byte
        byte[] decodeBase64 = Base64.decodeBase64(encryptStr);

        //設(shè)置Cipher對(duì)象
        Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM));

        //調(diào)用doFinal解密
        byte[] decryptBytes = cipher.doFinal(decodeBase64);
        return new String(decryptBytes);
    }


//    public static void main(String[] args) {
//        //16位
//        String key = "MIGfMA0GCSqGSIb3";
//
//        //字符串
//        String str = "huanzi.qch@qq.com:歡子";
//        try {
//            //加密
//            String encrypt = AESUtil.encrypt(str, key);
//            //解密
//            String decrypt = AESUtil.decrypt(encrypt, key);
//            System.out.println("加密前:" + str);
//            System.out.println("加密后:" + encrypt);
//            System.out.println("解密后:" + decrypt);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }


    public static void main(String[] args) {
        //16位
        String key = "MIGfMA0GCSqGSIb3";

        //復(fù)雜對(duì)象
        Map<String,Object> userMap = new HashMap<>(2);
        userMap.put("username","123456");
        userMap.put("password","111111");
        try {
            //加密
            String encrypt = AESUtil.encrypt(userMap.toString(), key);
            //解密
            String decrypt = AESUtil.decrypt(encrypt, key);
            System.out.println("加密前:" + userMap.toString());
            System.out.println("加密后:" + encrypt);
            System.out.println("解密后:" + decrypt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Base64加密解密 工具類

package pers.darcy.flower.utils.util;

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

/**
 * Base64加密解密 工具類
 *
 * @author wbw
 * @version 1.0
 * @since 1.0
 */
public abstract class Base64Util {

    /**
     * 字符編碼
     */
    private final static String ENCODING = "UTF-8";

    /**
     * 方法描述: Base64編碼
     *
     * @param data 待編碼數(shù)據(jù)
     * @return java.lang.String
     * @author wqf
     * @date 2022/1/19 11:54
     */
    public static String encode(String data) throws Exception {

        // 執(zhí)行編碼
        byte[] b = Base64.encodeBase64(data.getBytes(ENCODING));

        return new String(b, ENCODING);
    }


    /**
     * 方法描述: Base64安全編碼<br>
     * 遵循RFC 2045實(shí)現(xiàn)
     *
     * @param data 待編碼數(shù)據(jù)
     * @return java.lang.String
     * @author wqf
     * @date 2022/1/19 11:53
     */
    public static String encodeSafe(String data) throws Exception {

        // 執(zhí)行編碼
        byte[] b = Base64.encodeBase64(data.getBytes(ENCODING), true);

        return new String(b, ENCODING);
    }

    /**
     * 方法描述: Base64解碼
     *
     * @param data 待解碼數(shù)據(jù)
     * @return java.lang.String
     * @author wqf
     * @date 2022/1/19 11:53
     */
    public static String decode(String data) throws Exception {
        // 執(zhí)行解碼
        byte[] b = Base64.decodeBase64(data.getBytes(ENCODING));
        return new String(b, ENCODING);
    }
}

DES工具類

package pers.darcy.flower.utils.util;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;

/**
 * DES安全編碼組件
 *
 * @author wbw
 * @version 1.0
 */
public abstract class DESUtil {
    static {
        Security.insertProviderAt(new BouncyCastleProvider(), 1);
    }

    //new BouncyCastleProvider();后端加解密中,不能在代碼里new BouncyCastleProvider()输枯,JceSecurity. getVerificationResult內(nèi)部會(huì)進(jìn)行判斷议泵,如果是新值,則每次都會(huì)put到map中桃熄,導(dǎo)致內(nèi)存緩便被耗盡先口,程序假死崩潰
   // private static final BouncyCastleProvider BOUNCY_CASTLE_PROVIDER=new BouncyCastleProvider();

    /**
     * 密鑰算法 <br>
     * Java 6 只支持56bit密鑰 <br>
     * Bouncy Castle 支持64bit密鑰
     */
    private static final String KEY_ALGORITHM = "DES";

    /**
     * 加密/解密算法 / 工作模式 / 填充方式
     */
    private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5PADDING";

    /**
     * 轉(zhuǎn)換密鑰
     *
     * @param key 二進(jìn)制密鑰
     * @return Key 密鑰
     * @throws Exception
     */
    private static Key toKey(byte[] key) throws Exception {
        // 實(shí)例化DES密鑰材料
        DESKeySpec dks = new DESKeySpec(key);
        // 實(shí)例化秘密密鑰工廠
        SecretKeyFactory keyFactory = SecretKeyFactory
                .getInstance(KEY_ALGORITHM);
        // 生成秘密密鑰
        return keyFactory.generateSecret(dks);
    }

    /**
     * 方法描述: 解密
     *
     * @param data 待解密數(shù)據(jù)
     * @param key  密鑰
     * @return byte[]
     * @author wqf
     * @date 2022/1/19 14:03
     */
    public static byte[] decrypt(byte[] data, byte[] key) throws Exception {

        // 還原密鑰
        Key k = toKey(key);

        // 實(shí)例化
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

        // 初始化,設(shè)置為解密模式
        cipher.init(Cipher.DECRYPT_MODE, k);

        // 執(zhí)行操作
        return cipher.doFinal(data);
    }

    /**
     * 方法描述:  加密
     *
     * @param data 待加密數(shù)據(jù)
     * @param key  密鑰
     * @return byte[]
     * @author wqf
     * @date 2022/1/19 14:03
     */
    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
        // 還原密鑰
        Key k = toKey(key);
        // 實(shí)例化
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        // 初始化瞳收,設(shè)置為加密模式
        cipher.init(Cipher.ENCRYPT_MODE, k);
        // 執(zhí)行操作
        return cipher.doFinal(data);
    }

    /**
     * 方法描述: 生成密鑰
     *
     * @return byte[]
     * @author wqf
     * @date 2022/1/19 14:03
     */
    public static byte[] initKey() throws Exception {
        //實(shí)例化密鑰生成器碉京,若要使用64bit密鑰注意替換 將下述代碼中的KeyGenerator.getInstance(CIPHER_ALGORITHM);替換為KeyGenerator.getInstance(CIPHER_ALGORITHM, "BC");
        KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
        //初始化密鑰生成器 若要使用64bit密鑰注意替換 將下述代碼kg.init(56); 替換為kg.init(64);
        kg.init(56, new SecureRandom());
        // 生成秘密密鑰
        SecretKey secretKey = kg.generateKey();
        // 獲得密鑰的二進(jìn)制編碼形式
        return secretKey.getEncoded();
    }

    public static byte[] initKey(String seed) throws Exception {
        KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
        SecureRandom secureRandom = new SecureRandom(new Base64().decode(seed));
        kg.init(secureRandom);
        SecretKey secretKey = kg.generateKey();
        return secretKey.getEncoded();
    }
}

MD5工具類

package pers.darcy.flower.utils.util;

import org.apache.commons.codec.digest.DigestUtils;
 
/**
 * MD5加密組件
 * 
 * @author wbw
 * @version 1.0
 * @since 1.0
 */
public abstract class MD5Util {

    /**
     * 方法描述: MD5加密
     *
     * @param data 待加密數(shù)據(jù)
     * @return byte[]
     * @author wqf
     * @date 2022/1/19 11:54
     */
    public static byte[] encodeMD5(String data) throws Exception {
        // 執(zhí)行消息摘要
        return DigestUtils.md5(data);
    }

    /**
     * 方法描述: MD5加密
     *
     * @param data 待加密數(shù)據(jù)
     * @return java.lang.String
     * @author wqf
     * @date 2022/1/19 11:54
     */
    public static String encodeMD5Hex(String data) {
        // 執(zhí)行消息摘要
        return DigestUtils.md5Hex(data);
    }
}

RSA加、解密算法工具類

package cn.huanzi.ims.util;


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

import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
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;

/**
 * RSA加螟深、解密算法工具類
 */
public class RSAUtil {

    /**
     * 加密算法AES
     */
    private static final String KEY_ALGORITHM = "RSA";

    /**
     * 算法名稱/加密模式/數(shù)據(jù)填充方式
     * 默認(rèn):RSA/ECB/PKCS1Padding
     */
    private static final String ALGORITHMS = "RSA/ECB/PKCS1Padding";

    /**
     * Map獲取公鑰的key
     */
    private static final String PUBLIC_KEY = "publicKey";

    /**
     * Map獲取私鑰的key
     */
    private static final String PRIVATE_KEY = "privateKey";

    /**
     * RSA最大加密明文大小
     */
    private static final int MAX_ENCRYPT_BLOCK = 117;

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

    /**
     * RSA 位數(shù) 如果采用2048 上面最大加密和最大解密則須填寫:  245 256
     */
    private static final int INITIALIZE_LENGTH = 1024;

    /**
     * 后端RSA的密鑰對(duì)(公鑰和私鑰)Map谐宙,由靜態(tài)代碼塊賦值
     */
    private static Map<String, Object> genKeyPair = new HashMap<>();

    static {
        try {
            genKeyPair.putAll(genKeyPair());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成密鑰對(duì)(公鑰和私鑰)
     */
    private static Map<String, Object> genKeyPair() throws Exception {
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
        keyPairGen.initialize(INITIALIZE_LENGTH);
        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;
    }

    /**
     * 私鑰解密
     *
     * @param encryptedData 已加密數(shù)據(jù)
     * @param privateKey    私鑰(BASE64編碼)
     */
    public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception {
        //base64格式的key字符串轉(zhuǎn)Key對(duì)象
        byte[] keyBytes = Base64.decodeBase64(privateKey);
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);

        //設(shè)置加密、填充方式
        /*
            如需使用更多加密界弧、填充方式凡蜻,引入
            <dependency>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk16</artifactId>
                <version>1.46</version>
            </dependency>
            并改成
            Cipher cipher = Cipher.getInstance(ALGORITHMS ,new BouncyCastleProvider());
         */
        Cipher cipher = Cipher.getInstance(ALGORITHMS);
        cipher.init(Cipher.DECRYPT_MODE, privateK);

        //分段進(jìn)行解密操作
        return encryptAndDecryptOfSubsection(encryptedData, cipher, MAX_DECRYPT_BLOCK);
    }

    /**
     * 公鑰加密
     *
     * @param data      源數(shù)據(jù)
     * @param publicKey 公鑰(BASE64編碼)
     */
    public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {
        //base64格式的key字符串轉(zhuǎn)Key對(duì)象
        byte[] keyBytes = Base64.decodeBase64(publicKey);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key publicK = keyFactory.generatePublic(x509KeySpec);

        //設(shè)置加密、填充方式
        /*
            如需使用更多加密垢箕、填充方式划栓,引入
            <dependency>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk16</artifactId>
                <version>1.46</version>
            </dependency>
            并改成
            Cipher cipher = Cipher.getInstance(ALGORITHMS ,new BouncyCastleProvider());
         */
        Cipher cipher = Cipher.getInstance(ALGORITHMS);
        cipher.init(Cipher.ENCRYPT_MODE, publicK);

        //分段進(jìn)行加密操作
        return encryptAndDecryptOfSubsection(data, cipher, MAX_ENCRYPT_BLOCK);
    }

    /**
     * 獲取私鑰
     */
    public static String getPrivateKey() {
        Key key = (Key) genKeyPair.get(PRIVATE_KEY);
        return Base64.encodeBase64String(key.getEncoded());
    }

    /**
     * 獲取公鑰
     */
    public static String getPublicKey() {
        Key key = (Key) genKeyPair.get(PUBLIC_KEY);
        return Base64.encodeBase64String(key.getEncoded());
    }

    /**
     * 分段進(jìn)行加密、解密操作
     */
    private static byte[] encryptAndDecryptOfSubsection(byte[] data, Cipher cipher, int encryptBlock) throws Exception {
        int inputLen = data.length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offSet = 0;
        byte[] cache;
        int i = 0;
        // 對(duì)數(shù)據(jù)分段加密
        while (inputLen - offSet > 0) {
            if (inputLen - offSet > encryptBlock) {
                cache = cipher.doFinal(data, offSet, encryptBlock);
            } else {
                cache = cipher.doFinal(data, offSet, inputLen - offSet);
            }
            out.write(cache, 0, cache.length);
            i++;
            offSet = i * encryptBlock;
        }
        byte[] toByteArray = out.toByteArray();
        out.close();
        return toByteArray;
    }
//
//    public static void main(String[] args) {
//        //字符串
//        String str = "huanzi.qch@qq.com:歡子";
//        try {
//            System.out.println("私鑰:" + RSAUtil.getPrivateKey());
//            System.out.println("公鑰:" + RSAUtil.getPublicKey());
//
//            //公鑰加密
//            byte[] ciphertext = RSAUtil.encryptByPublicKey(str.getBytes(), RSAUtil.getPublicKey());
//            //私鑰解密
//            byte[] plaintext = RSAUtil.decryptByPrivateKey(ciphertext, RSAUtil.getPrivateKey());
//
//            System.out.println("公鑰加密前:" + str);
//            System.out.println("公鑰加密后:" + Base64.encodeBase64String(ciphertext));
//            System.out.println("私鑰解密后:" + new String(plaintext));
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

    public static void main(String[] args) {
        //復(fù)雜對(duì)象
        Map<String,Object> userMap = new HashMap<>(2);
        userMap.put("username","123456");
        userMap.put("password","111111");
        try {
            System.out.println("私鑰:" + RSAUtil.getPrivateKey());
            System.out.println("公鑰:" + RSAUtil.getPublicKey());

            //公鑰加密
            byte[] ciphertext = RSAUtil.encryptByPublicKey(userMap.toString().getBytes(), RSAUtil.getPublicKey());
            //私鑰解密
            byte[] plaintext = RSAUtil.decryptByPrivateKey(ciphertext, RSAUtil.getPrivateKey());

            System.out.println("公鑰加密前:" + userMap.toString());
            System.out.println("公鑰加密后:" + Base64.encodeBase64String(ciphertext));
            System.out.println("私鑰解密后:" + new String(plaintext));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舰讹,一起剝皮案震驚了整個(gè)濱河市茅姜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌月匣,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奋姿,死亡現(xiàn)場(chǎng)離奇詭異锄开,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)称诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門萍悴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事癣诱〖莆” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵撕予,是天一觀的道長(zhǎng)鲫惶。 經(jīng)常有香客問我,道長(zhǎng)实抡,這世上最難降的妖魔是什么欠母? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮吆寨,結(jié)果婚禮上赏淌,老公的妹妹穿的比我還像新娘。我一直安慰自己啄清,他們只是感情好六水,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辣卒,像睡著了一般掷贾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上添寺,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天胯盯,我揣著相機(jī)與錄音,去河邊找鬼计露。 笑死博脑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的票罐。 我是一名探鬼主播叉趣,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼该押!你這毒婦竟也來了疗杉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤蚕礼,失蹤者是張志新(化名)和其女友劉穎烟具,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奠蹬,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朝聋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囤躁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀痕。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荔睹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出言蛇,到底是詐尸還是另有隱情僻他,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布腊尚,位于F島的核電站吨拗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跟伏。R本人自食惡果不足惜丢胚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望受扳。 院中可真熱鬧携龟,春花似錦、人聲如沸勘高。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽华望。三九已至蕊蝗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赖舟,已是汗流浹背蓬戚。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宾抓,地道東北人子漩。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像石洗,于是被迫代替她去往敵國(guó)和親幢泼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容