Polybius密码(Polybius Cipher)

也称棋盘密码,是利用波利比奥斯方阵(Polybius Square)进行加密的密码方式,产生于公元前两世纪的希腊,相传是世界上最早的一种密码。 假设我们需要发送明文讯息 “Attack at once”, 用一套秘密混杂的字母表填满波利比奥斯方阵,像是这样: 波利比奥斯方阵     i和j视为同一个字,使字母数量符合 5 × 5 格。之所以选择这五个字母,是因为它们译成摩斯密码时不容易混淆,可以降低传输错误的机率。使用这个方格,找出明文字母在这个方格的位置,再以那个字母所在的栏名称和列名称代替这个字母。可将该讯息转换成处理过的分解形式。 明文:A T T A C K A T O N C E 密文:AF AD AD AF GF DX AF AD DF FX GF XF A,D,F,G,X也可以用数字1,2,3,4,5来代替,这样密文就成了: 13 12 12 13 43 25 13 12 23 35 43 53 ------------------------------------------------------------------------- 【ADFGX/ADFGVX密码(ADFGX/ADFGVX Cipher)】 ADFGX 1918年,第一次世界大战将要结束时,法军截获了一份德军电报,电文中的所有单词都由A、D、F、G、X五个字母拼成,因此被称为ADFGX密码。ADFGX密码是1918年3月由德军上校Fritz Nebel发明的,是结合了Polybius密码和置换密码的双重加密方案。A、D、F、G、X即Polybius方阵中的前5个字母。 明文:A T T A C K A T O N C E 经过Polybius变换:AF AD AD AF GF DX AF AD DF FX GF XF 下一步,利用一个移位密钥加密。假设密钥是“CARGO”,将之写在新格子的第一列。再将上一阶段的密码文一列一列写进新方格里。 2   最后,密钥按照字母表顺序“ACGOR”排序,再按照此顺序依次抄下每个字母下面的整列讯息,形成新密文。如下: FAXDF ADDDG DGFFF AFAXX AFAFX 在实际应用中,移位密钥通常有两打字符那么长,且分解密钥和移位密钥都是每天更换的。 ADFGVX 在1918年6月,再加入一个字V扩充。变成以6×6格共36个字符加密。这使得所有英文字母(不再将I和J视为同一个字)以及数字0到9都可混合使用。这次增改是因为以原来的加密法发送含有大量数字的简短信息有问题。

转载于:https://www.cnblogs.com/pcx69/p/3661281.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Polybius加密是一种基于方格密码的加密方式,它将明文中的每个字母映射到一个二维表格中的一个坐标,然后将坐标转换为数字表示密文。以下是一个简单的C语言实现: ```c #include <stdio.h> #include <ctype.h> #define ROWS 5 #define COLS 5 char table[ROWS][COLS] = { {'A', 'B', 'C', 'D', 'E'}, {'F', 'G', 'H', 'I', 'K'}, {'L', 'M', 'N', 'O', 'P'}, {'Q', 'R', 'S', 'T', 'U'}, {'V', 'W', 'X', 'Y', 'Z'} }; void polybius_encrypt(char *plaintext, char *ciphertext) { int i, j, k; char c; for (k = 0; plaintext[k] != '\0'; k++) { c = toupper(plaintext[k]); if (c == 'J') c = 'I'; if (c < 'A' || c > 'Z') continue; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { if (table[i][j] == c) { sprintf(ciphertext + strlen(ciphertext), "%d%d", i+1, j+1); } } } } } void polybius_decrypt(char *ciphertext, char *plaintext) { int i, j, k; char c; for (k = 0; ciphertext[k] != '\0'; k += 2) { i = ciphertext[k] - '1'; j = ciphertext[k+1] - '1'; if (i < 0 || i >= ROWS || j < 0 || j >= COLS) continue; c = table[i][j]; sprintf(plaintext + strlen(plaintext), "%c", c); } } int main() { char plaintext[] = "HELLO WORLD"; char ciphertext[100] = ""; char decrypted[100] = ""; polybius_encrypt(plaintext, ciphertext); printf("Plaintext: %s\n", plaintext); printf("Ciphertext: %s\n", ciphertext); polybius_decrypt(ciphertext, decrypted); printf("Decrypted: %s\n", decrypted); return 0; } ``` 这个程序实现了Polybius加密和解密,可以将明文加密为密文,也可以将密文解密为明文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值