A代码转换--“简单异或”加密算法

A代码转换--“简单异或”加密算法

时间: 1ms        内存:128M

描述:

注:本题只需要提交标记为填充部分之间的代码,请按照C++方式提交。

简单异或密码(simple XOR cipher)是密码学中一种简单的加密算法。其加密原理为,将要加密的字符变量ptext和密码字符变量code进行异或(^)运算得到密文字符变量 ctext ,即 ctext = ptext^code。对应的解密原理为,将获得的密文字符变量 ctext与密码字符变量code进行异或(^)运算得到原密文字符变量ptext 即 ptext = ctext^code。(其加密和解密过程相同)
例如:对于明文串"ABCDE"和密码串"C++", 进行逐字符加密,得到密文的ASCII序列: 2(字符A的ASCII^字符C的ASCII) ,105(字符B的ASCII^字符+的ASCII),104(字符C的ASCII^字符+的ASCII),7(字符D的ASCII^字符C的ASCII) ,110(字符E的ASCII^字符+的ASCII)。
其实现的C代码如下:
#include<string.h>
#include<stdio.h>
int main()
{
    char plaintext[100]="ABCDE";
    char code[100]="C++";
    char ciphertext[100]="";
    int len1,len2,i,j;
    len1=strlen(plaintext);
    len2=strlen(code);
    for(i=j=0; i<len1; i++,j=(j+1)%len2)
    {
        ciphertext[i]=plaintext[i]^code[j];  //加密
        printf("%d ",ciphertext[i]);//输出密文对应的ASCII
    }
    for(i=j=0; i<len1; i++,j=(j+1)%len2)
    {
        plaintext[i]=ciphertext[i]^code[j];  //解密
    }
    printf("\n");
    puts(plaintext);
    return 0;
}

//请重新设计密码类 XORcipher 实现与上述C代码等价的C++代码,自己包含需要的头文件
/*************************
  在此处补充你的代码

class  XORcipher { 
   void encode(......);
};

**************************/

//主函数给定如下:不需要提交

int main()
{
    char plaintext[100]="";
    char code[100]="";
    char ciphertext[100]="";
    cin>> plaintext >>code; //输入明文和加密串
    int len1,len2;
    len1=strlen(plaintext);
    len2=strlen(code);
    XORcipher va;
    va.encode(plaintext,len1,code,len2,ciphertext);  //加密
    int i;
    for(i=0; i<len1; i++)
        cout<<(int)ciphertext[i]<<" "; //输出密文对应的ASCII
    va.encode(ciphertext,len1,code,len2,plaintext); //解密
    cout<<endl<<plaintext<<endl;  //输出明文
    return 0;
}

输入:

明文串和密码串

输出:

第一行 密文对应的ASCII
第二行 原来的明文串

示例输入:

ABCDE
C++

示例输出:

2 105 104 7 110 
ABCDE

提示:

参考答案(内存最优[1092]):

#include<string.h>
#include<stdio.h>
int main()
{
    char c[100],b[100];
    scanf("%s%s",c,b);
    int m=strlen(c);
    int n=strlen(b);
    int k=0;
    for(int i=0;i<m;i++,k++)
    {
        if(k==n)k=0;
        c[i]^=b[k];
    }
    for(int i=0;i<m;i++)
        printf("%d ",c[i]);
        printf("\n");
    for(int i=0,k=0;i<m;i++,k++)
    {
        if(k==n)k=0;
        c[i]^=b[k];
    }
    for(int i=0;i<m;i++)
        printf("%c",c[i]);
    return 0;
}

参考答案(时间最优[0]):

#include <iostream>
#include <string.h>
using namespace std;

//请重新设计密码类 XORcipher 实现与上述C代码等价的C++代码,自己包含需要的头文件
//在此处补充你的代码

class  XORcipher { 
public:
   void encode(char plaintext[],char code[],char ciphertext[])
   {
		int p1=0,p2=0;
		int len1=strlen(plaintext);
		int len2=strlen(code);
		while(p1<len1){
			ciphertext[p1] = plaintext[p1] ^ code[p2];
			p1++,p2++;
			if(p2==len2)
				p2=0;
		}
		ciphertext[p1]='\0';
   }
};

int main()
{
    char plaintext[100]="";
    char code[100]="";
    char ciphertext[100]="";  	
    cin>> plaintext >>code; //�������ĺͼ��ܴ�
    XORcipher va;
    va.encode(plaintext,code,ciphertext);  //����	
    int i,len=strlen(ciphertext);
    for(i=0;i<len;i++)
        cout<<(int)ciphertext[i]<<" "; //������Ķ�Ӧ��ASCII
    va.encode(ciphertext,code,plaintext); //����  	
    cout<<endl<<plaintext<<endl;  //�������
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注