【C++代码实现】Vigenère密码算法

Vigenère密码描述:

在这里插入图片描述
在这里插入图片描述
可见,在Vigenère密码中,每个密钥K相当于长度为r的字母串。算法每次处 理r个明文字母,并重复使用密钥字母,直至所有的明文序列均被加密。


加密过程简单描述:

在这里插入图片描述

解密过程简单描述:

在这里插入图片描述
假设明文为 【ILOVEYOU】,密钥:【WHY】
对于密文为:【ESMRLWKB】
先转化为数字(这里下标从0开始数,为了编码方便)

I , L , O, V , E , Y , O , U 【W , H , Y】

8 ,11 , 14, 21, 4 ,24 ,14 ,20 【22,7,24】

加密过程为:
C1=(8+22) mod26 = 4 —>E
C2=(11+7) mod26 = 18—>S
C3=(14+24) mod26 = 12—>M
C4=(21+22) mod26 = 17—>R
C5=(4+7) mod26 = 11—>L
C6=(24+24) mod26 = 22—>W
C7=(14+22) mod26 = 10—>K
C8=(20+7) mod26 = 1—>B

对于解密过程就是如上述公式计算即可。


代码

#include<iostream>
#include<math.h>
#include<stdio.h>

using namespace std;

char alphabet[26]={'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'};
//int k[9]={7,0,15,15,24,19,8,12,4};
int k[3]={22,7,24};
int r=3;
char encode_vigenere(int a,int i){
    //cout<<a<<"  "<<k[i%r]<<" "<<(a + k[i%r] ) % 26<<endl;
    return alphabet[(a + k[i%r] ) % 26] ;
}
char decode_vigenere(int c,int i){
    // cout<<c<<"  "<<k[i%r]<<" "<<(c - k[i%r] ) % 26<<endl;
    return (alphabet[(c - k[i%r] ) % 26])>0?(alphabet[(c - k[i%r] ) % 26]):(alphabet[(c - k[i%r])%26 +26 ]) ;
}
int main(){
    char str[18]="ILOVEYOU";
    //char str[9]  ="FTNSMXLC";
               
    for(int i=0;i<8;i++){
        int tmp = (int)str[i] - 65;
        cout<<encode_vigenere(tmp,i);
    }
   
 
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值