我一直在寫一個非常小的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