Android安全加密:對(duì)稱加密

Android安全加密專題文章索引

  1. Android安全加密:對(duì)稱加密
  2. Android安全加密:非對(duì)稱加密
  3. Android安全加密:消息摘要Message Digest
  4. Android安全加密:數(shù)字簽名和數(shù)字證書
  5. Android安全加密:Https編程

一刮萌、凱撒密碼

1. 概述

凱撒密碼作為一種最為古老的對(duì)稱加密體制碉输,在古羅馬的時(shí)候都已經(jīng)很流行墙贱,他的基本思想是:通過把字母移動(dòng)一定的位數(shù)來實(shí)現(xiàn)加密和解密棒搜。明文中的所有字母都在字母表上向后(或向前)按照一個(gè)固定數(shù)目進(jìn)行偏移后被替換成密文吊骤。例如捧存,當(dāng)偏移量是3 的時(shí)候捷绒,所有的字母A 將被替換成D,B 變成E捉貌,由此可見支鸡,位數(shù)就是凱撒密碼加密和解密的密鑰。

例如:字符串”ABC”的每個(gè)字符都右移3 位則變成”DEF”趁窃,解密的時(shí)候”DEF”的每個(gè)字符左移3 位即能還原牧挣,如下圖所示:

這里寫圖片描述

2. 準(zhǔn)備知識(shí)

 //字符轉(zhuǎn)換成ASCII 碼數(shù)值
 char charA = 'a';
 int intA = charA; //char 強(qiáng)轉(zhuǎn)為int 即得到對(duì)應(yīng)的ASCII 碼值,’a’的值為97
       
//ASCII 碼值轉(zhuǎn)成char
int intA = 97;//97 對(duì)應(yīng)的ASCII 碼’a’
char charA = (char) intA; //int 值強(qiáng)轉(zhuǎn)為char 即得到對(duì)應(yīng)的ASCII 字符醒陆,即'a'
這里寫圖片描述

3. 凱撒密碼的簡單代碼實(shí)現(xiàn)

    /**
     * 加密
     * @param input 數(shù)據(jù)源(需要加密的數(shù)據(jù))
     * @param key 秘鑰瀑构,即偏移量
     * @return 返回加密后的數(shù)據(jù)
     */
    public static String encrypt(String input, int key) {
        //得到字符串里的每一個(gè)字符
        char[] array = input.toCharArray();

        for (int i = 0; i < array.length; ++i) {
            //字符轉(zhuǎn)換成ASCII 碼值
            int ascii = array[i];
            //字符偏移,例如a->b
            ascii = ascii + key;
            //ASCII 碼值轉(zhuǎn)換為char
            char newChar = (char) ascii;
            //替換原有字符
            array[i] = newChar;

            //以上4 行代碼可以簡寫為一行
            //array[i] = (char) (array[i] + key);
        }

        //字符數(shù)組轉(zhuǎn)換成String
        return new String(array);
    }

    /**
     * 解密
     * @param input 數(shù)據(jù)源(被加密后的數(shù)據(jù))
     * @param key 秘鑰刨摩,即偏移量
     * @return 返回解密后的數(shù)據(jù)
     */
    public static String decrypt(String input, int key) {
        //得到字符串里的每一個(gè)字符
        char[] array = input.toCharArray();
        for (int i = 0; i < array.length; ++i) {
            //字符轉(zhuǎn)換成ASCII 碼值
            int ascii = array[i];
            //恢復(fù)字符偏移寺晌,例如b->a
            ascii = ascii - key;
            //ASCII 碼值轉(zhuǎn)換為char
            char newChar = (char) ascii;
            //替換原有字符
            array[i] = newChar;

            //以上4 行代碼可以簡寫為一行
            //array[i] = (char) (array[i] - key);
        }

        //字符數(shù)組轉(zhuǎn)換成String
        return new String(array);
    }

代碼輸出結(jié)果:


這里寫圖片描述

4. 破解凱撒密碼:頻率分析法

凱撒密碼加密強(qiáng)度太低世吨,只需要用頻度分析法即可破解。
在任何一種書面語言中折剃,不同的字母或字母組合出現(xiàn)的頻率各不相同另假。而且,對(duì)于以這種語言書寫的任意一段文本怕犁,都具有大致相同的特征字母分布。比如己莺,在英語中奏甫,字母E 出現(xiàn)的頻率很高,而X 則出現(xiàn)得較少凌受。

