Помогите с RC6
От: Srgteam  
Дата: 07.11.07 00:27
Оценка:
Люди добрые выручите пожалуйста, у кого есть реализация этого алгоритма на С++, желательно с функциями открытия файла, разбивки его по блокам ну и т. д...

Можно на Билдере, или Вижаке...

заранее, очень очень благодарен

07.11.07 12:25: Перенесено модератором из 'C/C++' — Кодт
Re: Помогите с RC6
От: Roman Odaisky Украина  
Дата: 07.11.07 08:36
Оценка:
Здравствуйте, Srgteam, Вы писали:

S>Люди добрые выручите пожалуйста, у кого есть реализация этого алгоритма на С++, желательно с функциями открытия файла, разбивки его по блокам ну и т. д...


Нельзя его реализовывать, запатентованный он (5724428 и 5835600 (США))

:-)
До последнего не верил в пирамиду Лебедева.
Re[2]: Помогите с RC6
От: Cyberax Марс  
Дата: 07.11.07 08:43
Оценка: +1 :)
Здравствуйте, Roman Odaisky, Вы писали:

S>>Люди добрые выручите пожалуйста, у кого есть реализация этого алгоритма на С++, желательно с функциями открытия файла, разбивки его по блокам ну и т. д...

RO>Нельзя его реализовывать, запатентованный он (5724428 и 5835600 (США))
RO>
В России и ЕС софтовые патенты не действуют. Так что надо просто предусмотреть для софта функцию самоуничтожения при попадании в США
Sapienti sat!
Re[3]: Помогите с RC6
От: Srgteam  
Дата: 08.11.07 03:33
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Roman Odaisky, Вы писали:


S>>>Люди добрые выручите пожалуйста, у кого есть реализация этого алгоритма на С++, желательно с функциями открытия файла, разбивки его по блокам ну и т. д...

RO>>Нельзя его реализовывать, запатентованный он (5724428 и 5835600 (США))
RO>>
C>В России и ЕС софтовые патенты не действуют. Так что надо просто предусмотреть для софта функцию самоуничтожения при попадании в США

Юмор оценил, а все-таки...

Может у кого-нибудь есть что-нибудь?
VHDL код, проект Для билдера ...ну хоть что-нибудь...диплом в конце месяца сдавать
Re[4]: Помогите с RC6
От: conraddk Россия  
Дата: 08.11.07 05:52
Оценка:
Здравствуйте, Srgteam, Вы писали:

S>>>>Люди добрые выручите пожалуйста, у кого есть реализация этого алгоритма на С++, желательно с функциями открытия файла, разбивки его по блокам ну и т. д...


S>Может у кого-нибудь есть что-нибудь?

S>VHDL код, проект Для билдера ...ну хоть что-нибудь...диплом в конце месяца сдавать

Эээ...
Первая ссылка — уже похоже на правду. Если заглянуть на вторую страницу, видим, что и Crypto++ содержит RC6.
Д.К. << RSDN@Home 1.2.0 alpha rev. 655>>
Все на свете должно происходить медленно и неправильно...
Re: Помогите с RC6
От: CreatorCray  
Дата: 08.11.07 11:29
Оценка:
Здравствуйте, Srgteam, Вы писали:

S>Люди добрые выручите пожалуйста, у кого есть реализация этого алгоритма на С++, желательно с функциями открытия файла, разбивки его по блокам ну и т. д...


S>Можно на Билдере, или Вижаке...


S>заранее, очень очень благодарен


//////////////////////////////////////////////////////////////////////////
// RSA RC6 symmetric cipher. RC6-32/20/x
// Block size: 128 bits = 4 DWORDs
// Key sizes: 32*x bits = x DWORDs, x > 0

class RC6
{
public:
    RC6(bool isCBCmode = true)        {Init(isCBCmode);}
    RC6(const RC6 &other)            {InitFrom(other);}
    ~RC6();

    bool isCBC            ()            {return m_isCBCmode;}

    void Init            (bool isCBCmode);
    void InitFrom        (const RC6 &other);

    // Bits: 32*x
    bool SetKey            (const void *key, DWORD nBits);
    // Block = 16 bytes
    void EncryptBlock    (const void *_input, void *_output);
    void DecryptBlock    (const void *_input, void *_output);

private:

    DWORD    m_CBC[4];        // previous round results for cipher block chaining
    bool    m_isCBCmode;
    DWORD    m_sTable[44];
};

#define RC6_MAGIC_INIT        (0xb7e15163)
#define RC6_MAGIC_INCR        (0x9e3779b9)

void RC6::InitFrom (const RC6 &other)
{
    memcpy (m_CBC, other.m_CBC, sizeof(m_CBC));
    m_isCBCmode = other.m_isCBCmode;

    memcpy (m_sTable,other.m_sTable,sizeof(m_sTable));
}

void RC6::Init (bool isCBCmode)
{
    m_isCBCmode = isCBCmode;
    memset(m_sTable,0,sizeof (m_sTable));
    memset(m_CBC,0,sizeof (m_CBC));
}

RC6::~RC6()
{
    memset(m_CBC,0,sizeof (m_CBC));
    memset(m_sTable,0,sizeof (m_sTable));
}

