[EDIT]

Ini adalah teks sandi yang perlu didekodekan:

bURCUE}__V|UBBQVT

Saya memiliki dekoder yang berhasil mengambil teks tersandi tetapi mengonversinya ke beberapa titik. Sisa dari pesan yang disandikan adalah omong kosong. Saya memeriksa ukuran buffer dan pointer char, keduanya tampak benar, saya tidak dapat menemukan kekurangannya

Pesan yang saya harapkan untuk dilihat:

RahasiaPanjangPesan

Pesan yang didekripsi di layar terlihat seperti ini:

RahasiaPanjang|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;
}

Ini kode C# saya yang memberikan cipher

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);

        }
0
Deniz 5 Agustus 2019, 16:43

1 menjawab

Jawaban Terbaik

Anda ingin menggunakan semua karakter dari

char key[] = "1011011011";

Untuk enkripsi Anda. Tetapi larik key menyertakan '\0' terminasi yang disertakan dalam perhitungan saat Anda menggunakan

key[i % (sizeof(key)/sizeof(char))]

Karena sizeof(key) menyertakan penghentian '\0'.

Anda bisa menggunakan strlen untuk menghitung panjang string atau menggunakan key[i % (sizeof(key)/sizeof(char))-1] atau menginisialisasi array sebagai

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

Untuk menghilangkan '\0' yang mengakhiri. Dalam kasus terakhir, Anda dapat menggunakan sizeof untuk menghitung indeks kunci seperti dalam kode asli Anda

Setelah kode C# ditambahkan ke pertanyaan, jelas bahwa enkripsi tidak menyertakan '\0' dalam kuncinya. key.Length sebanding dengan strlen(key) di C, bukan sizeof(key).

BTW: Nama variabel String szEncryptionKey = "1011011011"; di C# menyesatkan karena ini bukan string yang diakhiri nol seperti di C.

Catatan: strlen(key) sama dengan sizeof(key)-1 dalam kasus Anda karena Anda tidak menentukan ukuran larik dan menginisialisasi larik ke string. Mungkin tidak sama dalam kasus lain.

3
Bodo 5 Agustus 2019, 14:43