C语言实现仿射密码

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: C语言实现仿射密码

一.仿射密码

仿射密码是一种古典密码,它是通过对明文中的每个字符进行数学变换来加密消息的。这种加密方法最初被使用于古罗马时期,凯撒密码就是一种简单的仿射密码。在现代密码学中,仿射密码已经不再被视为安全的加密方法,因为它容易受到各种攻击,如频率分析攻击和线性密码分析攻击。然而,仿射密码仍然具有教育意义,可以帮助初学者了解密码学的基本概念和技术。


二.基本原理

仿射加密是一种基于数学运算的对称加密技术,其原理是使用一个仿射变换来对明文进行加密。


2.1加密

具体来说,仿射加密需要选择两个整数a和b作为加密密钥。加密过程中,先将明文中的每个字符对应到一个数字上(比如A对应0,B对应1等),形成一个数字序列。然后,对该数字序列中的每个数字x,执行下面的运算:


y = (ax + b) mod m


其中,m是字母表大小(比如26,如果只考虑大写字母的话),mod表示模运算,即取余数。这样得到的y就是该数字的加密结果。最后,将每个加密结果对应到相应的字母上(比如0对应A,1对应B等),就得到了加密后的密文。


2.2解密

解密过程与加密过程相似,也是选择两个整数a和b作为解密密钥,并将密文中的每个字符对应到一个数字上,再执行下面的运算:


x = a^-1(y - b) mod m


其中,a-1表示a的逆元,也就是满足aa-1 ≡ 1 (mod m)的整数。这样得到的x就是该数字的解密结果。最后,将每个解密结果对应到相应的字母上,就得到了原始的明文。


三.优缺点

3.1优点

仿射密码简单易懂,容易实现和使用。


加密速度快,因为使用的是基本的算术运算。


支持多种语言,包括中文、英文等。


提供了一定程度的安全保障,可以用于一些低级别的加密需求。


3.2缺点

安全性较低,容易受到暴力破解和频率分析等攻击。


密钥空间较小,只有 2626种可能的密钥。


容易受到已知明文攻击。


不支持数字和标点符号等特殊字符的加密。


总体而言,由于仿射密码的安全性相对较弱,因此在现代加密技术中很少被使用。


四.补充

4.1参数说明

仿射密码的解密过程中,存在求逆元这一步,而要使其逆元存在,基本要求是参数a必须与总字母数m互质。


4.2字母表说明

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
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

在本次实验中,我们定义每个字母代表的数字如上所示。


五.C语言实现

#include<stdio.h>
#include<string.h>
#define Maxsize 50    //定义最大传送信息量
//加密函数
void jiami(char *&p,int a,int b)
{
  printf("密文:");
  for(int i=0;i<strlen(p)-1;i++)
  {
    printf("%c",(char)(((p[i] + 'a' - 97*2)*a+b)%26+97));
  }
  printf("\n");
}
// 求逆元
int mod_inverse(int a, int m)
{
  int x, y, q, r1 = m, r2 = a, r, t1 = 0, t2 = 1, t;
  while (r2 > 0) {
    q = r1 / r2;
    r = r1 - q * r2;
    r1 = r2;
    r2 = r;
    t = t1 - q * t2;
    t1 = t2;
    t2 = t;
  }
  x = t1;
  if (x < 0) {
    x += m;
  }
  return x;
}
//解密函数
void jiemi(char *&q,int x,int b)
{
  printf("明文:");
  for(int i=0;i<strlen(q);i++)
  {
    printf("%c",(char)((((q[i]+'a'-97*2)-b)*x)%26+97));
  }
}
int main() 
{
  char str1[Maxsize],str2[Maxsize];
  char *p=str1,*q=str2;         //两个数组指针,分别代替明文、密文
  int a,b;
  printf("请输入明文:");
  fgets(str1, Maxsize, stdin);
  printf("请输入移位密匙系数1:");
  scanf("%d",&a);
  printf("请输入移位密匙系数2:");
  scanf("%d",&b);
  jiami(p,a,b);                    //加密测试
  printf("------------------");
  printf("\n");
  printf("请输入密文:");
  printf("\n");
  scanf("%s",str2);
  int x=mod_inverse(a,26);
  jiemi(q,x,b);                 //解密测试
}

六.实验结果

3aedb0f3bfb883f119a473604e61241e.jpg

相关文章
|
8月前
|
安全 BI 数据安全/隐私保护
每天一道C语言编程:合格密码的判定
每天一道C语言编程:合格密码的判定
58 0
|
机器学习/深度学习 Java 数据安全/隐私保护
密码检查-C语言/Java
密码检查-C语言/Java
103 0
|
8月前
|
数据安全/隐私保护 C语言
c语言:模拟用户密码登录
c语言:模拟用户密码登录
105 0
|
存储 算法 数据安全/隐私保护
虚位密码验证 保护C语言程序的数据安全性。
7位密码验证:保护C语言程序的数据安全性 密码验证是程序开发过程中保护数据安全性的重要环节。在C语言编程中,我们可以通过实现7位密码验证系统来提高程序的安全性。本文将介绍如何设计和实现这个系统,并讨论它对数据安全性的作用。
109 0
|
机器学习/深度学习 网络安全 数据安全/隐私保护
C语言实现hill(希尔)密码
C语言实现hill(希尔)密码
319 0
|
数据安全/隐私保护 C语言
C语言实现移位密码
C语言实现移位密码
453 0
|
数据安全/隐私保护
凯撒密码转化,循环,C语言版!
则是这样的: 1. 对于字母字符,将其转换成其后的第3个字母。例如:A→D,a→d,X→A,x→a; 2. 对于非字母字符,保持不变。 现在,请你根据输入的一行字符,输出其对应的密码。
230 0
|
C语言 数据安全/隐私保护 UED
C语言实现密码登录界面,你可能已被盯上!
C语言实现密码登录界面,你可能已被盯上!
1732 0
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
62 10
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
50 9