Алгоритм дешифрования Ciphersaber на C

#c #string #algorithm #encryption #char

#c #строка #алгоритм #шифрование #символ

Вопрос:

Я пытаюсь завершить алгоритм дешифрования Ciphersaber с помощью C . Я никогда не делал ничего, связанного с шифрованием или дешифрованием, поэтому я немного потерялся. Алгоритм основан на RC4.

После нескольких попыток я, наконец, получил некоторый код, который, похоже, работает, но вообще не показывает правильный результат ввода. Вот почему я делаю этот вызов. Кто-нибудь, знакомый с этим типом алгоритмов дешифрования, может сказать мне, что я делаю не так?

Я очень ценю вашу помощь! Спасибо. Спросите меня о любых сомнениях.

 #include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <vector>
#include <fstream>

using namespace std;

struct Parameters {
    std::string EncryptedData;
    std::string EncryptionKey;
    int InitialVectorLength;
    int KeyLoopIterations;
    
    void LoadParameters() {
        EncryptedData = "6f 6d 0b ab f3 aa 67 19 03 15 30 ed b6 77 ca 74 e0 08 9d d0 e7 b8 85 43 56 bb 14 48 e3 7c db ef e7 f3 a8 4f 4f 5f b3 fd";
        EncryptionKey = "asdfg";
        InitialVectorLength = 10;
        KeyLoopIterations = 1;
    };
};

void RC4(int n, int r, char* k, int l, unsigned char* keystream) {
    unsigned char S [256] = { };
    for(int i=0; i<256; i  ) {
        S[i]=i;
    }  

    int j=0;
    for(int ri=0; ri<r; ri  ) {
        for(int i=0; i<256; i  ) {
            j = (j   S[i]   k[i%l]) % 256;
            swap(S[i], S[j]);
        }
    }

    j=0;
    int ip;
    for(int i=0; i<n; i  ) {
        ip = (i 1) % 256;
        j = (j S[ip]) % 256;
        swap(S[ip], S[j]);
        keystream[i] = S[(S[ip] S[j]) % 256];
    }
};

void Decrypt(std::string m, int iv_length, std::string k, int r) {
    int n = m.length()   iv_length;
    unsigned char output[1024];

    char iv [iv_length];
    for(int i=0; i<iv_length; i  ) {
        iv[i] = m[i];
    }   

    char msg_no_iv [n-iv_length];
    for(int k=0; k<n-iv_length; k  ) {
        msg_no_iv[k]=m[k iv_length];
    }  

    char kp[k.length() iv_length];
    for(unsigned int i=0; i<k.length(); i  ) {
        kp[i] = k[i];
    }

    for(unsigned int i=k.length(); i<k.length() iv_length; i  ) {
        kp[i] = iv[i-k.length()];
    }

    unsigned char keystream [256];
    RC4(n, r, kp, k.length() iv_length, keystream);  

    for(int i=0; i<n-iv_length; i  ) { 
        output[i] = msg_no_iv[i] ^ keystream[i];
    }
    
    cout << output;
};

int main()
{
    Parameters params;
    params.LoadParameters();
    
    Decrypt(params.EncryptedData, params.InitialVectorLength, params.EncryptionKey, params.KeyLoopIterations);
    
    return 0;
};
 

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

 This is a test of CipherSaber.
 

Полезные ссылки:

Комментарии:

1. Этот код не компилируется.

2. Где? Для меня действительно компилируется :/

Ответ №1:

Взглянув на вашу реализацию, я вижу, что зашифрованные данные находятся в шестнадцатеричном формате, и вы не конвертируете их обратно. Кроме того, не смешивайте unsigned char с char .