MATLAB实现斯巴达木卷加解密

实验题目:斯巴达木卷

一、实验目的

实验环境: Windows 11操作系统;Matlab2019b

实现目标:实现斯巴达木卷加解密;矩阵规模可随意设置;

实现加密解密交互界面;实现加密解密关键步骤信息输出。

二、方案设计

1. 加密过程

  1. 获取明文,不对明文字符串中的空格进行处理,即保留空格

  1. 获取矩阵规模,将明文字符逐行存储到用户给定规模的矩阵中,得到明文矩阵

  1. 按列读取明文矩阵,获取加密后的字符,并将字符串拼接,得到密文

2. 解密过程

  1. 获取密文,不对密文字符串中的空格进行处理,即保留空格

  1. 获取矩阵规模,将密文字符逐列存储到用户给定规模的矩阵中,得到密文矩阵

  1. 按行读取密文矩阵,获取解密后的字符,并将字符串拼接,得到明文

3. 信息输出

  1. 设置两个信息输出函数,分别实现加密界面和解密界面的信息输出

4. 交互界面

  1. 基于Matlab2019b中的mlapp编程实现

三、方案实现

1. 加密过程

介绍:加密按钮EnButtom回调函数

function EnButtonPushed(app, event)
            if strcmp('',app.Plaintext.Value)
                logRefresh_func_En(app,'请输入明文信息')
                return
            end
            
            if (app.Row.Value==0)||(app.Colum.Value==0)
                logRefresh_func_En(app,'请初始化明文矩阵大小')
                return
            end
            app.Length=length(app.Plaintext.Value);
           
            %将明文存储在对应的矩阵中
            fbar = waitbar(0,'明文载入中,请稍后');
            pause(0.5);
               app.plaintext=app.Plaintext.Value;
            for i=1:app.row
                for j=1:app.colum
                    if (i-1)*app.colum+j<=length(app.plaintext)
                        app.PlainMat{i,j}=app.plaintext((i-1)*app.colum+j);
                    else
                        app.PlainMat{i,j}=' ';
                    end
                end
                waitbar(i/app.row,fbar,'明文矩阵生成中');
                pause(0.07);
            end
            waitbar(1,fbar,'明文矩阵生成完成');
            logRefresh_func_En(app,'明文矩阵生成完成')
            pause(0.5);
            
            %对明文矩阵进行加密处理得到ciphertext
            for n=1:app.colum
                for m=1:app.row
                    if ((n-1)*app.row+m)==1
                           app.ciphertext=app.PlainMat{m,n};
                    else
                           app.ciphertext=[app.ciphertext,app.PlainMat{m,n}];
                    end
                end
                waitbar(n/app.colum,fbar,'密文生成中');
                pause(0.07);
            end
            waitbar(1,fbar,'加密成功');
            logRefresh_func_En(app,'加密成功')
            app.Crypt.Value=app.ciphertext;
               app.Crypt_De.Value=app.ciphertext;
            pause(0.5);
            close(fbar)
end

2. 解密过程

介绍:解密按钮DeButtom回调函数

function DeButtonPushed(app, event)
            high=ceil(app.Length/app.colum_De);
            %将密文存储在对应的矩阵中
            fbar=waitbar(0,'密文载入中,请稍后');
            pause(0.5);
            for i=1:app.colum_De
                for j=1:app.row_De
                    if(i-1)*app.row_De+j<=length(app.ciphertext)
                        app.CipherMat{j,i}=app.ciphertext((i-1)*app.row_De+j);
                    else
                        app.CipherMat{j,i}='';
                    end
                end
                waitbar(i/app.row_De,fbar,'密文矩阵生成中');
                pause(0.07);
            end
            waitbar(1,fbar,'密文矩阵生成完成');
            logRefresh_func_De(app,'密文矩阵生成完成')
            pause(0.5);
            
            %对密文矩阵进行加密处理得到plaintext
            forn=1:high
                form=1:app.colum_De
                    if((n-1)*app.colum_De+m)==1
                        app.plain=app.CipherMat{n,m};
                    else
                        app.plain=[app.plain,app.CipherMat{n,m}];
                    end
                end
                waitbar(n/app.colum_De,fbar,'明文生成中');
                pause(0.07);
            end
            app.Plaintext_De.Value=app.plain;
            waitbar(1,fbar,'解密成功');
            logRefresh_func_De(app,'解密成功')
            pause(0.5);
            close(fbar)
end

3. 信息输出

介绍:加密界面信息输出函数logRefresh_func_En

function logRefresh_func_En(app,StrArrayNew)
            app.Ptime=datestr(now);
            app.LOG=strcat('[',app.Ptime(end-7:end),']');
            StrArrayNew=strcat(app.LOG,StrArrayNew);
            app.StrArray_En=[app.StrArray_En,StrArrayNew,newline];
            app.Process_En.Value=app.StrArray_En;
end

介绍:解密界面信息输出函数logRefresh_func_De

function logRefresh_func_De(app,StrArrayNew)
            app.Ptime=datestr(now);
            app.LOG=strcat('[',app.Ptime(end-7:end),']');
            StrArrayNew=strcat(app.LOG,StrArrayNew);
            app.StrArray_De=[app.StrArray_De,StrArrayNew,newline];
            app.Process_De.Value=app.StrArray_De;
end

4. 交互界面

Matlab2019b的mlapp开发环境

四、数据测试与分析

1. 数据测试

  1. 加密过程

  1. 解密过程

  1. 加解密演示

2. 分析

输入明文后,不对空格进行处理,保留空格进行处理。随后对明文字符串按行依次填入给定规模的矩阵中,得到明文矩阵。随后按列进行读取,保留空格,依次拼接字符,得到加密后的密文字符串。

输入密文后,不对空格进行处理,保留空格进行处理。随后对密文字符串按列依次填入给定规模的矩阵中,得到密文矩阵。随后按行进行读取,保留空格,依次拼接字符,得到解密后的明文字符串。

五、总结

  1. 斯巴达木卷加解密是一种古老的加解密方法,加密与解密方约定一定规模的矩阵用于加密与解密。加密方将明文填入矩阵后,再将明文信息按列读取,得到经过加密的密文。解密方将密文信息按列进行填写再同样规模的矩阵中,随后按行进行读取,即可得到解密后的明文

  1. 在使用Matlab处理字符串时,需要频繁地使用“[]”或者“strcat”来对字符串进行拼接,以达到最终的加解密效果

  1. Matlab中的字符串索引从1开始,因此在实现加解密的过程中需要对此尤其注意,避免出现错位,导致加解密失败

  1. 在使用mlapp实现交互式的加解密界面时,需要理清每个控件之间的使用关系,即逻辑关系,如何时获取输入,何时对输入的明文以及矩阵规模进行处理,何时调用信息输出函数等

5. 在使用mlapp实现斯巴达木卷加解密时,需要注意全局变量的声明,与在Visual studio或是Pycharm中编写程序不同的是,mlapp中需要使用的全局变量要在最开始的属性中加以声明,唯有如此才能在整个加密与解密过程中对其进行使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BumbleStone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值