标题:根据密码表进行数据加密/解密的代码(纯C书写)
取消只看楼主
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
结帖率:100%
 问题点数:0 回复次数:4 
根据密码表进行数据加密/解密的代码(纯C书写)
根据密码表进行数据加密/解密的代码(纯C书写):

/* 数据加密, 解密程序 by Flying Blue 081130 */
/* 这个程序是为我的游戏进行数据加密用的, 现在我把它开源 */
/* 理论上来说, 这个程序可以在任何编译器上编译 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/* 求区间在[mmin, mmax]的随机数 */
int random(int mmin, int mmax)
{
    return rand() % (mmax - mmin + 1) + mmin;
}

/* 交换两个值 */
void _swap(unsigned char* arr, int i1, int i2)
{
    unsigned char tmp = arr[i1];
    arr[i1] = arr[i2];
    arr[i2] = tmp;
}

/* 随机生成编码表 */
void cipher_GenEncTable(unsigned char strTable[0x100])
{
    int i, n1, n2;

    /* 初始化随机数种子 */
    srand(time(0));

    /* 先生成一张按顺序的ASCII码表 */
    for(i = 0; i < 0x100; i++)
        strTable[i] = i;

    /* 再随机交换其中的两个值 */
    for(i = 0; i < 0x100; i++)
    {
        n1 = random(0, 0xFF);

        /* 防止生成的 n1 == n2 如果他们相等了那就没意义了 */
        while(n1 == (n2 = random(0, 0xFF)));

        /* 交换第n1个和第n2个值 */
        _swap(strTable, n1, n2);
    }
}

/* 根据编码表得到其解码表 */
void cipher_EncToDecTable(const unsigned char strEncTable[0x100], unsigned char strDecTable[0x100])
{
    int i;
    for(i = 0; i < 0x100; i++)
    {
        strDecTable[strEncTable[i]] = i;
    }
}

/* 打印出表内数据 */
void cipher_PrintTable(unsigned char strTable[0x100])
{
    int i, j, count;
    count = 0;

    printf("unsigned char Table[] = \n{\n");
    for(i = 0; i < 0x10; i++)
    {
        printf("\t");
        for(j = 0; j < 0x10; j++)
        {
            printf("0x%02X, ", strTable[count]);
            count++;
        }
        printf("\n");
    }
    printf("};\n");
}

/*
 * 根据给的表的不同进行数据编码(解码)
 * 其实, 编码表和解码表的意义是相同的,
 * 编码表可以用来解码, 解码表可以用来编码,
 * 只是叫法不同而已.
 */

void cipher_Coding(const unsigned char *src, unsigned char *dst, int len, const unsigned char strTable[0x100])
{
    int i;
    for(i = 0; i < len; i++)
    {
        dst[i] = strTable[src[i]];
    }
}

void main()
{
    unsigned char tblEnc[0x100], tblDec[0x100];
    cipher_GenEncTable(tblEnc);                /* 生成编码表 */
    cipher_PrintTable(tblEnc);

    cipher_EncToDecTable(tblEnc, tblDec);    /* 根据编码表生成解码表 */
    cipher_PrintTable(tblDec);

    char *str = "你好你是谁?我也不知道";
    printf("原文: %s\n", str);

    char strdst[50] = {0};
    cipher_Coding((unsigned char*)str, (unsigned char*)strdst, 23, tblEnc);
    printf("密文: %s\n", strdst);

    cipher_Coding((unsigned char*)strdst, (unsigned char*)strdst, 23, tblDec);
    printf("明文: %s\n", strdst);

}
搜索更多相关主题的帖子: 密码 数据 解密 代码 书写 
2008-11-30 10:08
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:0 
嗯,我写代码有有一些习惯的,如遇到运算符后面一定要加空格

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-11-30 10:37
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:0 
我认为,好看的代码有利于自己的程序思路
否则谁愿意多打空格啊?

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-11-30 11:45
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:0 
楼上的你说错了吧
我这个代码就是在VC6和VC8下完全编译通过的。
你用的不是VC而是TC吧?

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-11-30 18:02
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:0 
即使出错也是小问题吧。如果你用VC6或VC8编译,我感保证绝对不会错。
如果你用的是其他编译器,就只要修改一点点代码就可以编译了。
我记得在TC下要先定义变量,你可以把这些定义自己放在前面。
jdh99说的问题我没遇到过,也没听说过。请问你用的真的是Visual C++ 6.0而非其他的吗?
按理说,凡是C++编译器都支持随便定义变量的。

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-12-02 22:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-246995-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.293600 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved