信息安全之程序實現簡單替換加密,並用字母頻率統計進行破解

1程序實現簡單密碼替換java

     首先咱們找一篇英文文章安全

 

而後寫程序簡單替換,這裏咱們使用移位替換a移3位替換成d(key表示移位數)

 

讀入文件函數

 

測試加密System.out.println(encode(readfile("2.txt"),3));

加密前app

 

加密後函數

 

 

而後咱們來破解

咱們知道英文中出現頻率最高字母的是e字母,咱們先測試下:測試

測試代碼:ui

 

主函數輸出:System.out.println(find(readfile("2.txt")));加密

結果果真是eurl

 

 

如今咱們假設只有加密後的文章以下該文章才用的移位加密方式和知道一篇文章裏最多的字母應該是e,

 

咱們首先統計文章裏出現最多的字母,發現是h 而後用 h-e得3,咱們就知道了偏移量爲3,解密只須要所有-3就能夠獲得原文。spa

 

解密函數:3d

 

 

測試結果:

 

解密後和原文

 

源代碼

package gh;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Iterator;
/**
 * 信息安全做業
 * @author ganhang
 *
 */
public class encrypt {
    private static HashMap<String, Integer> h=new HashMap<String, Integer>();
    public static void main(String[] args) {
//        System.out.println(readfile("2.txt"));
//        System.out.println(encode(readfile("2.txt"),3));
//        System.out.println(find(readfile("2.txt")));
        
        String encodeString =encode(readfile("2.txt"),3);//加密後的字符串
        String decodeString =decode(encodeString);//解密後的字符串
        System.out.println(decodeString);
    }
    /**
     * 解密
     * @param s
     */
    public static String decode(String s){
        String maxString =find(s);//找出出現最多的字母
        //System.out.println(maxString);
        char maxchar='e';//天然狀態下出現最多的字母
        char max =maxString.charAt(0);//轉字母
        int shift=max-maxchar;//得到偏移量(這裏是+3)
        return encode(s,0-shift);//(解密只須要偏移-3)
    }
    /**
     * 找出出現頻率最高的字母
     * @param s
     * @return
     */
    public static String find(String s){
        //HashMap<String, Integer> h=new HashMap<String, Integer>();
        char c[]=s.toCharArray();
        int count=0;
        for(int i=0;i<c.length;i++){
            if (c[i] <= 'Z' && c[i] >= 'A' || c[i] <= 'z' && c[i] >= 'a') {
                if(h.get(""+c[i])!=null)count=h.get(""+c[i]);
                h.put(c[i]+"",++count);
            }
        }
        int max=-1;
        String maxString=null;
        for (String str : h.keySet()) {
            if (h.get(str) > max) {
                max = h.get(str);
                maxString = str;
            }
        }
        return maxString;
    }
    /**
     * 讀文件
     * @param url
     * @return
     */
    public static String readfile(String url){
        StringBuilder sb = new StringBuilder();
        try {
            Reader in=new InputStreamReader(new FileInputStream(url));
            char []cbuf=new char[1024];
            int len;
            while((len=in.read(cbuf))!=-1){
                sb.append(cbuf);
            }
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
    /**
     * 移位加密
     * @param s
     * @param key
     * @return
     */
    public static String encode(String s, int key) {
        StringBuilder sb = new StringBuilder();
        char[] c = s.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] <= 'Z' && c[i] >= 'A' || c[i] <= 'z' && c[i] >= 'a') {
                char ch = (char) (c[i] + key);
                sb.append(ch);
            }else
                sb.append(c[i]);
        }
        return sb.toString();
    }
}

 因爲是做業,請勿抄襲哦(滑稽臉)。

相關文章
相關標籤/搜索