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


1程序實現簡單密碼替換

     首先我們找一篇英文文章

 

然后寫程序簡單替換,這里我們使用移位替換a移3位替換成d(key表示移位數)

 

讀入文件函數

 

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

加密前

 

加密后

 

 

然后我們來破解

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

測試代碼:

 

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

結果果然是e

 

 

現在我們假設只有加密后的文章如下該文章才用的移位加密方式和知道一篇文章里最多的字母應該是e,

 

我們首先統計文章里出現最多的字母,發現是h 然后用 h-e得3,我們就知道了偏移量為3,解密只需要全部-3就可以得到原文。

 

解密函數:

 

 

測試結果:

 

解密后和原文

 

源代碼

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

 由於是作業,請勿抄襲哦(滑稽臉)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM