【密码学】古代、古典密码

2023-11-18

古代密码

  • 数据的保密基于加密算法的保密。

Scytale密码

  • 使用一条纸袋作为载体,环绕在一根固定半径的圆柱上。

加密

  • 在绕好的纸带上写上明文。
  • 解开缠绕后,就是加密好的、无序的密文。
  • 圆柱的半径就是密钥

解密

  • 找到相同大小的圆柱,将纸带缠绕在援助上,即得到密文。

棋盘密码

  • 26个字母放进一个5x5的表格中(ij放在一起)。

加密

  • 将明文对照表格找到横纵坐标,横坐标+纵坐标即为单个字符的密文。
  • 其中这个表格就是密钥

解密

  • 对照表格,将密文以2个数字一组,找到对应的字母。

凯撒密码

  • 是一种移位密码,将字母对应到相应的数字(A对应为0)后,通过循环移位,改变对应的字母。

加密

  • 先将每个字母对应到0~25的数字。
  • 再进行移c位,这里的c就是密钥

c = ( m + k ) % 26 c=(m+k)\%26 c=(m+k)%26

凯撒密码的c3

解密

  • 对移位操作反向执行,即可恢复原文。

m = ( c − k ) % 26 m=(c-k)\%26 m=(ck)%26

古典密码

  • 两种构造方式:
    • 代替密码
    • 置换密码

置换密码

  • 字或者字母本身不变,位置发生改变,形成密文。
  • 又称为易位密码。
  • 下面举出报文倒置法的例子。

加密

  • 将明文倒置输出得到密文。

解密

  • 将密文倒置输出得到明文。

单表代替密码——加法密码

  • 凯撒密码,不多赘述。

加密

  • 代码
//m is message, k is key,l is the length of message
void f(int*m, int k,int l){
    for(int i=0;i<l;i++){
        printf("%c",(m[i]+k)%26+97);
    }
}

解密

  • 代码
//m is message, k is key,l is the length of message
void f(int*c, int k,int l){
    for(int i=0;i<l;i++){
        printf("%c",(c[i]-k+26)%26+97);
    }
}

单表代替密码——乘法密码

加密

  • 密钥k26互素,保证k的逆存在。

c = k × m ( m o d 26 ) c=k\times m(mod26) c=k×m(mod26)

  • 代码
//m is message, k is key,l is the length of message
void f(int *m,int k,int l){
    for(int i = 0;i < l;i++){
        printf("%c",m[i]*k%26+97);
    }
}

解密

  • 利用扩展欧几里得得到k的逆。

m = k − 1 × c ( m o d 26 ) m=k^{-1}\times c(mod26) m=k1×c(mod26)

  • 代码
int prim[12] = {1,3,5,7,9,11,15,17,19,21,23,25};
//m is message, k is key,l is the length of message
void f(int *c,int k,int l){
    int d;
    for(int i = 0;i < 12;i++){
        if(k*prim[i]%26 == 1){
            d = prim[i];
        }
    }
    for(int i = 0;i < l;i++){
        printf("%c",c[i]*d%26+97);
    }
}

这里由于集合中素数只有12个,依次枚举即可得到密钥的逆。

int prim[12] = {1,3,5,7,9,11,15,17,19,21,23,25};
//decode with exgcd
void exgcd(int a,int b,int*yp){
    int x;
    if(!b){
        x = 1;
        *yp = 0;
        return;
    }
    int x1=0,x2=1,y1=1,y2=0,q,r;
    while(b>0){
        q = a/b;
        r = a-q*b;
        x = x2-q*x1;
        *yp = y2-q*y1;
        a = b;
        b = r;
        x2 = x1;
        x1 = x;
        y2 = y1;
        y1 = *yp;
    }
    *yp = y2;
}

void f(int *c,int k,int l){
    int d;

    exgcd(26,k,&d);
    
    for(int i = 0;i < l;i++){
        printf("%c",c[i]*d%26+97);
    }
}

单表代替密码——仿射密码

  • 结合加法密码和乘法密码就得到仿射密码。

加密

c = a × m + b ( m o d 26 ) c=a\times m+b(mod26) c=a×m+b(mod26)

解密

  • 分别使用加法密码和乘法密码的逆过程即可得到。

m = a − 1 ( c − b ) ( m o d 26 ) m=a^{-1}(c-b)(mod26) m=a1(cb)(mod26)

