IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 仿射密码加密解密(C语言) -> 正文阅读

[数据结构与算法]仿射密码加密解密(C语言)

仿射密码是一种古典移位密码,其算法设计时用到的数学基础是模运算和同余方程。它是一个字母对一个字母的加密密码。定义明文空间 P = Z 26 P={\rm Z}_{26} P=Z26? ,密文空间 C = Z 26 C={\rm Z}_{26} C=Z26? ,秘钥空间为 K = { ( a , b ) ∈ Z 26 ? Z 26 : g c d ( a , 26 ) = 1 } K=\lbrace (a,b)\in {\rm Z}_{26} \cdot {\rm Z}_{26}:gcd(a,26)=1 \rbrace K={(a,b)Z26??Z26?:gcd(a,26)=1} 对于 x ∈ P , y ∈ C , k = ( a , b ) ∈ K x\in P, y\in C,k=(a,b)\in K xP,yC,k=(a,b)K 定义加密函数 e k ( x ) = a x + b m o d ?? ? 26 {\rm e}_k(x)=ax+b\mod \ 26 ek?(x)=ax+bmod?26
,定义解密函数 d k ( x ) = a ? 1 ( y ? b ) m o d ?? ? 26 ) {\rm d}_k(x)=a^{-1}(y-b)\mod \ 26) dk?(x)=a?1(y?b)mod?26)
,其中是a在群的乘法逆元(求a在群的乘法逆元)。当a=1时,仿射密码,弱化为凯撒密码。

1.加密过程: text为要加密的明文,password为加密后的密文

//加密
char* encode(char* text,int addkey,int mulkey)
{
    char* password=NULL;//空指针
    //开辟空间
    password=(char*)malloc(10*sizeof(char));
    for(int i=0;i<strlen(text);i++)
    {
        int code=text[i]-'a';
        password[i]=(code*mulkey+addkey)%26+'a';
    }
    return password;
}

2.求逆过程: 拓展欧几里得算法

//求逆  b%m的逆
int extendedeuclid(int m,int b)
{
    int a1,a2,a3;
    int b1,b2,b3;
    int t1,t2,t3;
    a1=1;a2=0;a3=m;
    b1=0;b2=1;b3=b;
    while(1)
    {
        if(b3==0) return 0;
        if(b3==1)
        {
            if(b2<0) b2=m+b2;
            return b2;
        }
        int q=a3/b3;
        t1=a1-q*b1;t2=a2-q*b2;t3=a3-q*b3;
        a1=b1;a2=b2;a3=b3;
        b1=t1;b2=t2;b3=t3;
    }
    return 0;
}

3.解密过程: password是要解密的密文,text是得到的解密后的明文。

//解密
char* decode(char* password,int addkey,int mulkey)
{
    char* text=NULL;
    text=(char*)malloc(10*sizeof(char));
    for(int i=0;i<strlen(password);i++)
    {
        int code=password[i]-'a';
        text[i]=( (code-addkey+ 26) * extendedeuclid(26,mulkey) )% 26 + 'a';
    }
    return text;
}

4.完整代码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

//求逆  b%m的逆
int extendedeuclid(int m,int b)
{
    int a1,a2,a3;
    int b1,b2,b3;
    int t1,t2,t3;
    a1=1;a2=0;a3=m;
    b1=0;b2=1;b3=b;
    while(1)
    {
        if(b3==0) return 0;
        if(b3==1)
        {
            if(b2<0) b2=m+b2;
            return b2;
        }
        int q=a3/b3;
        t1=a1-q*b1;t2=a2-q*b2;t3=a3-q*b3;
        a1=b1;a2=b2;a3=b3;
        b1=t1;b2=t2;b3=t3;
    }
    return 0;
}

//加密
char* encode(char* text,int addkey,int mulkey)
{
    char* password=NULL;//空指针
    //开辟空间
    password=(char*)malloc(10*sizeof(char));
    for(int i=0;i<strlen(text);i++)
    {
        int code=text[i]-'a';
        password[i]=(code*mulkey+addkey)%26+'a';
    }
    return password;
}

//解密
char* decode(char* password,int addkey,int mulkey)
{
    char* text=NULL;
    text=(char*)malloc(10*sizeof(char));
    for(int i=0;i<strlen(password);i++)
    {
        int code=password[i]-'a';
        text[i]=( (code-addkey+ 26) * extendedeuclid(26,mulkey) )% 26 + 'a';
    }
    return text;
}
int main()
{
    char text[200];
    printf("请输入明文:");
    scanf("%s",text);
    int k,b;
    printf("请输入k,b的值:");
	scanf("%d%d",&k,&b);
    char *p=NULL;
    char *q=NULL;
    p=q=(char*)malloc(10*sizeof(char));
    p=encode(text,k,b);
    q=decode(p,k,b);
    printf("加密后的密文:%s\n",p);
    printf("解密后的明文:%s",q);
    free(p);free(q);
    return 0;
}

Cmd Markdown 公式指导手册
复习了一下C语言的指针,学的时候感觉难,现在看还是难。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:27:04  更:2021-09-18 10:29:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:28:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码