码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-18 22:37:14      阅读:934      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

标签:

原文地址:http://www.cnblogs.com/ganhang-acm/p/5405876.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!