信息安全之程序实现简单替换加密,并用字母频率统计进行破解

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

 由于是作业,请勿抄袭哦(滑稽脸)。

posted @ 2016-04-18 21:01  CodeNoob  阅读(3860)  评论(1编辑  收藏  举报