英語文本中典型的字母分布情況如下圖所示:


這里寫圖片描述

5. 破解流程

  • 統(tǒng)計(jì)密文里出現(xiàn)次數(shù)最多的字符阵子,例如出現(xiàn)次數(shù)最多的字符是是’h’。
  • 計(jì)算字符’h’到’e’的偏移量胜蛉,值為3挠进,則表示原文偏移了3 個(gè)位置。
  • 將密文所有字符恢復(fù)偏移3 個(gè)位置誊册。

注意點(diǎn):統(tǒng)計(jì)密文里出現(xiàn)次數(shù)最多的字符時(shí)领突,需多統(tǒng)計(jì)幾個(gè)備選,因?yàn)樽疃嗟目赡苁强崭窕蛘咂渌址盖樱缦聢D出現(xiàn)次數(shù)最多的字符’#’是空格加密后的字符君旦,’h’才是’e’偏移后的值。


這里寫圖片描述

解密時(shí)要多幾次嘗試嘲碱,因?yàn)椴灰欢ǔ霈F(xiàn)次數(shù)最多的字符就是我們想要的目標(biāo)字符金砍,如下圖,第二次解密的結(jié)果才是正確的麦锯。

/**
 * 頻率分析法破解凱撒密碼
 */
public class FrequencyAnalysis {
    //英文里出現(xiàn)次數(shù)最多的字符
    private static final char MAGIC_CHAR = 'e';
    //破解生成的最大文件數(shù)
    private static final int DE_MAX_FILE = 4;
    
    public static void main(String[] args) throws Exception {
        //測試1恕稠,統(tǒng)計(jì)字符個(gè)數(shù)
        //printCharCount("article1_en.txt");
        
        //加密文件
        //int key = 3;
        //encryptFile("article1.txt", "article1_en.txt", key);
        
        //讀取加密后的文件
        String artile = file2String("article1_en.txt");
        //解密(會(huì)生成多個(gè)備選文件)
        decryptCaesarCode(artile, "article1_de.txt");
    }
    
    public static void printCharCount(String path) throws IOException{
        String data = file2String(path);
        List<Entry<Character, Integer>> mapList = getMaxCountChar(data);
        for (Entry<Character, Integer> entry : mapList) {
            //輸出前幾位的統(tǒng)計(jì)信息
            System.out.println("字符'" + entry.getKey() + "'出現(xiàn)" + entry.getValue() + "次");
        }
    }
    
    public static void encryptFile(String srcFile, String destFile, int key) throws IOException {
        String artile = file2String(srcFile);
        //加密文件
        String encryptData = MyEncrypt.encrypt(artile, key);
        //保存加密后的文件
        string2File(encryptData, destFile);
    }
    
    /**
     * 破解凱撒密碼
     * @param input 數(shù)據(jù)源
     * @return 返回解密后的數(shù)據(jù)
     */
    public static void decryptCaesarCode(String input, String destPath) {
        int deCount = 0;//當(dāng)前解密生成的備選文件數(shù)
        //獲取出現(xiàn)頻率最高的字符信息(出現(xiàn)次數(shù)越多越靠前)
        List<Entry<Character, Integer>> mapList = getMaxCountChar(input);
        for (Entry<Character, Integer> entry : mapList) {
            //限制解密文件備選數(shù)
            if (deCount >= DE_MAX_FILE) {
                break;
            }
            
            //輸出前幾位的統(tǒng)計(jì)信息
            System.out.println("字符'" + entry.getKey() + "'出現(xiàn)" + entry.getValue() + "次");
            
            ++deCount;
            //出現(xiàn)次數(shù)最高的字符跟MAGIC_CHAR的偏移量即為秘鑰
            int key = entry.getKey() - MAGIC_CHAR;
            System.out.println("猜測key = " + key + ", 解密生成第" + deCount + "個(gè)備選文件" + "\n");
            String decrypt = MyEncrypt.decrypt(input, key);
            
            String fileName = "de_" + deCount + destPath;
            string2File(decrypt, fileName);
        }
    }
    
