二、 实验项目名称:
作用域计算及仿射密码
四、 实验原理:
-
作用域加法与乘法:
设定作用域p,将所要计算的两个数进行加法或乘法得到Z1,再对Z1进行对p求余计算(Z2 = Z1 % p),得到结果Z2。
如果Z1得到是为负数,需先经过计算(Z1 = Z1 % p, Z1 += p),保证Z1在作用域内。 -
仿射密码:
a) 算法原理
仿射密码加密算法:C=Ek(m)=(k1m+k2)modn
仿射密码解密算法:M=Dk©=k3(c- k2) modn(其中k3×k1mod 26=1)。
i. 仿射密码具有可逆性的条件是gcd(k, n)=1。当k1=1时,仿射密码变为加法密码,当k2=0时,仿射密码变为乘法密码。
ii. 仿射密码中的密钥空间的大小为nφ(n),当n为26字母,φ(n)=12,因此仿射密码的密钥空间为12×26 = 312。
b) 算法参数
仿射密码算法主要有c、m、k1、k2四个参数。c为密文,m是明文,k1、k2为密钥。
c) 算法流程
算法流程如下。
五、 实验目的:
- 学习作用域加法与乘法的原理。
- 学习作用域加法与乘法的实现。
- 学习仿射密码算法的原理。
- 学习仿射密码算法的算法实现。
六、 实验内容:
- 用C++作用域加法及乘法。
- 用C++实现仿射变换的加/解密算法。
七、 实验器材(设备、虚拟机名称):
Spc_mmx_w7
八、 实验步骤:
先了解两个计算的原理,再使用C++进行编程,包括对一些特殊情况的处理(包括数值的正负,输入字符的大小写等。)
九、 实验结果及分析:
- MOD P 加法与乘法
#include<iostream>
using namespace std;
unsigned long long addmodp(long long x,long long y,unsigned long long p){
//若输入的为负数 则进行模
if(x<0) x = x%p + p;
if(y<0) y = y%p + p;
return (x+y)%p;
}
unsigned long long mulmodp(long long x,long long y,unsigned long long p){
if(x<0) x = x%p + p;
if(y<0) y = y%p + p;
return (x*y)%p;
}
int main(){
//输入作用域 P
unsigned long long p;
cout<<"请输入作用域p :";
cin>>p;
//输入两个任意的数 X Y
cout<<"请输入两个任意的数 X Y:";
long long x,y;
cin>>x>>y;
cout<<"X Y 进行模P加法的结果:";
//对 X Y 进行模 P加法
cout<<addmodp(x,y,p)<<endl;
cout<<"请输入两个任意的数 X Y:";
cin>>x>>y;
cout<<"X Y 进行模P乘法的结果:";
//对 X Y 进行模 P乘法
cout<<mulmodp<