首页
社区
课程
招聘
请帮忙分析我的程序用的是什么算法,主要原理,希望详细一些
发表于: 2004-5-22 22:09 2268

请帮忙分析我的程序用的是什么算法,主要原理,希望详细一些

2004-5-22 22:09
2268
各位大侠,我有段加密解密程序如下,vc++6.0编写,请帮忙分析一下原理和主要算法,谢了先
#include "stdafx.h"
#include "Crypt.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCrypt

CCrypt::CCrypt()
        :
        m_LFSR_A( 0x13579BDF ),
        m_LFSR_B( 0x2468ACE0 ),
        m_LFSR_C( 0xFDB97531 ),

        m_Mask_A( 0x80000062 ),
        m_Mask_B( 0x40000020 ),
        m_Mask_C( 0x10000002 ),

        m_Rot0_A( 0x7FFFFFFF ),
        m_Rot0_B( 0x3FFFFFFF ),
        m_Rot0_C( 0x0FFFFFFF ),
        m_Rot1_A( 0x80000000 ),
        m_Rot1_B( 0xC0000000 ),
        m_Rot1_C( 0xF0000000 )
{
        m_csKey = _T("");
}

// Everything is on the frame.
CCrypt::~CCrypt()
{
}

/////////////////////////////////////////////////////////////////////////////
// CCrypt operations

void CCrypt::SetKey(LPCTSTR csKey)
{
        CString csSeed;

        m_csKey = csKey;

        if (m_csKey.IsEmpty())
        {
                csSeed = "\x43\xC8\x21\xD3\xF4\xB3\x10\x27\x09\xAA\x18\x56";
        }
        else
        {
                csSeed = m_csKey;
        }

        int nIdx = 0;

        for (nIdx = 0; csSeed.GetLength() < 12; nIdx++)
        {
                csSeed += csSeed[nIdx];
        }

        for (nIdx = 0; nIdx < 4; nIdx++)
        {
                m_LFSR_A = ((m_LFSR_A <<= 8) |
                                        ((unsigned long int) csSeed[nIdx + 0]));

                m_LFSR_B = (( m_LFSR_B <<= 8) |
                                        ((unsigned long int) csSeed[nIdx + 4]));

                m_LFSR_C = (( m_LFSR_C <<= 8) |
                                        ((unsigned long int) csSeed[nIdx + 8]));
        }

        if (0x00000000 == m_LFSR_A)
                m_LFSR_A = 0x13579BDF;

        if (0x00000000 == m_LFSR_B)
                m_LFSR_B = 0x2468ACE0;

        if (0x00000000 == m_LFSR_C)
                m_LFSR_C = 0xFDB97531;
}

void CCrypt::GetKey(CString& csKey)
{
        csKey = m_csKey;
}

void CCrypt::TransformChar(unsigned char& csTarget)
{
        int                                        Counter        = 0;
        unsigned char                Crypto        = '\0';
        unsigned long int        Out_B        = (m_LFSR_B & 0x00000001);
        unsigned long int        Out_C        = (m_LFSR_C & 0x00000001);

        for (Counter = 0; Counter < 8; Counter++)
        {
                if (m_LFSR_A & 0x00000001)
                {
                        m_LFSR_A = (((m_LFSR_A ^ m_Mask_A) >> 1) | m_Rot1_A);
                       
                        if ( m_LFSR_B & 0x00000001 )
                        {
                                m_LFSR_B = (((m_LFSR_B ^ m_Mask_B) >> 1) | m_Rot1_B);

                                Out_B = 0x00000001;
                        }
                        else
                        {
                                m_LFSR_B = (( m_LFSR_B >> 1) & m_Rot0_B);

                                Out_B = 0x00000000;
                        }
                }
                else
                {
                        m_LFSR_A = (( m_LFSR_A >> 1) & m_Rot0_A);

                        if ( m_LFSR_C & 0x00000001 )
                        {
                                m_LFSR_C = ((( m_LFSR_C ^ m_Mask_C) >> 1) | m_Rot1_C);
                                Out_C = 0x00000001;
                        }
                        else
                        {
                                m_LFSR_C = ((m_LFSR_C >> 1) & m_Rot0_C);
                               
                                Out_C = 0x00000000;
                        }
                       
                }

                #pragma warning(disable : 4244)

                Crypto = ((Crypto << 1) | (Out_B ^ Out_C));

                #pragma warning(default : 4244)

        }

        #pragma warning(disable : 4244)

        csTarget = ( csTarget ^ Crypto );

        if (csTarget == NULL)
          csTarget = ( csTarget ^ Crypto );

        #pragma warning( default : 4244 )
}