    //統(tǒng)計(jì)String里出現(xiàn)最多的字符
    public static List<Entry<Character, Integer>> getMaxCountChar(String data) {
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        char[] array = data.toCharArray();
        for (char c : array) {
            if(!map.containsKey(c)) {
                map.put(c, 1);
            }else{
                Integer count = map.get(c);
                map.put(c, count + 1);
            }
        }
        
        //輸出統(tǒng)計(jì)信息
        /*for (Entry<Character, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + "出現(xiàn)" + entry.getValue() +  "次");
        }*/
        
        //獲取獲取最大值
        int maxCount = 0;
        for (Entry<Character, Integer> entry : map.entrySet()) {
            //不統(tǒng)計(jì)空格
            if (/*entry.getKey() != ' ' && */entry.getValue() > maxCount) { 
                maxCount = entry.getValue();
            }
        }
        
        //map轉(zhuǎn)換成list便于排序
        List<Entry<Character, Integer>> mapList = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
        //根據(jù)字符出現(xiàn)次數(shù)排序
        Collections.sort(mapList, new Comparator<Entry<Character, Integer>>(){
            @Override
            public int compare(Entry<Character, Integer> o1,
                    Entry<Character, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        return mapList;
    }
    
    public static String file2String(String path) throws IOException {
        FileReader reader = new FileReader(new File(path));
        char[] buffer = new char[1024];
        int len = -1;
        StringBuffer sb = new StringBuffer();
        while ((len = reader.read(buffer)) != -1) {
            sb.append(buffer, 0, len);
        }
        return sb.toString();
    }
    
    public static void string2File(String data, String path){
        FileWriter writer = null;
        try {
            writer = new FileWriter(new File(path));
            writer.write(data);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
這里寫圖片描述

二扶欣、對(duì)稱加密

1鹅巍、概述

加密和解密都使用同一把秘鑰,這種加密方法稱為對(duì)稱加密宵蛀,也稱為單密鑰加密昆著。
簡單理解為:加密解密都是同一把鑰匙。
凱撒密碼就屬于對(duì)稱加密术陶,他的字符偏移量即為秘鑰凑懂。

2、對(duì)稱加密常用算法

AES梧宫、DES接谨、3DES摆碉、TDEA、Blowfish脓豪、RC2巷帝、RC4、RC5扫夜、IDEA楞泼、SKIPJACK 等。

DES
全稱為Data Encryption Standard笤闯,即數(shù)據(jù)加密標(biāo)準(zhǔn)堕阔,是一種使用密鑰加密的塊算法,1976 年被美國聯(lián)邦政府的國家標(biāo)準(zhǔn)局確定為聯(lián)邦資料處理標(biāo)準(zhǔn)(FIPS)颗味,隨后在國際上廣泛流傳開來超陆。

3DES
也叫Triple DES,是三重?cái)?shù)據(jù)加密算法(TDEA浦马,Triple Data Encryption Algorithm)塊密碼的通稱时呀。
它相當(dāng)于是對(duì)每個(gè)數(shù)據(jù)塊應(yīng)用三次DES 加密算法。由于計(jì)算機(jī)運(yùn)算能力的增強(qiáng)晶默,原版DES 密碼的密鑰長度變得容易被暴力破解谨娜;3DES 即是設(shè)計(jì)用來提供一種相對(duì)簡單的方法,即通過增加DES 的密鑰長度來避免類似的攻擊荤胁,而不是設(shè)計(jì)一種全新的塊密碼算法瞧预。

AES
高級(jí)加密標(biāo)準(zhǔn)(英語:Advanced Encryption Standard,縮寫:AES)仅政,在密碼學(xué)中又稱Rijndael 加密法垢油,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來替代原先的DES圆丹,已經(jīng)被多方分析且廣為全世界所使用滩愁。經(jīng)過五年的甄選流程,高級(jí)加密標(biāo)準(zhǔn)由美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)于2001 年11 月26 日發(fā)布于FIPS PUB 197辫封,并在2002 年5 月26 日成為有效的標(biāo)準(zhǔn)硝枉。2006 年,高級(jí)加密標(biāo)準(zhǔn)已然成為對(duì)稱密鑰加密中最流行的算法之一倦微。

3妻味、DES 算法簡介

DES 加密原理(對(duì)比特位進(jìn)行操作,交換位置欣福,異或等等责球,無需詳細(xì)了解)

準(zhǔn)備知識(shí)

Bit 是計(jì)算機(jī)最小的傳輸單位。以0 或1 來表示比特位的值
例如數(shù)字3 對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)為:00000011

代碼示例

 int i = 97;
 String bit = Integer.toBinaryString(i);
 //輸出:97 對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)為: 1100001
 System.out.println(i + "對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)為: " + bit);

Byte 與Bit 區(qū)別

數(shù)據(jù)存儲(chǔ)是以“字節(jié)”(Byte)為單位,數(shù)據(jù)傳輸是大多是以“位”(bit雏逾,又名“比特”)為單位嘉裤,一個(gè)位就代表一個(gè)0 或1(即二進(jìn)制),每8 個(gè)位(bit栖博,簡寫為b)組成一個(gè)字節(jié)(Byte屑宠,簡寫為B),是最小一級(jí)的信息單位仇让。

Byte 的取值范圍:

//byte 的取值范圍:-128 到127
System.out.println(Byte.MIN_VALUE + "到" + Byte.MAX_VALUE);

即10000000 到01111111 之間典奉,一個(gè)字節(jié)占8 個(gè)比特位

二進(jìn)制轉(zhuǎn)十進(jìn)制圖示:

這里寫圖片描述

任何字符串都可以轉(zhuǎn)換為字節(jié)數(shù)組

String data = "1234abcd";
byte[] bytes = data.getBytes();//內(nèi)容為:49 50 51 52 97 98 99 100

上面數(shù)據(jù)49 50 51 52 97 98 99 100 對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)(即比特位為):
00110001
00110010
00110011
00110100
01100001
01100010
01100011
01100100

將他們間距調(diào)大一點(diǎn),可看做一個(gè)矩陣:


這里寫圖片描述

之后可對(duì)他們進(jìn)行各種操作丧叽,例如交換位置秋柄、分割、異或運(yùn)算等蠢正,常見的加密方式就是這樣操作比特位的,例如下圖的IP 置換以及S-Box 操作都是常見加密的一些方式:

IP 置換:

IP 置換:

S-BOX 置換:

這里寫圖片描述

DES 加密過程圖解(流程很復(fù)雜省店,只需要知道內(nèi)部是操作比特位即可):

這里寫圖片描述

對(duì)稱加密應(yīng)用場景

