我必须编写一个函数来加密使用给定加密密钥作为字符串输入给出的消息。该函数应将加密的消息作为字符串输出到参数列表中的encryptedMessage。函数原型必须如下所示:void encryptMessage(char *encryptedMessage, char *message, char *encryptionKey);
该函数必须使用加密密钥并将其表示十六进制数字的每个字符转换为等效的十进制值作为整数。我已经编写了一个转换hex2decimal的函数。然后必须通过将第一个整数值添加到消息中第一个字符的ASCII值,并将第二个整数值添加到消息中的第二个字符来加密消息,依此类推,然后重新开始每16个之后的第一个整数值。如果消息长于加密密钥,则通常是这种情况,这是必要的。
这是我目前的一些代码:
void encryptMessage(char *encryptedMessage, char *message, char *encryptionKey)
{
int *arr = malloc(sizeof(int)*getStringLength(encryptionKey));
int i;
for(i = 0;i < getStringLength(encryptionKey);i++){
arr[i] = hexDigit2Dec(encryptionKey[i]);
message[i] = message[i] + (char)arr[i];
if(getStringLength(message ) > getStringLength(encryptionKey)){
i = 0;
}
}
free(arr);
}
当我运行它时,“project.exe已停止”弹出。请帮助我,我是C的新人并且经常挣扎。
答案 0 :(得分:1)
您需要2个计数器:一个用于加密密钥位置,另一个用于正在处理的字符。
当消息长于导致无限循环的密钥时,您正在使用一个并将其重置为零
for ( keyPos = 0, msgPos = 0; msgPos < getStringLength(message ); ++keyPos, ++msgPos )
{
// calculate and append next char to encrypted message here
if ( keyPos >= getStringLength(encryptionKey)
{
keyPos = 0;
}
}
答案 1 :(得分:0)
你必须先学会做一些计划并考虑你需要做什么......我会尝试一步一步地给出 >在这里编码,希望你能看到你出错的地方。
但首先,有一个标准的C函数来获取字符串的长度:strlen()
。我会用这个。如果你有某些要求使用不同的东西,那就好了。
让我们从你给出的原型开始:
void encryptMessage(char *encryptedMessage, char *message, char *encryptionKey)
{
这有点模棱两可,但我猜 encryptedMessage
应该是输出。对于真实世界的项目,通过向其他指针添加const
来使其明确。但就目前而言,让我们忽略这一点。由于encryptedMessage
是一个参数,而不是返回值,我认为是调用者提供存储的责任。所以,继续......
你需要多次encryptionKey
的长度,让我们把它放在一个变量中:
size_t keyLen = strlen(encryptionKey);
然后你需要多次重复十六进制数字的整数值,所以让我们预先计算它们:
char *keyDigits = malloc(keyLen); // we only need char-sized integers here
for (int i = 0; i < keyLen; ++i)
{
keyDigits[i] = (char)hexDigit2Dec(encryptionKey[i]);
}
现在是主循环的时候了......你只需要取message
的每个字符并从keyDigits
添加一个值:
int keyPos = 0;
for (int i = 0; i < strlen(message); ++i)
{
encryptedMessage[i] = message[i] + keyDigits[keyPos];
if (++keyPos == keyLen) keyPos = 0;
}
就是这样......释放你的临时阵列,你就完成了。
free(keyDigits);
}