維吉尼亞密碼c++/vs2008
// 維吉尼亞.cpp : 定義控制檯應用程序的入口點。
#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#pragma warning(disable : 4996)
#define N 1000
void MString(char a[],char b[]);
void KString(char d[],char e[]);
int main() {
char a[N],b[N],d[N],e[N];
char choice; //定義的明文,密鑰,明文的字符數組//
int i,j,q;
do{ //設置選擇菜單//
printf(" 維吉尼亞密碼\n ");
printf("*************************************************\n");
printf("1.Encrypt\n");
printf("2.Decrypt\n");
printf("0.退出\n");
printf("*************************************************\n");
printf("請輸入以~2或者~2開頭的字符串,0爲退出");
scanf("%s",&choice);
switch(choice) {
case '1':
printf("請輸入明文,密鑰:\n");
getchar();
gets(a);
j=1;
for(i=0;i<(int)strlen(a);i++) {
if(('A'<=a[i]&&a[i]<='Z')||('a'<=a[i]&&a[i]<='z')||(a[i]==32))
{ j=j+2; //排除輸入密文和密鑰中的非法字符//
}else{
j=0;
printf("輸入錯誤");
break;
}
}
gets(b);
for(i=0;i<(int)strlen(b);i++) {
if(('A'<=b[i]&&b[i]<='Z')||('a'<=b[i]&&b[i]<='z')||(b[i]==32)){
j=j+2;
}else{
j=0;
printf("輸入錯誤");
break;
}
}
if(j!=1)
{
MString(a,b);
}
break;
case '2':
printf("請輸入密文,密鑰:\n");
getchar();
gets(d);
q=1;
for(i=0;i<(int)strlen(d);i++) {
if(('A'<=d[i]&&d[i]<='Z')||('a'<=d[i]&&d[i]<='z')||(d[i]==32))
{ q=q+2; //排除輸入密文和密鑰中的非法字符//
}else{
q=0;
printf("輸入錯誤");
break;
}
}
gets(e);
for(i=0;i<(int)strlen(e);i++) {
if(('A'<=e[i]&&e[i]<='Z')||('a'<=e[i]&&e[i]<='z')||(e[i]==32))
{ q=q+2; //排除輸入密文和密鑰中的非法字符//
}else{
q=0;
printf("輸入錯誤");
break;
}
}
if(q!=1)
{
KString(d,e);
}
break;
case '0':
printf("退出\n");
break;
}
}while(choice!='0'||'1'||'2');
printf("請重新輸入: ");
}
//加密函數//
void MString(char a[],char b[]) {
char c[N];
char str[53]= {'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','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','\0'}; //定義字符串數組從a~zA-Z依次排序//
int i,m,n,r;
int lena=(int)strlen(a);
int lenb=(int)strlen(b);
int i2=0;
printf("密文:");
for(i=0; i<lena; i++) {
if(a[i]==32){
c[i]=32;
}else{
if(b[i2%lenb]>='a'&&b[i2%lenb]<='z') {
n=b[i2%lenb]-97;
}
if(b[i2%lenb]>='A'&&b[i2%lenb]<='Z') {
n=b[i2%lenb]-65;
}
if(a[i]>='a'&&a[i]<='z') {
m=a[i]-97;
r=(m+n)%26;
}
if(a[i]>='A'&&a[i]<='Z') {
m=a[i]-65;
r=(m+n)%26+26;
}
i2++;
c[i]=str[r];
}
printf("%c",c[i]);
//清空密鑰數組防止下一次運行用到本次密鑰//
}
}
//解密函數//
void KString(char d[],char e[]) {
int i,m1,n1,r1;
char str[53]= {'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','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','\0'}; //定義字符串數組從a~z依次排序//
char f[N];
int lend=(int)strlen(d);
int lene=(int)strlen(e);
int i2=0;
printf("明文:");
for(i=0; i<lend; i++) {
if(d[i]==32){
f[i]=32;
}else {
if(e[i2%lene]>='a'&&e[i2%lene]<='z') {
n1=e[i2%lene]-97;
}
if(e[i2%lene]>='A'&&e[i2%lene]<='Z') {
n1=e[i2%lene]-65;
}
if(d[i]>='a'&&d[i]<='z') {
m1=d[i]-97;
r1=(m1+26-n1)%26;
}
if(d[i]>='A'&&d[i]<='Z') {
m1=d[i]-65;
r1=(m1+26-n1)%26+26;
}
i2++;
f[i]=str[r1];
}
printf("%c",f[i]);
//清空密鑰數組防止下一次運行用到本次密鑰//
}
}
來自17網工魏淑芬+楊森