  • 本地?cái)?shù)據(jù)加密(例如加密android 里SharedPreferences 里面的某些敏感數(shù)據(jù))
  • 網(wǎng)絡(luò)傳輸:登錄接口post 請(qǐng)求參數(shù)加密{username=lisi,pwd=oJYa4i9VASRoxVLh75wPCg==}
  • 加密用戶登錄結(jié)果信息并序列化到本地磁盤(將user 對(duì)象序列化到本地磁盤嚣崭,下次登錄時(shí)反序列化到內(nèi)存里)
  • 網(wǎng)頁交互數(shù)據(jù)加密(即后面學(xué)到的Https)

DES 算法代碼實(shí)現(xiàn)

 //1,得到cipher 對(duì)象(可翻譯為密碼器或密碼系統(tǒng))
 Cipher cipher = Cipher.getInstance("DES");
 //2,創(chuàng)建秘鑰
 SecretKey key = KeyGenerator.getInstance("DES").generateKey();
 //3懦傍,設(shè)置操作模式(加密/解密)
 cipher.init(Cipher.ENCRYPT_MODE, key);
 //4雹舀,執(zhí)行操作
 byte[] result = cipher.doFinal("黑馬".getBytes());

AES 算法代碼實(shí)現(xiàn)

用法同上,只需把”DES”參數(shù)換成”AES”即可粗俱。

使用Base64 編碼加密后的結(jié)果

byte[] result = cipher.doFinal("黑馬".getBytes());
System.out.println(new String(result));

輸出結(jié)果:

這里寫圖片描述

加密后的結(jié)果是字節(jié)數(shù)組说榆,這些被加密后的字節(jié)在碼表(例如UTF-8 碼表)上找不到對(duì)應(yīng)字符,會(huì)出現(xiàn)亂碼寸认,當(dāng)亂碼字符串再次轉(zhuǎn)換為字節(jié)數(shù)組時(shí)签财,長度會(huì)變化,導(dǎo)致解密失敗偏塞,所以轉(zhuǎn)換后的數(shù)據(jù)是不安全的唱蒸。

使用Base64 對(duì)字節(jié)數(shù)組進(jìn)行編碼,任何字節(jié)都能映射成對(duì)應(yīng)的Base64 字符灸叼,之后能恢復(fù)到字節(jié)數(shù)組神汹,利于加密后數(shù)據(jù)的保存于傳輸,所以轉(zhuǎn)換是安全的古今。同樣屁魏,字節(jié)數(shù)組轉(zhuǎn)換成16 進(jìn)制字符串也是安全的。

