替换(代换)密码技术【密码学笔记】

本文深入探讨了替换密码技术,包括单字符单表替换的乘法、加法(移位)和仿射密码技术,以及单字符多表替换的Vigenere、Vernam和Hill密码技术。通过实例解析加密和解密过程,阐述了各种技术的原理和密钥使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

教材《应用密码学》-- 西安电子科技大学出版社

概念

将明文中的每一个字符均被替换成另一个字符(密文字符),接收者对密文做反向替换就可以恢复出明文。

替换密码是基于符号替换的密码技术,以符号的置换来达到掩盖文明信息的目的。

1、单字符单表替换密码技术

单表单字符的含义是对明文中所有的字符都使用一个固定的映射,即:

  • 任何明文加密、密文解密均使用同一个密码表。
  • 明文中相同的字母,必被加密成相同的密文字母。

(1)乘法密码技术

 

乘法密码技术的密匙是k。k满足gcd(k,n)=1,若n为素数,则有n-2个密匙(k=1是恒等变换,即加密后的密文和明文是一样的,应当舍弃);若n不是素数,则有φ(n)-1个密匙(同样是舍弃了为1的情况)。

解密变换中的 k-1 为 k 对模 n 的逆(也叫做 k 关于 n 的逆元),写作k-1(mod n) 或 k-1,满足:

  

要求 k, n 互质,否则 k 关于n的逆元不存在。

【例1】

英文字母 n = 26,取密匙 k = 9。

明文:m = a man liberal in his views

密文:c = a ean vujkxav un lug hukqg

根据 k=9, n=26 , 9-1(mod 26) = 3

测试代码:

#include <iostream>
#include <string>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;

char encypt(char c) {
    if (c != ' ')
        return (c - 'a') * 9 % 26 + 'a';//未考虑大小写
    return ' ';
}

char decode(char c) {
    if (c != ' ') {
        return (3 * (c - 'a')) % 26 + 'a';//未考虑大小写
    }
    return ' ';
}

void drawMapTable() {
    //未考虑大小写
    for (char cc = 'a'; cc <= 'z'; cc++){
        cout << cc << ": " << encypt(cc) << endl;
    }
}

int main() {
#ifdef LOCAL
    fstream cin("data.in"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值