#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.
Полезные ссылки:
- Что такое CipherSaber? https://en.wikipedia.org/wiki/CipherSaber
- Официальный сайт CipherSaber: http://ciphersaber.gurus.org /
- Некоторые репозитории, использующие этот алгоритм: https://github.com/search ?q= ciphersaberamp;ref=opensearch
Комментарии:
1. Этот код не компилируется.
2. Где? Для меня действительно компилируется :/
Ответ №1:
Взглянув на вашу реализацию, я вижу, что зашифрованные данные находятся в шестнадцатеричном формате, и вы не конвертируете их обратно. Кроме того, не смешивайте unsigned char
с char
.