//原先的加密方法太简单,给其加码,原始key中单个字母重复次数使其在key数组补全后与另一个字母进行换位,每个字母重复次数累计值如为奇数,key数组顺时针移动该累计值的位数,偶数为逆时针
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char *my_fgets(char *p,int n);
int prepare_key(char *key);
void encrypt_key(char *data,char *key);
void decrypt_key(char *data,char *key);
int main(){
char key_origin[27]={0};
char alphabet[27]={0};
char key[27]={0};
char str[27]={0};
for(char i=0;i+'A'<='Z';*(alphabet+i)=i+'A',i++);
fputs("Input the origin key:->",stdout);
if(my_fgets(key_origin,27)){
strcpy(key,key_origin);
prepare_key(key);
}
else
for(char i=0;i+'A'<='Z';*(key+i)=i+'A',i++);
for(fputs("Input the str:->\n",stdout);my_fgets(str,27)&&*str;fputs("Input the str:->\n",stdout)){
encrypt_key(str,key);
printf("The alphabet is:\n%s\n",alphabet);
printf("The key is:\n%s\n",key);
printf("The str after encrypted:\n%s\n",str);
decrypt_key(str,key);
printf("The str after decrypted:\n%s\n",str);
}
fputs("OVER\n",stdout);
return 0;}
//
char *my_fgets(char *p,int n){
char ch=0,*input=NULL,*found=NULL;
if(input=fgets(p,n,stdin))
if(found=strchr(input,10))
*found=0;
else
while((ch=getchar())!=EOF&&ch!=10);
return input;}
int prepare_key(char *key){
if(!key) return 0;
for(char *ptemp=key;*ptemp;*ptemp=toupper(*ptemp),ptemp++)
if(!isalpha(*ptemp))
return 0;
char str_add[27]={0};
int sum_add=0;
for(int i=0;*(key+i);i++){
for(int j=i;*(key+j);j++){
if(i!=j&&*(key+i)==*(key+j)){
for(int k=j;*(key+k);*(key+k)=*(key+k+1),k++);//key数组重复位覆盖
(*(str_add+i))++;
j--;
}
}
}
for(char *key_rear=key+strlen(key),character='A';character<='Z';character++){//key数组补全
for(char *key_temp=key;*key_temp;key_temp++){
if(character==*key_temp)
character++;
}
*key_rear=character;
*++key_rear=0;
}
for(int i=0;*(key+i);i++){//根据字母重复的次数对该字母进行换位
if(*(str_add+i)){
int temp=*(key+i);
*(key+i)=*(key+26-(i+*(str_add+i))%26);
*(key+26-(i+*(str_add+i))%26)=temp;
sum_add+=*(str_add+i);
}
}
if((sum_add%=26)%2){//如重复次数和为奇数,顺时针移动
char str_temp[27]={0};
strcpy(str_temp,key+26-sum_add);
strncat(str_temp,key,26-sum_add);
strcpy(key,str_temp);
}
else{//如重复次数和为偶数,逆时针移动
char str_temp[27]={0};
strcpy(str_temp,key+sum_add);
strncat(str_temp,key,sum_add);
strcpy(key,str_temp);
}
return 1;}
void encrypt_key(char *data,char *key){
for(;*data;data++){
if(islower(*data))
*data=tolower(*(key+(*data-'a')));
else if(isupper(*data))
*data=*(key+(*data-'A'));
}
}
void decrypt_key(char *data,char *key){
char alphabet[27]={0};
for(char i=0;i+'A'<='Z';*(alphabet+i)=i+'A',i++);
for(;*data;data++){
if(islower(*data)){
for(int i=0;*(key+i);i++){
if(toupper(*data)==*(key+i)){
*data=tolower(*(alphabet+i));
break;//不要漏了break
}
}
}
else if(isupper(*data)){
for(int i=0;*(key+i);i++){
if(*data==*(key+i)){
*data=*(alphabet+i);
break;
}
}
}
}
}
9.14.14-PointersOnC-20220303
于 2022-03-03 21:57:52 首次发布