密文轉(zhuǎn)換成Base64 編碼后的輸出結(jié)果:


這里寫圖片描述

密文轉(zhuǎn)換成16 進(jìn)制編碼后的輸出結(jié)果:


這里寫圖片描述

Java 里沒有直接提供Base64 以及字節(jié)數(shù)組轉(zhuǎn)16 進(jìn)制的Api捉腥,開發(fā)中一般是自己手寫或直接使用第三方提供的成熟穩(wěn)定的工具類(例如apache 的commons-codec)氓拼。

Base64 字符映射表

Base64 字符映射表

對(duì)稱加密的具體應(yīng)用方式

1、生成秘鑰并保存到硬盤上,以后讀取該秘鑰進(jìn)行加密解密操作披诗,實(shí)際開發(fā)中用得比較少

//生成隨機(jī)秘鑰
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
//序列化秘鑰到磁盤上
FileOutputStream fos = new FileOutputStream(new File("heima.key"));

ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(secretKey);

//從磁盤里讀取秘鑰
FileInputStream fis = new FileInputStream(new File("heima.key"));
ObjectInputStream ois = new ObjectInputStream(fis);
Key key = (Key) ois.readObject();

2撬即、使用自定義秘鑰(秘鑰寫在代碼里)

//創(chuàng)建密鑰寫法1
KeySpec keySpec = new DESKeySpec(key.getBytes());
SecretKey secretKey = SecretKeyFactory.getInstance(ALGORITHM).
generateSecret(keySpec);

//創(chuàng)建密鑰寫法2
//SecretKey secretKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
//得到key 后,后續(xù)代碼就是Cipher 的寫法呈队,此處省略...

注意事項(xiàng)

把秘鑰寫在代碼里有一定風(fēng)險(xiǎn)剥槐,當(dāng)別人反編譯代碼的時(shí)候,可能會(huì)看到秘鑰宪摧,android 開發(fā)里建議用JNI 把秘鑰值寫到C 代碼里粒竖,甚至拆分成幾份,最后再組合成真正的秘鑰

算法/工作模式/填充模式

初始化cipher 對(duì)象時(shí)几于,參數(shù)可以直接傳算法名:例如:

Cipher c = Cipher.getInstance("DES");

也可以指定更詳細(xì)的參數(shù)蕊苗,格式:"algorithm/mode/padding" ,即"算法/工作模式/填充模式"

Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");

密碼塊工作模式

塊密碼工作模式(Block cipher mode of operation)沿彭,是對(duì)于按塊處理密碼的加密方式的一種擴(kuò)充朽砰,不僅僅適用于AES,包括DES, RSA 等加密方法同樣適用喉刘。

這里寫圖片描述

填充模式

填充(Padding)瞧柔,是對(duì)需要按塊處理的數(shù)據(jù),當(dāng)數(shù)據(jù)長度不符合塊處理需求時(shí)睦裳,按照一定方法填充滿塊長的一種規(guī)則造锅。

這里寫圖片描述

具體代碼:

//秘鑰算法
private static final String KEY_ALGORITHM = "DES";
//加密算法:algorithm/mode/padding 算法/工作模式/填充模式
private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
//秘鑰
private static final String KEY = "12345678";//DES 秘鑰長度必須是8 位或以上
//private static final String KEY = "1234567890123456";//AES 秘鑰長度必須是16 位

//初始化秘鑰
SecretKey secretKey = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

//加密
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(input.getBytes());

注意:AES、DES 在CBC 操作模式下需要iv 參數(shù)

//AES廉邑、DES 在CBC 操作模式下需要iv 參數(shù)
IvParameterSpec iv = new IvParameterSpec(key.getBytes());

//加密
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

三哥蔚、總結(jié)

