Небольшой вопрос про RSA

Vasya156

Несколько вопросов про сам алгоритм кодирования:
1) Почему здесь читают именно 31 элемент?
2) Потом записывают 32?
3) Зачем нужна строчка fwrite(&Size, 4, 1, cf); ?
Соответствующие строчки подкреплены комментариями. (Здесь используется проект BigInt для работы с большими целыми числами).
 
int FileSize(char * fn)
{
    FILE * f = fopen(fn, "r");
    int d;
    int size = 0;
    while (!feof(f size += fread(&d, 1, 4, f);
    fclose(f);
    return size;
}
int main
{
    char
    char sn[256]="text";
    char cn[256]="text.rsa";
    char un[256]="text.dec";
    
    int Size = FileSize(sn);
    
    FILE * sf = fopen(sn, "r");
    FILE * cf = fopen(cn, "w+");
    fwrite(&Size, 4, 1, cf); // почему это нужно?
    
    // crypting...
    while (!feof(sf
    {
unsigned char Data[31]; //Почему именно 31?
fread(Data, 1, 31, sf); //Почему здесь читаю 31 элемент?
BigInt R(0);
BigInt Base(256);
for (int i = 0; i < 31; i++)
{
    BigInt digit(Data[i]);
    R += (digit * Base.power(i;
}
BigInt x = R;
BigInt y = (x.powerMod(e, m) % m);
unsigned char CryptedData[32] ;
for (int i = 0; i < 32; i++)
{
    CryptedData[i] = (y%Base);
    y /= Base;
}
fwrite(CryptedData, 1, 32, cf); //Почему здесь записывают 32, а не 31 ?
    }
    fclose(sf);
    fclose(cf);
    
    // uncrypting...
    cf = fopen(cn, "r"); FILE * uf = fopen(un, "w+");
    
    fread(&Size, 4, 1, cf);
    while (!feof(cf
    {
unsigned char CryptedData [32] ;
 fread(CryptedData, 1, 32, cf);
BigInt R(0);
BigInt Base(256);
for (int i = 0; i < 32; i++)
{
    BigInt digit(CryptedData[i]);
    R += (digit * Base.power(i;
}
BigInt x = R;
BigInt y = (x.powerMod(d, m) % m);
unsigned char UncryptedData[31];
for (int i = 0; i < 31; i++)
{
    UncryptedData[i] = (y%Base);
    y /= Base;
}
fwrite(UncryptedData, 1, 31, uf);
    }
    fclose(cf);
    fclose(uf);
    truncate(un, Size); //смысл это строчки?
 
    return 0;
}

Hastya

Напиши авторам кода, делов-то?

artimon

Я конечно нифига не знаю ни Си ни RSA, но, IMHO, очевидно, что из 31 байта данных получается 32 байта зашифрованных данных и что перед всем этим счастьем зачем-то записывается объём шифруемых данных.
А при дешифровке данные обезаются до нужного размера, что б в конце не было мусора.
Дисклаймер: Я Си не знаю и прогу читал по диагонали.

alexkravchuk

int FileSize(char * fn)
{
FILE * f = fopen(fn, "r");
int d;
int size = 0;
while (!feof(f size += fread(&d, 1, 4, f);
fclose(f);
return size;
}
Забей. Код, который использует подобную функцию для того, чтобы узнать длину файла, не может быть прямым
Реально дело в том, что тебе нужно считать число, меньшее по модулю чем n (и n не есть степень двойки, а число вида pq преобразовать его, а затем сохранить в файле. Поэтому они берут число, заведомо меньшее n, 31 байт, но после преобразования оно может быть уже больше, чем 31 байт, хотя меньше, чем n. Поэтому и сохраняют в 32 байта.
А вообще, сам такой подход неправильный, это скорее демонстрационный пример. Нормальные системы используют двухуровневые системы, когда через RSA шифруется случайный ключ для симметричного алгоритма.
Оставить комментарий
Имя или ник:
Комментарий: