前面讲了仿射密码的加密,现在来讲讲仿射密码的破译
在进行破译之前首先要了解仿射密码是如何解密的
下面是完整的仿射密码的加解密过程

由此可见,解密的关键就在于求出a的逆,采用欧几里得算法,即辗转相除法来求逆。算法如下:

下面给出一个具体的例子
求25模31的逆元?
∵31=25*1+6,gcd(31,25)=gcd(25,6)
25=4*6+1,gcd(25,6)=gcd(6,1)=1
∴1=25-4*6=25-4*(31-25)=-4*31+5*25
1mod31=(5*25)mod31=1
∴25模31的逆元为5

求出逆元之后即可求得解密变换的公式,从而得到明文
下面再举一个完整的例子来解释加解密过程

说完解密之后再来说说该怎么破译
对仿射密码的破译可以采用统计分析法。
统计分析是分析者通过分析密文和明文的统计规律来破译密码。
某种语言中各个字符出现的频率不一样而表现出一定的统计规律,这种规律可能在密文中重现,攻击者利用这些规律通过一些推测和验证过程来实现密码分析的方法。
统计分析法一些规则:
1.英文字母统计规律有以下特点:
(1) 字母E的统计概率最高
(2) 依次是字母T、 A、 O、 I、 N、 S、 H和R
(3) 字母V、 K、 J、 X、 Q和Z出现 的频率最低
2.考虑位置特性,字母A、I和H一般不作为单词的结尾,而E、N和R出现在起始位置比结束位置概率小,字母T、O和S出现在单词前后的概率基本相同。
3. 按出现频率递减顺序,最常见的两字母组合依次是
TH HE IN ER AN RE DE ON ES ST
EN AT TO NT HA ND OU EA NG AS
4. 最常见的三字母组合依次是:
THE ING AND HER ERE
ENT THA NTH WAS ETH
5. 在单表代换中,字母的频率、重复字母的模式和字母组合方式等统计特性除字母名称改变外,其它的都未变化,密码分析者可利用英文字母的统计规律对密文进行分析。

具体过程:
1、得到一串密文,统计出各个字母出现的频率
2、找到出现频率最高的两个字母,假设它们分别为e和t加密后的结果(前面说过英文中出现频率最高的为e,其次是t)
3、根据e(x)=y=ax+b(mod26)列出两个方程,联立求出加密的a和b
4、求出a的逆,从而求出解密公式d(y)=x=cy+d(mod26)
5、将密文代入解密公式求出明文,看明文是否有意义
6、若明文无意义,再将密文中出现频率最高的字母假设为e加密后的结果,再依次假设出现频率次高的字母是a、o、i等字母加密后的结果,循环第(3)到(5)步,直到求出有意义的明文。

还是以例子还说明:


这里要注意的是求解a和b时同样要采用求逆的方式,即求5a=2mod26时,a=2*5^(-1)mod26

前面说了这么多,还是说回app,该app只能帮用户简化一些繁琐的统计工作和对应关系,关键的求出解密公式d(y)=x=cy+d中c和d的值还是需要用户自己算出来
同样还是有些变量命名不规范的情况存在,请读者见谅

MainActivity类:

