我一直在写一个非常小的C程序,我遇到了很多问题。通过我可以找到的所有堆栈溢出文章来看,但没有取得太大的成功。该程序假设对纯文本字符串使用非常简单的异或“加密”。输入字符串和键都是6个字符长。我是C和指针的新手。我认为我没有掌握一些语言的基础知识。在C函数中返回char数组
#include <stdio.h>
#include <string.h>
#define LENGTH 7
#define KEY "secret"
char * encryptDecrypt(char *plaintext);
int main(int argc, char **argv)
{
if(argc > 1)
{
char *plainText = argv[1];
printf("Encrypting plaintext: %s (%i)\n", plainText, strlen(plainText));
char *cipherText = encryptDecrypt(plainText);
printf("Encrypted: %s (%i)\n", cipherText, strlen(cipherText));
char *decryptedText = encryptDecrypt(cipherText);
printf("Decrypted: %s (%i)\n", decryptedText, strlen(decryptedText));
}
return 0;
}
char * encryptDecrypt(char *text)
{
char result[LENGTH];
for (int i = 0; i < LENGTH-1; i++)
{
result[i] = (char)(text[i]^KEY[i]);
}
char *resultPtr = &result;
return resultPtr;
}
用Arg “foobar的” 输出运行程序:
加密明文:foobar的(6)
加密:╠╠╠╠╠╠╠╠T¨(19)
解密的:╠╠╠╠╠╠╠╠T¨(19)
问题:
- 打印指向结果数组的指针在encryptDecrypt函数中使用并返回后,会有所不同
- 在密文上使用XOR不会将其还原为原始纯文本(尽管因为无论我的' m打印错误,这部分可能没有问题)
- 加密/解密文本的字符串长度是19个字符长吗?如果原始字符串是6个字符,这怎么可能?
'char result [LENGTH]; ... char * resultPtr =&result;返回resultPtr;'。不可以。您不能返回本地变量的地址。这是未定义的行为。 –
[指向本地变量的指针]的可能重复(http://stackoverflow.com/questions/4570366/pointer-to-local-variable) – 2501
安全注意事项:1)在使用它们后清理纯文本缓冲区memset(decryptedText ,0,its_size)'2)使用'strdup()'复制plaint文本数据是针对#1的一个问题。最好只在处理纯文本数据时使用自己的代码,而不是在内存中放置它的潜在副本。 – chux