修改程序以加密大写和小写输入
Modify program to encrypt both uppercase and lowercase input
我必须为随机密码问题编写代码。我已经做到了,但是程序只转换大写或小写(取决于我选择的)字母作为输入。我应该更改什么才能使程序同时转换大写和小写字母?
代码:
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
}
}
编辑:添加了完整代码(也用于解密此替代密码)
添加小写字符的第二个字母表并在同一个循环中修改它,该循环打乱第一个字母表的数组,例如:
temp=alphabet_of_lowerCase[i];
alphabet_of_lowerCase[i] = alphabet_of_lowerCase[r];
alphabet_of_lowerCase[r]=temp;
现在在你的加密方案中只需检查符号是小写字母还是大写字母 islower
is isupper
函数并在 isalpha
中相应地使用所需的字母数组 if branch:
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.
可以使用std::transform()
算法函数,用lambda表示returns大写或小写字符转换。
#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); });
std::transform
函数被命名为transform
是有原因的,以上是一个例子。我们获取字符串,遍历它,"transform" 每个字符从低到高(反之亦然)。 lambda 函数是应用于字符串中每个字符的规则。
我必须为随机密码问题编写代码。我已经做到了,但是程序只转换大写或小写(取决于我选择的)字母作为输入。我应该更改什么才能使程序同时转换大写和小写字母?
代码:
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
}
}
编辑:添加了完整代码(也用于解密此替代密码)
添加小写字符的第二个字母表并在同一个循环中修改它,该循环打乱第一个字母表的数组,例如:
temp=alphabet_of_lowerCase[i];
alphabet_of_lowerCase[i] = alphabet_of_lowerCase[r];
alphabet_of_lowerCase[r]=temp;
现在在你的加密方案中只需检查符号是小写字母还是大写字母 islower
is isupper
函数并在 isalpha
中相应地使用所需的字母数组 if branch:
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.
可以使用std::transform()
算法函数,用lambda表示returns大写或小写字符转换。
#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); });
std::transform
函数被命名为transform
是有原因的,以上是一个例子。我们获取字符串,遍历它,"transform" 每个字符从低到高(反之亦然)。 lambda 函数是应用于字符串中每个字符的规则。