单表代替密码——密钥短语代替

  • 这种密码选用一个英文短语或者单词串作为密钥,称为密钥字或密钥短语

加密

  • 构造乱序字母表作为密钥,将明文中的字符进行映射。
  • 例如下表(一三行为明文表,二四行为对应密文)。
a b c d e f g h i j k l m
H A P Y N E W R B C D F G
n o p q r s t u v w x y z
I J K L M O Q S T U V X Z

解密

  • 得到字母表之后进行一一替换即可。

通过大量密文统计每个字符出现概率,在单一密文里面找到对应概率的字符进行替换尝试,可能导致在没有字母表时密文被破解。

多表代换密码

  • 每一位字符对应不同的加密方法,构造二维表作为密钥

加密

  • 构造可逆模26互素矩阵,利用它和明文串相乘得到密文串。

C i = A M i + B ( m o d N ) C_i=AM_i+B(mod N) Ci=AMi+B(modN)

  • 由于在构造二维表时,我太懒了难以找到满足条件的表,这里代码只给出3阶密钥(老师给的)。
int key[NUM][NUM] = {{11,2,19},{5,23,25},{20,7,17}};

void f(int *m,int l){
    char c;
    for(int i = 0;i < l;i++){
        c = 0;
        for(int j = 0;j < l;j++){
            c += key[i][j]*m[j]%26;
        }
        printf("%c",c%26+97);
    }
}

解密

  • 利用矩阵可逆的条件,构造逆矩阵作为乘法矩阵。
  • 密文串和逆矩阵做乘法之后便得到明文串。

M i = A − 1 ( C i − B ) ( m o d N ) M_i=A^{-1}(C_i-B)(modN) Mi=A1(CiB)(modN)

  • 代码
int dkey[NUM][NUM] = {{10,23,7},{15,9,22},{5,9,21}};

void f(int *c,int l){
    char m;
    for(int i = 0;i < NUM;i++){
        m = 0;
        for(int j = 0;j < NUM;j++){
            m += dkey[i][j]*c[j]%26;
        }
        printf("%c",m%26+97);
    }
}
  • 代码
int dkey[NUM][NUM] = {{10,23,7},{15,9,22},{5,9,21}};

void f(int *c,int l){
    char m;
    for(int i = 0;i < NUM;i++){
        m = 0;
        for(int j = 0;j < NUM;j++){
            m += dkey[i][j]*c[j]%26;
        }
        printf("%c",m%26+97);
    }
}

实际上统一密文以l为单位长度

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【密码学】古代、古典密码 的相关文章

  • SQL 连接运算join

    连接运算是 8种关系运算 中的一种 五种JOIN方式 1 INNER JOIN or JOIN 2 OUTER JOIN 2 1LEFT OUTER JOIN or LEFT JOIN 2 2RIGHT OUTER JOIN or RIGH
  • 一图看懂 openpyxl 资料整理+笔记(大全)

    本文由 大侠 AhcaoZhu 原创 转载请声明 链接 https blog csdn net Ahcao2008 一图看懂 openpyxl 资料整理 笔记 大全 摘要 类结构图 一级模块目录 按字序 多级模块 按层级 模块级 doc 及