DES 安全度在現(xiàn)代已經(jīng)不夠高,后來又出現(xiàn)的3DES 算法強(qiáng)度提高了很多蛛蒙,但是其執(zhí)行效率低下糙箍,AES算法加密強(qiáng)度大,執(zhí)行效率高宇驾,使用簡單倍靡,實(shí)際開發(fā)中建議選擇AES 算法。實(shí)際android 開發(fā)中可以用對(duì)稱加密(例如選擇AES 算法)來解決很多問題课舍,例如:

  • 做一個(gè)管理密碼的app塌西,我們在不同的網(wǎng)站里使用不同賬號(hào)密碼,很難記住筝尾,想做個(gè)app 統(tǒng)一管理捡需,但是賬號(hào)密碼保存在手機(jī)里,一旦丟失了容易造成安全隱患筹淫,所以需要一種加密算法站辉,將賬號(hào)密碼信息加密起來保管,這時(shí)候如果使用對(duì)稱加密算法,將數(shù)據(jù)進(jìn)行加密饰剥,秘鑰我們自己記在心里殊霞,只需要記住一個(gè)密碼。需要的時(shí)候可以還原信息汰蓉。
  • android 里需要把一些敏感數(shù)據(jù)保存到SharedPrefrence 里的時(shí)候绷蹲,也可以使用對(duì)稱加密,這樣可以在需要的時(shí)候還原顾孽。
  • 請(qǐng)求網(wǎng)絡(luò)接口的時(shí)候祝钢,我們需要上傳一些敏感數(shù)據(jù),同樣也可以使用對(duì)稱加密若厚,服務(wù)端使用同樣的算法就可以解密拦英。或者服務(wù)端需要給客戶端傳遞數(shù)據(jù)测秸,同樣也可以先加密疤估,然后客戶端使用同樣算法解密。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霎冯,一起剝皮案震驚了整個(gè)濱河市做裙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肃晚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仔戈,死亡現(xiàn)場離奇詭異关串,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)监徘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門晋修,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凰盔,你說我怎么就攤上這事墓卦。” “怎么了户敬?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵落剪,是天一觀的道長。 經(jīng)常有香客問我尿庐,道長忠怖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任抄瑟,我火速辦了婚禮凡泣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己鞋拟,他們只是感情好骂维,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贺纲,像睡著了一般航闺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哮笆,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天来颤,我揣著相機(jī)與錄音,去河邊找鬼稠肘。 笑死福铅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的项阴。 我是一名探鬼主播滑黔,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼环揽!你這毒婦竟也來了略荡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤歉胶,失蹤者是張志新(化名)和其女友劉穎汛兜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體通今,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粥谬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辫塌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漏策。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖臼氨,靈堂內(nèi)的尸體忽然破棺而出掺喻,到底是詐尸還是另有隱情,我是刑警寧澤储矩,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站持隧,受9級(jí)特大地震影響抑月,放射性物質(zhì)發(fā)生泄漏谦絮。R本人自食惡果不足惜题诵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一层皱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叫胖,春花似錦、人聲如沸瓮增。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砸捏,卻和暖如春谬运,著一層夾襖步出監(jiān)牢的瞬間垦藏,已是汗流浹背梆暖。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掂骏,地道東北人轰驳。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像弟灼,于是被迫代替她去往敵國和親滑废。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 隨著對(duì)于安全度的不斷要求,對(duì)于數(shù)據(jù)加解密與破解之間的斗爭豁延,加解密的方式也在不斷發(fā)生著變化昙篙,來看看現(xiàn)在流行的一些加解...
    zhouhao_180閱讀 2,063評(píng)論 1 12
  • 本文主要介紹移動(dòng)端的加解密算法的分類、其優(yōu)缺點(diǎn)特性及應(yīng)用诱咏,幫助讀者由淺入深地了解和選擇加解密算法苔可。文中會(huì)包含算法的...
    蘋果粉閱讀 11,459評(píng)論 5 29
  • 介紹 加密和解密都使用同一把秘鑰,這種加密方法稱為對(duì)稱加密袋狞,也稱為單密鑰加密焚辅。簡單理解為:加密解密都是同一把鑰匙 ...
    Blizzard_liu閱讀 800評(píng)論 0 1
  • 一顆兩顆三四顆 五顆六顆七八顆 化作美酒伴琴瑟 入骨相思誰與歌 2017年五月于從化釆梅歸來映屋,與閨蜜共釀楊梅酒有感。
    安靜世界閱讀 178評(píng)論 0 0
  • 躺在床上同蜻,睡不著∨锏悖現(xiàn)在努力或許已經(jīng)來不及了,但其實(shí)我也不清楚結(jié)局湾蔓。喜憂參半瘫析。不過有些虛妄斷不會(huì)有結(jié)果,早已明...
    木之執(zhí)閱讀 314評(píng)論 27 10