博福特密码,是一种类似于维吉尼亚密码的替代密码,由弗朗西斯·蒲福(Francis Beaufort)发明。它最知名的应用是M-209密码机。博福特密码属于对等加密,即加密演算法与解密演算法相同 博福特密码是按mod q减法运算的一种周期代替密码。即 ci+td=δi(mi+td)≡(ki-mi+td)(mod q) 所以,它和维吉尼亚密码类似,以ki为密钥的代替表是密文字母表为英文字母表逆序排列进行循环右移ki+1次形成的。例如,若ki=(相当于字母D),则明文和密文的对应关系如下: 明文:a b c d e f g h i j k l m n o p q r s t u v w x y z 密文:D C B A Z Y X W V U T S R Q P O N M L K J I H G F E 显然,博福特密码的解密变换为 mi+td≡δi(ci+td)≡(ki-ci+td)(modq) 因此,博福特密码的解密变换与加密变换相同。按博福特密码,以密钥ki加密相当于按下式的维吉尼亚加密:ci+td≡[(q-)-mi+td](modq) 若按下式加密: ci+td≡(mi+td-ki)(modq) 就 得到变异的博福特密码,相应代替表示将明文字母表循环右移ki次而成。由于循环右移ki次等于循环左移(q-ki)次,即式ci+td≡(mi+td- ki)(modq)等价于以(q-ki)为密钥的维吉尼亚密码。所以维吉尼亚密码和变异的博福特密码互为逆变换,若一个是加密运算,则另一个就是解密运算。 博福特密码加密 #include #include #include void Encry() { ]; char ch,temp; ,j=; if(getchar()=='\n') temp=' '; printf("请输入密钥: "); gets(key); L=strlen(key); printf("输入明文: "); while((ch=getchar())!='\n') { if(ch==' ') { i++; continue; } printf(-(ch+)+key[j%L]+)&+'A'); j++; ) printf(" "); i++; } putchar(ch); } int main() { Encry(); ; } 博福特密码解密 #include #include #include void Decry() { ]; char ch,temp; ,j=; if(getchar()=='\n') temp=' '; printf("请输入密钥: "); gets(key); L=strlen(key); printf("输入密文: "); while((ch=getchar())!='\n') { if(ch==' ') { i++; continue; } printf(-ch)&+); j++; ) printf(" "); i++; } putchar(ch); } int main() { Decry(); ; }