package com.example.passwordcracking;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {private String input=null;private String output=null;private String outstring="ABCDEFGHIJKLMNOPQRSTUVWXYZ";private int inputnum[]=new int[1000];private int outputnum[]=new int[1000];private int out[]=new int[26];private int i;private String c,d;private char outputchar[]=new char[1000];private String tongji="";private EditText edit1;private EditText edit2;private EditText edit3;private TextView text2;private TextView text6;private Button button1;private Button button2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text2=(TextView)findViewById(R.id.text2);text6=(TextView)findViewById(R.id.text6);edit1=(EditText)findViewById(R.id.edit1);edit2=(EditText)findViewById(R.id.edit2);edit3=(EditText)findViewById(R.id.edit3);button1=(Button)findViewById(R.id.button1);button2=(Button)findViewById(R.id.button2);button1.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){input=edit1.getText().toString();//获得edit1输入的内容并转为字符串,这里会自动调用键盘,也可以复制粘贴输入,不需要专门写调用键盘和复制粘贴的函数char outstringchar[]=outstring.toCharArray();//String转char[]char inputchar[]=input.toCharArray();for(i=0;i<inputchar.length;i++){if(inputchar[i]>='A'&&inputchar[i]<='Z'){out[inputchar[i]-'A']++;inputnum[i]=inputchar[i]-'A';}}for(i=0;i<26;i++){tongji=tongji+outstringchar[i]+":"+out[i]+" ";//字符串的累加同数字累加一样out[i]=0;}text2.setText(tongji);tongji="";//这里要进行清空,否则重新在edit1中输入的话,处理后的数据会显示在原来的数据后面}});button2.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {c = edit2.getText().toString();d = edit3.getText().toString();if (!c.isEmpty() && !d.isEmpty()) { //这里要考虑没有输入c、b值的情况int cint = Integer.parseInt(c);//String转intint dint = Integer.parseInt(d);input = edit1.getText().toString();char inputchar[] = input.toCharArray();char outstringchar[] = outstring.toCharArray();for (i = 0; i < inputchar.length; i++) {outputnum[i] = cint * inputnum[i] + dint;if (outputnum[i] < 0) {outputnum[i] = outputnum[i] + 26;}outputnum[i] = outputnum[i] % 26;outputchar[i] = outstringchar[outputnum[i]];}output = String.valueOf(outputchar);//char[]转stringtext6.setText(output.toLowerCase());//string类大写转小写}else{Toast.makeText(MainActivity.this,"请输入a和b的值", Toast.LENGTH_SHORT).show();}}});}}

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.passwordcracking.MainActivity" ><TextView
        android:id="@+id/text1"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:gravity="center"android:textSize="30sp"android:text="请输入大写密文" /><EditText android:id="@+id/edit1"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="2"android:gravity="center"android:hint="Type here"android:maxLines="5"/><Button
        android:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="0dp"android:layout_gravity="center"android:layout_weight="1"android:text="统计各字母个数"/><TextView
        android:id="@+id/text2"android:layout_width="match_parent"android:layout_height="0dp"android:textSize="20sp"android:layout_weight="2" /><TextView
        android:id="@+id/text3"android:layout_width="wrap_content"android:layout_height="0dp"android:layout_weight="1"android:layout_gravity="center"android:textSize="30sp"android:text="输入解密时的c、d的值"/><!--</LinearLayout>--><LinearLayout
      android:layout_width="match_parent"android:layout_height="0dp"android:orientation="horizontal"android:layout_weight="1.5"><TextView
        android:id="@+id/text4"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textSize="30sp"android:gravity="center"android:text="c : "/><EditText android:id="@+id/edit2"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:hint="Type here"/><TextView
        android:id="@+id/text5"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textSize="30dp"android:gravity="center"android:text="d : "/><EditText android:id="@+id/edit3"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:hint="Type here"/></LinearLayout><LinearLayout
    android:layout_width="match_parent"android:layout_height="0dp"android:orientation="horizontal"android:layout_weight="3"><Button
        android:id="@+id/button2"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center"android:text="破译"/><EditText
        android:id="@+id/text6"android:layout_width="0dp"android:layout_gravity="bottom"android:layout_height="wrap_content"android:layout_weight="5" /></LinearLayout> </LinearLayout>

效果图:

下面给出几组密文供读者尝试破译:


P.S:C++版本:

#include<iostream>
using namespace std;
void main(){char input[1000],output[1000];int i=0,out[26]={0},inputnum[1000]={0},outputnum[1000]={0},j,a,b;char outstring[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};cout<<"请输入大写密文:";//cin>>input;fgets(input,1000,stdin);//gets()有溢出的可能,已经被取消了。改用fgets(),stdin为标准输入流while(input[i]){if(input[i]>='A'&&input[i]<='Z'){out[input[i]-'A']++;inputnum[i]=input[i]-'A';}i++;}cout<<endl;//空一行cout<<"输出各个字母出现的次数:"<<endl;for(j=0;j<26;j++){cout<<outstring[j]<<":"<<out[j]<<" ";}cout<<endl;cout<<endl;cout<<"密文对应的数字:"<<endl;//两个表示空一行for(j=0;j<i;j++){cout<<inputnum[j]<<" ";}cout<<endl;cout<<endl;cout<<"输入解密的a、b的值"<<endl;cout<<"a: ";cin>>a;cout<<"b: ";cin>>b;cout<<endl;cout<<"明文对应的数字:"<<endl;//a=21,b=15;for(j=0;j<i;j++){outputnum[j]=a*inputnum[j]+b;if(outputnum[j]<0){//若input[i]为‘A’,则inputnum[i]为0,outputnum[i]有可能为负值,若为负值要转为对26取余的正值outputnum[j]=outputnum[j]+26;}outputnum[j]=outputnum[j]%26;cout<<outputnum[j]<<" ";
}cout<<endl;cout<<endl;cout<<"明文:"<<endl;for(j=0;j<i;j++){output[j]=outstring[outputnum[j]]+32;//将大写字母转化为小写字母cout<<output[j];}
}

Java版本:


import java.util.Scanner;public class test01 {public static void main(String[] args){String input=null;String output=null;String outstring="ABCDEFGHIJKLMNOPQRSTUVWXYZ";int inputnum[]=new int[1000];int outputnum[]=new int[1000];int out[]=new int[26];int i,a,b;System.out.println("Please input capital password:");Scanner sc = new Scanner(System.in);//Scanner类从键盘读取输入input=sc.nextLine();//sc.close();char inputchar[]=input.toCharArray();//String转char[]char outstringchar[]=outstring.toCharArray();char outputchar[]=new char[1000];for(i=0;i<inputchar.length;i++){if(inputchar[i]>='A'&&inputchar[i]<='Z'){out[inputchar[i]-'A']++;inputnum[i]=inputchar[i]-'A';}}System.out.println("输出:");for(i=0;i<26;i++){System.out.print(outstringchar[i]+":"+out[i]+" ");}System.out.println();System.out.println();//两个等于空一行for(i=0;i<inputchar.length;i++){System.out.print(inputnum[i]+" ");}System.out.println();System.out.println();System.out.println("输入解密时a、b的值:");a=sc.nextInt();b=sc.nextInt();System.out.println("a: "+a);System.out.println("b: "+b);sc.close();System.out.println();System.out.println();for(i=0;i<inputchar.length;i++){outputnum[i]=a*inputnum[i]+b;if(outputnum[i]<0){outputnum[i]=outputnum[i]+26;}outputnum[i]=outputnum[i]%26;System.out.print(outputnum[i]+" ");}System.out.println();System.out.println();for(i=0;i<inputchar.length;i++){outputchar[i]=outstringchar[outputnum[i]];}output=String.valueOf(outputchar);//char[]转StringSystem.out.print(output.toLowerCase());//String类大写变小写}
}

完整android studio工程:
http://download.csdn.net/detail/amazinguu/9523391

Android仿射密码破译app相关推荐

  1. Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)(转载)

    SharedPreferences介绍: SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置参数,它是采用xml文件存放数据的,文件存放在" ...

  2. 利用Android Studio快速搭建App

    大家好,我是烤鸭: 给大家分享一个简单的用Android Studio快速搭建app 工具: Android Studio 64位 专业版 插件: Datepicker Timepicker okht ...

  3. android 自定义 黑点,Android自定义密码样式 黑点转换成特殊字符

    本文为大家分享了Android自定义密码样式的制作代码,黑点换成¥.%等特殊字符,供大家参考,具体内容如下 复制下面代码即可: 布局: xmlns:android="http://schem ...

  4. Android通过浏览器打开App并传递参数

    Android通过浏览器打开App并传递参数; Data的Uri的规则: scheme://host:port/path or pathPrefix or pathPattern 打开App传递参数U ...

  5. 基于Android的校园一卡通App平台

    演示视频信息: A6604基于Android的校园一卡通 一.研究背景.目的及意义 (一)研究背景         二十一世纪是信息化的时代,信息化建设成为我们的首要任务.当前我国大力发展信息产业,在 ...

  6. Android 组件化开源 app -开眼短视频(OpenEyes)

    Android-MvvmComponent-App 项目地址:darryrzhong/Android-MvvmComponent-App  简介: Android 组件化开源 app -开眼短视频(O ...

  7. android订餐系统app、android购物商城系统app 手机端+服务器端 mysql数据库,界面简单,功能齐全 安卓购物商城 安卓在线订餐系统

    android订餐系统app.android购物商城系统app 一.简介 该项目可作为毕业设计开发使用,包含项目源代码.数据库.开题报告.毕业论文.答辩ppt等. 毕业设计题目:"基于And ...

  8. android密码是小黑点,Android自定义密码样式 黑点转换成特殊字符

    本文为大家分享了Android自定义密码样式的制作代码,黑点换成¥.%等特殊字符,供大家参考,具体内容如下 复制下面代码即可: 布局: xmlns:android="http://schem ...

  9. Android EditText密码显示隐藏和全部属性的介绍

    Android EditText密码显示隐藏和全部属性的介绍 2016-08-20 17:06 4455人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: Android控件的功能(11) 作者 ...

  10. android手势密码源码,Android自定义UI手势密码改进版源码下载

    在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过. 先看第一张图片的布局文件 activity_main.xml xmlns:tools="http://s ...

最新文章

  1. 职场中有哪些沟通的小技巧?
  2. adf4351_使用ADF BC管理保存点
  3. python知识:QT5的move应用
  4. Java虚拟机学习(6):对象访问
  5. hadoop fs -ls / 出现WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform
  6. 论文学习15-Table Filling Multi-Task Recurrent Neural Network(联合实体关系抽取模型)
  7. jq父级绑定事件的意义_用jQuery.delegate()将事件绑定在父元素上面
  8. mysql数据库设计255_MySQL数据库设计规范
  9. java获取中文拼音首字母
  10. CCF NOI1149 N皇后问题
  11. 软件技术架构:通过限流与熔断,打造一个“靠谱”的系统
  12. 如何清空c盘只剩系统_电脑C盘怎么清理到最干净?高手教你清理C盘的详细步骤...
  13. Li feifei How we're teaching computers to understand pictures
  14. 人脸识别考勤系统解决方案
  15. Vue.js中props的使用
  16. 新能源板块又火了,如何把握投资机会?
  17. 算法设计与分析(Java实现)—— 动态规划(入门)斐波那契数列
  18. python 串口时钟校对_基于MicroPython的自动网络时间校准器
  19. 正交矩阵(部分转载)
  20. Kali-linux密码在线破解

热门文章

  1. 详解POW工作量证明原理
  2. Pegasus 在 Apache Conf 上的分享
  3. 爱因斯坦的逻辑思维题
  4. 游戏史上最伟大的10位制作人(图)
  5. 基于Openfire Smack开发即时通讯应用、获取离线消息,发送消息,联系人列表,添加好友(三)
  6. 《垃圾回收算法手册 自动内存管理的艺术》——引言、标记清扫(笔记)
  7. 怎么使用7zip进行分批压缩_7z解压软件(7-zip)分卷压缩怎么做?
  8. WebGL varying变量和颜色插值
  9. dajngo 初始化数据报错 django.db.utils.DataError: value too long for type character varying(32)
  10. 为马来西亚航空失联飞机祈福~~