void CCrypt::TransformString(LPCTSTR csKey, CString& csTarget)
{
        SetKey(csKey);

        int nLen = csTarget.GetLength();

        #pragma warning(disable : 4244)

        for (int nPos = 0; nPos < nLen; nPos++)
        {
                unsigned char cBuff = csTarget.GetAt(nPos);
                TransformChar((unsigned char&) cBuff);
                csTarget.SetAt(nPos, cBuff);
        }

        #pragma warning(default : 4244)
}

CString CCrypt::StrToHex(LPCTSTR strStr)
{
        CString strRet;
        for(UINT i = 0; i < strlen(strStr); i++)
        {
                CString strTmp;
                strTmp.Format("%02X",(BYTE)strStr[i]);
                strRet += strTmp;
        }
        return strRet;
}

CString CCrypt::HexToStr(LPCTSTR strHex)
{
        UINT uLen = strlen(strHex);
        if(uLen % 2 != 0)
                return "";

        CString strRet;
        for(UINT i = 0; i < uLen; i = i + 2)
        {
                char cTmp = (strHex[i] - ((strHex[i] >= 'A') ? ('A' - 10) : '0')) * 16 + (strHex[i + 1] - ((strHex[i + 1] >= 'A') ? ('A' - 10) : '0'));
                strRet += cTmp;
        }
        return strRet;
}

void CCrypt::Encode(LPCTSTR csKey, CString& csTarget)
{
        TransformString(csKey,csTarget);

        csTarget = StrToHex(csTarget);
}

void CCrypt::Decode(LPCTSTR csKey, CString& csTarget)
{
        csTarget = HexToStr(csTarget);

        TransformString(csKey,csTarget);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (7)
雪    币: 295
活跃值: (461)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
好长呀,实在是没有心情读完,有时间,我仔细侃侃!
2004-5-23 10:31
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
无外乎先用密钥初始化移位寄存器的初始状态,然后密钥同时控制移位寄存器的步进,依此类推。程序中嘞瑟忑多,其实ANSI C只需要十行不到。
2004-5-24 10:07
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
先谢了,等了两天,你是第一个帮忙分析的人,能不能说得再详细些,比如初始化几个寄存器,如何控制移位步进,再次感谢
2004-5-24 11:58
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
#if !defined(AFX_CCrypt_H__66035FB9_8319_11D2_85E6_004005FFF9AF__INCLUDED_)
#define AFX_CCrypt_H__66035FB9_8319_11D2_85E6_004005FFF9AF__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// CCrypt.h : header file

//字符串简单加密解密

class CCrypt
{
// Construction
public:
        CCrypt();

// Attributes
public:

// Operations
public:
        virtual void TransformString(LPCTSTR csKey, CString& csTarget);

        void Encode(LPCTSTR csKey, CString & csTarget);
        void Decode(LPCTSTR csKey, CString & csTarget);
protected:
        virtual void SetKey(LPCTSTR csKey);
        virtual void GetKey(CString& csKey);
        virtual void TransformChar(unsigned char& csTarget);

        CString StrToHex(LPCTSTR strStr);
        CString HexToStr(LPCTSTR strHex);

// Implementation
public:
        virtual ~CCrypt();

// Attributes
protected:

        CString m_csKey;

    unsigned long           m_LFSR_A;
    unsigned long           m_LFSR_B;
    unsigned long           m_LFSR_C;
    const unsigned long     m_Mask_A;
    const unsigned long     m_Mask_B;
    const unsigned long     m_Mask_C;
    const unsigned long     m_Rot0_A;
    const unsigned long     m_Rot0_B;
    const unsigned long     m_Rot0_C;
    const unsigned long     m_Rot1_A;
    const unsigned long     m_Rot1_B;
    const unsigned long     m_Rot1_C;

};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CCrypt_H__66035FB9_8319_11D2_85E6_004005FFF9AF__INCLUDED_)
2004-5-24 12:49
0
雪    币: 220
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
密钥取前12byte,分为3组,分别作为m_LFSR_A、m_LFSR_B、m_LFSR_C的初始值,
然后对明文按byte进行变换,最后对变换后的秘文以16进址输出;
2004-5-24 18:56
0
雪    币: 223
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哎 一头雾水
2004-5-25 16:44
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
老楼,如移存器知识无,看C语言有一般功底分析清楚流程没问题,最后画出框图,除非找漏洞,否则没必要弄清楚
2004-5-28 15:34
0
游客
登录 | 注册 方可回帖
返回
//