码迷,mamicode.com
首页 > 其他好文 > 详细

Beaufort密码

时间:2016-03-19 12:46:33      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:

博福特密码,是一种类似于维吉尼亚密码的替代密码,由弗朗西斯·蒲福(Francis Beaufort)发明。它最知名的应用是M-209密码机。博福特密码属于对等加密,即加密演算法与解密演算法相同

博福特密码是按mod q减法运算的一种周期代替密码。即 ci+td=δi(mi+td)≡(ki-mi+td)(mod q)
所以,它和维吉尼亚密码类似,以ki为密钥的代替表是密文字母表为英文字母表逆序排列进行循环右移ki+1次形成的。例如,若ki=3(相当于字母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-1)-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 key[100];
    char ch,temp;
    int L,i=0,j=0;
    if(getchar()==\n)
        temp= ;
    printf("请输入密钥: ");
    gets(key);
    L=strlen(key);
   
    printf("输入明文: ");

    while((ch=getchar())!=\n)
    {
        if(ch== )
        {
            i++;
            continue;
        }

        printf("%c",(25-(ch+97)+key[j%L]+97)&+A);   
        j++;
        if(j%L==0)
            printf(" ");
        i++;
    }
    putchar(ch);
}

int main()
{
    Encry();
    return 0;
}


博福特密码解密


#include
#include
#include

void Decry()
{
    char key[100];
    char ch,temp;
    int L,i=0,j=0;
    if(getchar()==\n)
        temp= ;
    printf("请输入密钥: ");
    gets(key);
    L=strlen(key);
   
    printf("输入密文: ");

    while((ch=getchar())!=\n)
    {
        if(ch== )
        {
            i++;
            continue;
        }
        printf("%c",(key[j%L]+25-ch)&+97);   
        j++;
        if(j%L==0)
            printf(" ");
        i++;
    }
    putchar(ch);
}


int main()
{
    Decry();
    return 0;
}

 

Beaufort密码

标签:

原文地址:http://www.cnblogs.com/test404/p/5294668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!