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

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

 因为是做业,请勿抄袭哦(滑稽脸)。

相关文章
相关标签/搜索