修改程序以加密大写和小写输入

时间:2015-02-02 15:29:01

标签: c++ encryption random shuffle alphabet

我必须为随机密码问题编写代码。我已经完成了,但程序只将大写或小写(取决于我选择的)字母转换为输入。我应该改变什么,以便程序转换大写和小写字母?

代码:

   srand(time(0));     //seed for rand()
static char alphabet[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
string alph="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const int LENGTH=sizeof(alphabet)-1;     

int r;
char temp;
for (unsigned int i=0; i<LENGTH; i++)   //loop which shuffles the array
{
    r=rand() % LENGTH;  
    temp=alphabet[i];         
    alphabet[i] = alphabet[r];  
    alphabet[r]=temp;   
}

string text;
getline (cin, text);
for (unsigned int i=0; i<text.length(); i++)     //loop to encrypt
{
    if (isalpha(text[i]))
    {
        text[i]=alphabet[text[i] - 'A'];    //index alphabet with the value of text[i], adjusted to be in the range 0-25

    }
}

2 个答案:

答案 0 :(得分:1)

编辑:添加完整代码(也用于解密此替换密码)

添加小写字母的第二个字母并在同一个循环中修改它,该循环会混洗第一个字母的数组,如:

temp=alphabet_of_lowerCase[i];         
alphabet_of_lowerCase[i] = alphabet_of_lowerCase[r];  
alphabet_of_lowerCase[r]=temp; 

现在在您的加密方案中,只检查符号是小写还是大写字母,islowerisupper函数,并在isalpha内相应使用必需的字母数组,如果分支:

if (islower()) {
   text[i]= alphabet_of_lowerCase[text[i] - 'a'];
}
else
   // your previous code

完整代码:

static char alphabet[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static char text[] = "TEST";

void shuffleAlphabet() {

    srand(time(0));     //seed for rand()

    const int LENGTH = sizeof(alphabet)-1;

    int r;
    char temp;
    for (unsigned int i=0; i<LENGTH; i++)   //loop which shuffles the array
    {
        r=rand() % LENGTH;
        temp=alphabet[i];
        alphabet[i] = alphabet[r];
        alphabet[r]=temp;
    }

}

void cipher(int decrypt) {

    for (unsigned int i=0; i<strlen(text); i++)     //loop to encrypt
    {
        if (isalpha(text[i]))
        {
            if (!decrypt)
                text[i]=alphabet[text[i] - 'A'];    //index alphabet with the value of text[i], adjusted to be in the range 0-25
            else {
                int charPos = strchr(alphabet, text[i]) - alphabet; // calculate character position in cipher alphabet
                text[i]='A' + charPos; // and advance forward in standard alphabet by this position
            }
        }
    }

}

int main()
{
    printf("Text: %s\n", text);
    shuffleAlphabet();
    printf("Cipher alphabet: %s\n", alphabet);
    cipher(0);
    printf("Encrypted: %s\n", text);
    cipher(1);
    printf("Decrypted: %s\n", text);

    return 0;
}

因此,一般来说,您只需知道用于解密加密文本的密码字母。实际上你甚至不必知道密码字母表 解码加密文本,因为您可以使用frequency analysis来破解几乎所有替换密码(包括XOR加密)。 除非...替换密码中使用的密钥长度与原始文本的大小相同,并且始终是随机的 - 在这种情况下,我们将获得牢不可破的one-time pad

答案 1 :(得分:0)

您可以使用std::transform()算法函数,使用lambda返回大写或小写字符转换。

#include <algorithm>
#include <cctype>
#include <string>
//...
std::string text;
//...
std::transform(text.begin(), text.end(), text.begin(), [](char c) 
  { return isupper(c)?tolower(c):toupper(c); });

直播示例:http://ideone.com/PJmc1b

由于某种原因,std::transform函数名为transform,以上是一个示例。我们取字符串,迭代它,然后转换&#34;每个字符从低到高(反之亦然)。 lambda函数是应用于字符串中每个字符的规则。