Android仿射密码破译app

前面讲了仿射密码的加密,现在来讲讲仿射密码的破译
在进行破译之前首先要了解仿射密码是如何解密的
下面是完整的仿射密码的加解密过程
这里写图片描述
由此可见,解密的关键就在于求出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;
    @Override
    protected 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(){
            @Override
            public void onClick(View v){
                input=edit1.getText().toString();//获得edit1输入的内容并转为字符串,这里会自动调用键盘,也可以复制粘贴输入,不需要专门写调用键盘和复制粘贴的函数
                char outstringchar[]=out
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值