随机推荐

  • 【已更新代码图表】2023数学建模国赛E题python代码--黄河水沙监测数据分析

    E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河 研究黄河水沙通量的变化规律对沿黄流域的环境治理 气候变 化和人民生活的影响 以及对优化黄河流域水资源分配 协调人地关系 调水调沙 防洪减灾 等方面都具有重要的理论指导意义 附件 1 给出
  • STM32---SPI

    SPI 1 SPI介绍 SPI主要应用在EEPROM FLASH 实时时钟 AD转换器 数字信号处理器 数字信号解码器 4条信号线 MISO 主设备输入 从设备输出引脚 主机从这条信号线读入数据 从机的数据由这条信号线输出到主机 即在这条线
  • 面试必问

    若有收获 请记得分享和转发哦 对于工作3年左右的Java程序员来说 在面试大厂的过程中 面试官可能不会太关注你做了多少个项目 你的CRUD水平如何 更多的是关注你对某项技术点的理解深度 所以说 工作3年左右的小伙伴一定要把自己的重心放到技术
  • HTML基础标签及其语义

    一 HTML语法规范 1 1 基本语法表述 标签通常都是成对出现 双标签 开始结束标签 br 单标签 1 2 标签关系 包含关系与并列关系 包含关系 父标签 子标签 并列关系 1 3 HTML基本结构标签 骨架标签 页面内容也是在这些基本标
  • 陷波器设计

    中心频率 f c H z f c rm Hz fc Hz 3dB陷波器带宽 f
  • emplace_back与push_back异同

    vector的emplace back与push back 文章目录 vector的emplace back与push back 前言 1 区别总览 2 push back 支持右值引用 不支持传入多个构造参数 总是会进行拷贝构造 3 em
  • C++学习笔记——随机数

    利用rand 函数生成随机数如何随机是根据随机数种子来生成 一个程序的随机数种子一般是固定的 所以是伪随机数 若想生成真随机数 则用电脑的时间来初始化这个随机数种子 include
  • LLM 赋能的研发效能:如何探索软件开发新工序?

    上周末 我们 我和我的同事谢保龙 在 QCon 广州 2023 上分享了一个 AI 结合研发效能的话题 探索软件开发新工序 LLM 赋能研发效能提升 我们分享了 Thoughtworks 在过去的两个月里对于 LLM 大语言模型 结合软件开
  • 高防CDN和加速CDN有什么区别?

    高防CDN和加速CDN有什么区别 随着互联网技术的不断发展 CDN Content Delivery Network 已经成为了网络加速和安全保障的重要手段 在CDN的领域中 高防CDN和加速CDN是两种不同的CDN服务 它们有不同的特点和
  • 重积分的计算与理解

    主要分为二重积分和三重积分 二重积分 二重积分的基本思想是变成两次积分 物理意义已知面密度f 算质量 即首先把y方向的每一根线段计算出质量 相当于把y的线捏起来了 然后算x 主要方法如下 计算 D f x
  • 数据结构之链表:单向链表、单向循环链表、双向链表及基本操作

    目录 一 链表 1 1 单向链表 1 1 1 单链表的操作 1 2 单向循环链表 1 3 双向链表 了解 二 链表与顺序表的对比 一 链表 链表 将元素存放在通过链接构造起来的一系列存储块中 在每一个节点 数据存储单元 里存放下一个节点的位
  • 2020美赛建模F题思路和理解

    2020 MCM ICM 美国大学生数学建模竞赛 MCM ICM F题 2020 ICM Weekend 2 Problem F The Place I Called Home 思路和理解 问题中心 设计模型研究海平面上升对相关国家的人口
  • 报错:Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

    这两天自己搭spingmvc 总是报错 找不到自动注册的bean Could not autowire field private lf service UserService lf controllers UserController u
  • java实现队列_java实现队列

    队列的定义 队列的特点是节点的排队次序和出队次序按入队时间先后确定 即先入队者先出队 后入队者后出队 即我们常说的FIFO first in first out 先进先出 顺序队列定义及相关操作 顺序存储结构存储的队列称为顺序队列 内部使用
  • 使用 pad_sequence

    pad sequence 是用来干嘛的 首先 pad sequence 是用来对对tensor做padding 的 先看官方示例 文档地址https pytorch org docs stable generated torch nn ut
  • seaborn分类数据的绘制

    转载 seaborn分类数据的绘制https zhuanlan zhihu com p 27683042 总结很全的资料
  • json工具类ObjectMapper的详细使用记录

    1 用于json与其他对象之间转化的工具类 public class JsonUtil private static final ObjectMapper MAPPER new ObjectMapper private static fin
  • Java面向对象三大特性:继承、封装、多态

    面向对象编程 一 继承 1 表现形式 A extends B 2 子类继承了父类的什么 BAT 面试 3 this 和 super 关键字的区别 面试 4 Java 中访问权限修饰符 5 重写 与 重载的区别 面试 6 final 的用法
  • Qt学习笔记(四)ui界面通过样式表添加图片、背景、字体颜色等

    1 创建工程 添加ui 添加qrc资源文件 将图片导入 2 进入ui 可对背景界面 可对label pushbutton等构件右键改变样式表 进入样式表 看到添加资源下有三个选项 background image board image i
  • 【密码学】古代、古典密码

    古代密码 数据的保密基于加密算法的保密 Scytale密码 使用一条纸袋作为载体 环绕在一根固定半径的圆柱上 加密 在绕好的纸带上写上明文 解开缠绕后 就是加密好的 无序的密文 圆柱的半径就是密钥 解密 找到相同大小的圆柱 将纸带缠绕在援助