| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4843 人关注过本帖, 2 人收藏
标题:根据密码表进行数据加密/解密的代码(纯C书写)
只看楼主 加入收藏
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
结帖率:100%
收藏(2)
 问题点数:0 回复次数:19 
根据密码表进行数据加密/解密的代码(纯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
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
好漂亮的代码

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-11-30 10:34
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
嗯,我写代码有有一些习惯的,如遇到运算符后面一定要加空格

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-11-30 10:37
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
偶先前遇到运算符也打个空格  后来感觉太烦了  就没坚持了
不过这样写出来确实很好看

[[it] 本帖最后由 liyanhong 于 2008-11-30 10:48 编辑 [/it]]

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-11-30 10:46
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
我认为,好看的代码有利于自己的程序思路
否则谁愿意多打空格啊?

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-11-30 11:45
jdh99
Rank: 2
来 自:南师大
等 级:论坛游民
威 望:1
帖 子:59
专家分:15
注 册:2008-11-7
收藏
得分:0 
很好,学习了。
不过在VC6下主函数中的定义语句应该在普通语句前面,否则编译不能通过:
main()
{
    unsigned char tblEnc[0x100], tblDec[0x100];
    char strdst[50] = {0};
    char *str = "你好你是谁?我也不知道";
    cipher_GenEncTable(tblEnc);                /* 生成编码表 */
    cipher_PrintTable(tblEnc);

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

    printf("原文: %s\n", str);

    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 13:55
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
楼上的你说错了吧
我这个代码就是在VC6和VC8下完全编译通过的。
你用的不是VC而是TC吧?

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-11-30 18:02
jdh99
Rank: 2
来 自:南师大
等 级:论坛游民
威 望:1
帖 子:59
专家分:15
注 册:2008-11-7
收藏
得分:0 
我的是VC6,如果定义语句在一般语句下就无法通过编译了

作鲲鹏,遨游于天地沧海
2008-11-30 18:41
jotn26
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-3-1
收藏
得分:0 
学习  帮顶
2008-12-01 12:55
luoxiaohua27
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2008-11-17
收藏
得分:0 
怎么运行不了?出错哈,请高手指点!这个程序不错,只是可惜。。。
2008-12-01 13:10
快速回复:根据密码表进行数据加密/解密的代码(纯C书写)
数据加载中...
 
   



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

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