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

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();
    }
}
时间: 2024-12-20 23:19:50

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

Python基础教程3——教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)

因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧. 一.加密原理 记得当时我学c++的时候,学到输入输出流的时候,当时王老师就教我们写了一个小的加密程序,所以这次既然学习了Python这个小练习当然不能放过(其实这个加密程序我用c++,java都写过可以说也算比较熟了).加密原理就是循环读取文件每个字节,然后进行相应的加密运算后就是加密操作了,解密时候进行逆运算就是解密操作了. 比如我们读取文件的第一个字节数据是20(读取出来的每位数据为0~255,因为8

替换加密、解密算法

替换加密解密算法方案的起源可以追溯到凯撒(Caesar)时代,据说凯撒为了保障情报的可靠性而发明了凯撒密码.凯撒密码是一种简单的置换密码,在加密时,字母表中的每个字母都用其后的第三个字母表示,例如,a用d表示,b用e表示,.......在解密时,只需要执行逆过程即可. 1. 替换加密.解密算法 随这历史的发展,替换密码算法方案已具有很多种形式,主要有以下几种: 单表代替密码算法方案 同音代替密码算法方案 多表代替密码算法方案 多字母组代替密码算法方案 下面以单表代替密码算法方案为例进行介绍. 1

JAVA 通过位运算进行简单的加密

我们可以通过一个简单的位运算进行简单的加密 import java.util.Scanner; public class Example{ public static void main(String[]args){ Scanner input = new Scanner(System.in); System.out.println("请输入一个英文字符或解密字符串"); //获取用户输入的字符 String password = scan.nextLine(); //使用String

GDB 程序调试简单实践

用了好久的GCC/G++ 却一直都没用过GDB调试过程序,有时程序不是很大,一般有错,直接看编译器编译结果就差不多知道错在哪儿了,或者使用codeblocks单步调试,甚至回到windows下面调试,但是总是不太方便,因此有必要看一下GDB调试方法和基本步骤. 下面是一个简单的演示: 首先创建一个有错误的代码,如下: 这个程序很简单,目的是接受用户的输入,并将用户的输入回应输出来. 但是这个程序的第17行有个错误,使用了未初始化的字符指针name,因此编译运行后会出现段错误,如下: 下面利用GD

C#简单的加密类

1.加密 1 public class EncryptHepler { 2 // 验值 3 static string saltValue = "XXXX"; 4 // 密码值 5 static string pwdValue = "XXXX"; 6 7 /// <summary> 8 /// 加密 9 /// </summary> 10 public static string Encrypt( string input ) { 11 by

FreeBSD简单配置SSH并用root远程登陆方法

FreeBSD简单配置SSH并用root远程登陆方法 前言:最近下载了FreeBSD,在虚拟机上安装,第一步先要开启SSH服务,用终端putty软件可以实现在windows系统进行远程管理, 初级 ==================== 1.开启sshd服务: vi /etc/inetd.conf ssh stream top    nowait root     /usr/sbin/sshd ssh stream tcp6   nowait root    /usr/sbiin/sshd 去

编写一个程序,实现&quot;全部替换&quot;功能.

# 编写一个程序,实现"全部替换"功能. def file_replace():    file_name = input("请输入文件名:")    # 判断输入的路径或文件是否存在    try:        f_read = open(file_name)    except:        print("路径或文件不存在,请重新输入.")        return file_replace()  # 如果出错,则重新返回调用函数 re

运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】

一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffmpeg的时候已经写了一部分Java的命令控制功能了,有些代码就拿过来改改用了(其实是为了偷懒qaq) 二.实现功能 1.进程管理 只支持本程序启动的进程管理,本程序主要功能是定时执行某些脚本或者系统命令,当然命令行和脚本是很自由的,更多用法请自行探索 2.定时命令.任务 3.重复定时命令.任务 4.

软件USB加密狗(锁)复制克隆解密破解多少钱?

加密狗(dongle),经常被认为是软件保护,它是一个可被附加在计算机并口.串口或USB上的小插件,它包含厂家烧制的EPROM和定制的专用集成电路.dongle保护的的原理就是软件开发者在程序里经常检查dongle中的单元(Cell)的并对比返回值,这种检查可以是直接读单元或者是使用某种内部算法(此时单元受到保护无法直接读). 深圳凯基迪科技,在软件开发和加密狗复制方面拥有丰富的实践经验,现可解密复制各种软件狗USB加密锁,并承诺100%包成功!如有需要欢迎来电咨询! [132-6677-824