gpt4 book ai didi

c - 在 C 中解码密文时出现大小问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:46:32 24 4
gpt4 key购买 nike

[编辑]

这是需要解码的密文:

bURCUE}__V|UBBQVT

我的解码器可以成功获取密文,但可以将其转换为某个点。编码消息的其余部分是乱码。我检查了缓冲区的大小和字符指针,似乎都是正确的,我找不到错误

我希望看到的消息:

SecretLongMessage

屏幕上的解密消息如下所示:

SecretLong|drs`fe

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUZZ_SIZE 1024


char* encryptDecrypt(const char* toEncrypt, int length)
{
char key[] = "1011011011";
char* output = malloc(length + 1);
output[length] = '\0'; //buffer

for (int i = 0; i < length; i++)
{
output[i] = toEncrypt[i] ^ key[i % (sizeof(key)/sizeof(char))];
}
return output;
}

int main(int argc, char* argv[])
{
char buff[BUZZ_SIZE];
FILE *f;
f = fopen("C:\\Users\\Dell\\source\\repos\\XOR\\XOR\\bin\\Debug\\cipher.txt", "r"); // read mode
fgets(buff, BUZZ_SIZE, f);
printf("Ciphered text: %s, size = %d\n", buff,sizeof(buff));
fclose(f);

char* sourceString = buff;

//Decrypt
size_t size = strlen(sourceString);

char* decrypted = encryptDecrypt(buff, size);
//printf("\nsize = %d\n",size);
printf("\nDecrypted is: ");
printf(decrypted);
// Free the allocated buffers

return 0;
}

这是我给出密码的 C# 代码

String szEncryptionKey = "1011011011";
public Form1()
{
InitializeComponent();
}
string EncryptOrDecrypt(string text, string key)
{
var result = new StringBuilder();

for (int c = 0; c < text.Length; c++)
{
// take next character from string
char character = text[c];

// cast to a uint
uint charCode = (uint)character;

// figure out which character to take from the key
int keyPosition = c % key.Length; // use modulo to "wrap round"

// take the key character
char keyChar = key[keyPosition];

// cast it to a uint also
uint keyCode = (uint)keyChar;

// perform XOR on the two character codes
uint combinedCode = charCode ^ keyCode;

// cast back to a char
char combinedChar = (char)combinedCode;

// add to the result
result.Append(combinedChar);
}

return result.ToString();
}


private void Button1_Click(object sender, EventArgs e)
{
String str = textBox1.Text;

var cipher = EncryptOrDecrypt(str, szEncryptionKey);
System.IO.File.WriteAllText(@"C:\\Users\\Dell\\source\\repos\\XOR\\XOR\\bin\\Debug\\cipher.txt", cipher);

}

最佳答案

你想使用来自

的所有字符
char key[] = "1011011011";

用于加密。但是数组 key 包含一个终止符 '\0',当您使用

时,它会包含在计算中
key[i % (sizeof(key)/sizeof(char))]

因为 sizeof(key) 包含终止符 '\0'

您可以使用 strlen 来计算字符串长度或使用 key[i % (sizeof(key)/sizeof(char))-1] 或初始化数组为

char key[] = {'1', '0', '1', '1', '0', '1', '1', '0', '1', '1' };

省略终止符 '\0'。在后一种情况下,您可以使用 sizeof 来计算原始代码中的键索引

在将 C# 代码添加到问题后,很明显加密在 key 中不包含 '\0'key.Length 相当于 C 中的 strlen(key),而不是 sizeof(key)

顺便说一句:C# 中的变量名 String szEncryptionKey = "1011011011"; 具有误导性,因为它不是 C 中的零终止字符串。

注意:strlen(key) 在您的情况下与 sizeof(key)-1 相同,因为您没有指定数组大小并将数组初始化为一个字符串。在其他情况下可能不一样。

关于c - 在 C 中解码密文时出现大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57359889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com