bool RC6::SetKey (const void *key, DWORD keySize)
{
    if ((!keySize) || (keySize & 31))
        return false;

    keySize >>= 5;
    memset(m_CBC,0,sizeof (m_CBC));

    // Fill sTable with initial value
    m_sTable[0] = RC6_MAGIC_INIT;
    for(int i = 0; i < 43; i++)
        m_sTable[i+1] = m_sTable[i] + RC6_MAGIC_INCR;

    DWORD A,B, mixRounds;

    // Create key copy, 'cause we will change it
    DWORD *keyCopy = new DWORD[keySize];
    memcpy(keyCopy,key,keySize*sizeof (DWORD));

    A = B = 0;
    mixRounds = 3 * max (44, keySize);

    // Mixin' key with sTable
    for (i = 0; i != mixRounds; i++)
    {
        int org = i % 44;
        A = m_sTable[org] = _rotl(m_sTable[org] + A + B, 3);
        org = i % keySize;
        B = keyCopy[org] = _rotl(keyCopy[org] + A + B, A+B);
    }

    // Cleanup
    memset(keyCopy,0,keySize*sizeof (DWORD));
    delete [] keyCopy;
    return true;
}

void RC6::EncryptBlock(const void *_input, void *_output)
{
    DWORD A,B,C,D,T,U;
    const DWORD *input = (const DWORD *)_input;
    DWORD *output = (DWORD *)_output;

    A = input[0];
    B = input[1];
    C = input[2];
    D = input[3];

    if (m_isCBCmode)
    {
        A ^= m_CBC[0];
        B ^= m_CBC[1];
        C ^= m_CBC[2];
        D ^= m_CBC[3];
    }

    B += m_sTable[0];
    D += m_sTable[1];

#define RC6_ENCODE(a,b,c,d,rnd)                            \
        T = _rotl (b * (2*b + 1), 5);                    \
        U = _rotl (d * (2*d + 1), 5);                    \
        a = _rotl (a ^ T, U) + m_sTable[(rnd+1)*2];        \
        c = _rotl (c ^ U, T) + m_sTable[(rnd+1)*2+1];    \

    RC6_ENCODE(A,B,C,D,0)
    RC6_ENCODE(B,C,D,A,1)
    RC6_ENCODE(C,D,A,B,2)
    RC6_ENCODE(D,A,B,C,3)
    RC6_ENCODE(A,B,C,D,4)
    RC6_ENCODE(B,C,D,A,5)
    RC6_ENCODE(C,D,A,B,6)
    RC6_ENCODE(D,A,B,C,7)
    RC6_ENCODE(A,B,C,D,8)
    RC6_ENCODE(B,C,D,A,9)
    RC6_ENCODE(C,D,A,B,10)
    RC6_ENCODE(D,A,B,C,11)
    RC6_ENCODE(A,B,C,D,12)
    RC6_ENCODE(B,C,D,A,13)
    RC6_ENCODE(C,D,A,B,14)
    RC6_ENCODE(D,A,B,C,15)
    RC6_ENCODE(A,B,C,D,16)
    RC6_ENCODE(B,C,D,A,17)
    RC6_ENCODE(C,D,A,B,18)
    RC6_ENCODE(D,A,B,C,19)

    A += m_sTable[42];
    C += m_sTable[43];

    output[0] = A;
    output[1] = B;
    output[2] = C;
    output[3] = D;

    if (m_isCBCmode)
        memcpy (m_CBC,output,sizeof (m_CBC));
}

void RC6::DecryptBlock (const void *_input, void *_output)
{
    DWORD A,B,C,D,T,U;
    const DWORD *input = (const DWORD *)_input;
    DWORD *output = (DWORD *)_output;
    DWORD backCBC[4];

    A = input[0];
    B = input[1];
    C = input[2];
    D = input[3];

    if (m_isCBCmode)
        memcpy (backCBC,_input,sizeof (backCBC));

    C -= m_sTable[43];
    A -= m_sTable[42];

#define RC6_DECODE(a,b,c,d,rnd)                            \
        U = _rotl (d * (2*d + 1), 5);                    \
        T = _rotl (b * (2*b + 1), 5);                    \
        c = _rotr (c - m_sTable[(rnd+1)*2+1], T) ^ U;    \
        a = _rotr (a - m_sTable[(rnd+1)*2], U) ^ T;

    RC6_DECODE(D,A,B,C,19)
    RC6_DECODE(C,D,A,B,18)
    RC6_DECODE(B,C,D,A,17)
    RC6_DECODE(A,B,C,D,16)
    RC6_DECODE(D,A,B,C,15)
    RC6_DECODE(C,D,A,B,14)
    RC6_DECODE(B,C,D,A,13)
    RC6_DECODE(A,B,C,D,12)
    RC6_DECODE(D,A,B,C,11)
    RC6_DECODE(C,D,A,B,10)
    RC6_DECODE(B,C,D,A,9)
    RC6_DECODE(A,B,C,D,8)
    RC6_DECODE(D,A,B,C,7)
    RC6_DECODE(C,D,A,B,6)
    RC6_DECODE(B,C,D,A,5)
    RC6_DECODE(A,B,C,D,4)
    RC6_DECODE(D,A,B,C,3)
    RC6_DECODE(C,D,A,B,2)
    RC6_DECODE(B,C,D,A,1)
    RC6_DECODE(A,B,C,D,0)

    D -= m_sTable[1];
    B -= m_sTable[0];

    if (m_isCBCmode)
    {
        A ^= m_CBC[0];
        B ^= m_CBC[1];
        C ^= m_CBC[2];
        D ^= m_CBC[3];

        memcpy(m_CBC,backCBC,sizeof (backCBC));
    }

    output[0] = A;
    output[1] = B;
    output[2] = C;
    output[3] = D;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.