古典密码----仿射密码加解密

这篇具有很好参考价值的文章主要介绍了古典密码----仿射密码加解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

理论部分

  • 仿射密码是移位密码的一个推广,其加密过程不仅包含移位操作,而且使用了乘法运算。与移位密码相同,仿射密码的明文空间M和密文空间C均为Z26,因此,在使用仿射密码体制对英文消息进行加密之前,需要在26个英文字母与Z26中的元素之间建立一一对应关系,然后才能应用仿射密码体制进行相应的加密计算和解密计算。

代码部分

C语言实现

#include <stdio.h>
#include <math.h>
#include<string.h>
#define N 200 

using namespace std;

void Affine(char *Input, char *Output, int length,int k1, int k2,int p){
	int km=k1,ka=k2;
	for(int i=0; i<length; i++){
  		if(Input[i]>='a'&&Input[i]<='z')
	  		Output[i]=(km*(Input[i]-'a')+ka)%p+'a';
		else
			if(Input[i]>='A'&&Input[i]<='Z')
				Output[i]=(km*(Input[i]-'A')+ka)%p+'A';
	  		else
	  			Output[i]=Input[i];
	}
	
	Output[length]='\0';//字符串时及时添加结束标志以防额外增加数组长度。 
	printf("The Input  Text is: %s.\n",Input);
//	fflush(stdin);
	printf("The Output Text is: %s.\n",Output);	
//	fflush(stdin);
} 

int EEA(int r0, int r1, int &r0_inverse, int &r1_inverse) {
	int R0=r0,R1=r1;
	if(r0==0 || r1==0){
		printf("ERROR: One of the two input numbers is zero.\n");
		return 0;
	}

	int q=0,r2=0,s0=1,s1=0,s2=0,t0=0,t1=1,t2=0;
	while(r1!=0){
		q=r0/r1;
		r2=r0%r1;
		s2=s0-s1*q;
		t2=t0-t1*q;
		//更新r0、r1、s0、s1、t0、t1 
		r0=r1;r1=r2;
		s0=s1;s1=s2;
		t0=t1;t1=t2;
	}
	//printf("THE GCD of R0 AND R1 IS: %d .\n", r0);
	//printf("Original s0 and t0: %d , %d.\n",s0,t0);
	if(r0==1){
		s0=(R1+(s0%R1))%R1;
		t0=(R0+(t0%R0))%R0;
		//printf("Afterwards [P+( x mod P)]mod P: s0 = %d ,t0= %d.\n",s0,t0);
		r0_inverse= s0;
		r1_inverse= t0;
		//printf("The inverse of %d mod %d is: %d\n",R1,R0,r1_inverse) ;
	}else{ 
		printf("THE GCD is: %d  UNEQUAL TO 1, NO INVERSE EXITS.\n",r0) ;
		return 1;
	} 
	return 0;
}

int main(){
 	int p =  26, k1, k2;//仿射密钥 c=k1*m+k2 mod p 古典密码p=26
	int p_, k_1, flag; 
 	char message[N + 1];
	do {
		flag = 0;
		printf("\nPlease input the three affine cipher parameters:k1,k2,p,以逗号分隔:"); 
	 	//读取数值时,默认以空格分隔,如需逗号则在%d后面指定格式:scanf("%d,%d",&k1,&k2);
		scanf("%d,%d,%d",&k1, &k2, &p);
	 	printf("\nThe input keys are: k1=%d , k2= %d, p= %d \n",k1,k2,p); 
		//getchar()在scanf()后,可以吸收回车符,以便输入下一个字符/串。特别是在后续需输入含空格的字符串时 
		getchar();
		flag = EEA(p, k1, p_, k_1);
		if (flag == 1)
			printf("输入的密钥无效,请重新输入!\n");
	} while(flag == 1);
	printf("Input the message to process:");
	//以回车(换行)作为字符串读取的结束,默认遇空格、回车、跳格键结束。 
	scanf("%[^\n]", message);
	printf("\nThe message/plaintext is:%s", message);
	int length = strlen(message);
 	char cipher[length], decipher[length];
	printf("对输入的文本进行加密处理:\n");
	printf("消息加密前后对比如下:\n");
	Affine(message, cipher, length, k1, k2, p);
	//补充解密部分
	printf("消息解密前后对比如下:\n");
	Affine(cipher, decipher, length, k_1, ((p - k2) * k_1) % 26, p);
	return 0;
}

运行结果截图

  • gcd为1
    头歌仿射密码,密码学,c++,开发语言,安全
  • gcd不为1
    头歌仿射密码,密码学,c++,开发语言,安全

文章来源地址https://www.toymoban.com/news/detail-769725.html

到了这里,关于古典密码----仿射密码加解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 密码学——古典密码中的基本加密运算附简单例题

    本篇文章将对古典密码中使用到的基本加解密运算进行总结,并展示个别加减密运算的简单例题,从而使读者更加容易理解古典密码中的基本加减密运算的原理。 首先引入密码学中的几个基本定义: M:明文空间,明文的集合 C:密文空间,密文的集合 K:密钥空间(也称密钥

    2024年02月12日
    浏览(84)
  • DES的加密与解密(C语言实现)——大三密码学实验

    目录 DES的描述 Feistel体制 密钥扩展函数 F函数 总流程  代码 get函数的构建 yihuo函数的构建 fuck函数的构建 left_move函数的构建 exchange函数的构建 erzhuanshi函数的构建 shizhuaner函数的构建 s_box函数的构建 主函数的构建 总函数 运行结果示例 DES: 16 轮, Feistel 型结构 明文长度:

    2024年02月07日
    浏览(49)
  • DES的加密解密在ECB上的使用(C语言实现)——大三密码学实验

    目录 实验内容 实验原理 DES加密解密 ECB(电码本模式) 代码 DES函数的构建 RE_DES函数的构建 ECB函数的构建 RE_ECB的函数的构建 主函数的构建 总代码 测试结果 输入一个文本文件,通过ECB和DES进行加密,再将内容储存在新的文本文件中,再通过ECB和DES解密,将内容储存在新的文本

    2024年02月04日
    浏览(60)
  • ctf密码学之四方密码解密

    前几日刷题遇到一道密码学的四方解密题: 题目如下:四方门主东方青木看着四面八方涌过来的极客,非常震惊,转头便进入了祖祠中的地下室,发现这丫传自唐朝的密室还设计了英文密码。旁边的石头上(附件中有拓本)刻着密码和密文,大家快帮助门主解出密码(答案为

    2024年02月14日
    浏览(80)
  • 密码学 - 加解密算法 - 填充规则

    对称加解密算法是分组运算,运算时需要将数据按固定长度分组,由于明文不一定是指定大小的整数倍,因此需要将明文的最后一个分组填充至加密算法所要求的分组大小后进行运算。 随着加解密算法的发展,出现了多种填充规则。 填充规则是对称加密分组加密算法的通用

    2024年02月09日
    浏览(42)
  • 密码学【java语言】初探究

    本文章学自尚硅谷密码学课程,面对小白群体!!! 本文章仅用于学习和交流,禁止用于其他用途,如若存在侵权,请及时联系作者,作者会及时进行处理。 密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为

    2024年02月02日
    浏览(51)
  • 【网络安全】【密码学】【北京航空航天大学】实验三、数论基础(下)【C语言实现】

    1、中国剩余定理(Chinese Remainder Theorem) (1)、算法原理 m1 , m2 , … mk 是一组 两两互素 的正整数,且 M = m1 · m2 · … · mk 为它们的乘积, 则如下的同余方程组: x == a1 (mod m1) x == a2 (mod m2) … x == ak (mod mk) 对于 模M 有唯一的解 x = (M · e1 · a1 / m1 + M · e2 · a2 / m2 + … + M · ek ·

    2024年02月02日
    浏览(51)
  • 【网络安全】【密码学】【北京航空航天大学】实验一、数论基础(上)【C语言和Java实现】

    1、通过本次实验,熟悉相关的编程环境,为后续的实验做好铺垫; 2、回顾数论学科中的重要基本算法,并加深对其的理解,为本学期密码学理论及实验课程打下良好的基础。 数论主要研究的是整数的运算及性质,许多常用的加密算法都用到了数论知识。 本次实验的实验环

    2024年01月25日
    浏览(61)
  • 【网络安全】【密码学】【北京航空航天大学】实验二、数论基础(中)【C语言和Java实现】

    1、扩展欧几里得算法(Extended Euclid’s Algorithm) (1)、算法原理 已知整数 a , b ,扩展的欧几里得算法可以在求得 a , b 的 最大公约数 的同时,找到一对整数 x , y ,使得 a , b , x , y 满足如下等式: ax + by = d = gcd(a,b) , 其中 gcd(a, b) 为 a 和 b 的最大公约数。 (2)、算法流程 本算

    2024年02月01日
    浏览(61)
  • 【11.10】现代密码学1——密码学发展史:密码学概述、安全服务、香农理论、现代密码学

    参考:密码学发展简史 骆婷老师的《现代密码学(32H)》课程,笔记+查找的资料补充 期末为闭卷考试的形式 密码学早在公元前400多年就已经产生,人类使用密码的历史几乎与使用文字的时间一样长,密码学的发展大致可以分为 3 个阶段: 1949年之前的古典密码学阶段; 1949 年

    2024年02月04日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包