教材《应用密码学》-- 西安电子科技大学出版社
概念
将明文中的每一个字符均被替换成另一个字符(密文字符),接收者对密文做反向替换就可以恢复出明文。
替换密码是基于符号替换的密码技术,以符号的置换来达到掩盖文明信息的目的。
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"