Etual 发表于 2011-3-14 22:59:51

今天想了一种使用随机数进行加密的算法,分享一下

代码很简单,可以随便找个编译器尝试一下。思路很简单,两个通讯端互相维护自己的一个私钥 key,
发送方先将这个 key 对一个随机数进行加密,得到密文,同时一个密文又是对数据进行加密的钥匙!
接收方接收到这个数据后先用该钥匙对数据进行还原,然后再还原出随机数。
我觉得
1,算法很简单,只是纯粹的异或运算,速度很快。
2,随机数很容易得到,随便找个计数器的计数值在某一时刻都是随机的。(请不要在这里拍砖,没意义....)
3,密文每次都不同,但是解密后得到相同的数据,这个满足了加密解密的基本要求。由于每次发送的密文数据都不同,实现了真正的滚动码

进一步加大强度。考虑一个问题,如果密文通过无线传送,在空中被人家截取了,人家在还原出一个一模一样的密文,那么接收端也认为是正确的
这样做就没意义了。
我考虑到,如果这样的话,我可以将那个随机数用一个时间戳来代替,也就是说,随机数用当前的时间来代替,由于时间是流逝的,而且有先后顺序。
例如
随机数取 2230 表示 22分30秒。接收端解密后得到 2230,于是它知道了这个时间有一次成功的加密。记录下来。
然后第二次发送,则选用 2231,22分31秒,解密后得到2231,因为这个时间比刚才那个要迟,所以认为是正确的。
相反,如果有人截取了再发送一个包含了 2230 信息的包过来,虽然正常解密,但是因为随机数已经被用过一次,过期了,所以也认为这个包是非法的。

我个人觉得这种办法来处理加密,非常的简单实用。

不知道这是不是已经有相关的理论,反正是我今天突然想出来的,觉得可行,所以分享一下。 :-)


// 随机数加密算法
// Etual2011-3-14

#include <stdio.h>

// 7byte 数据 和 1byte key
unsigned char code_buf = {0x12,0x13,0x14,0x15,0x21,0x22,0x23,0x00};
void print_buf(void)
{
    int i;
    for (i=0;i<8;i++)
    {
      printf("%x,",code_buf);
    }
    printf("\n");
}

int main(void)
{
    unsigned char key,new_key;
    unsigned char rand_digi;
    int i;

    printf("original buf is!\n");
    print_buf();

    // key 是一个私钥,两个通讯之间各自拥有
    key = 0x55;
    // rand_digi 是一个随机数
    rand_digi = 0xe3;
    // 用私钥对随机数加密得到密文作为新的key使用
    new_key = key ^ rand_digi;

    // 用这个新的key对数据进行加密
    for (i=0;i<7;i++)
    {
      code_buf ^= new_key;
    }
    // 这个key伴随着数据一起传送出去
    code_buf = new_key;

    printf("encrypted buf is!\n");
    print_buf();

    // 假设接收端正确接收到这个已经加密了的8字节数据
    printf("now decode:\n");
    // 因为最后一个字节是key,用这个对前面的数据进行解密
    for (i=0;i<7;i++)
    {
      code_buf ^= code_buf;
    }
    // 最后一个本身也是加密了的,用私钥进行还原可以得到随机数
    code_buf ^= key;

    print_buf();


    return 0;
}

zxq6 发表于 2011-3-14 23:12:20

关注,最近有个项目应用了2个cpu,可以试试。

jiaweijing 发表于 2011-3-14 23:20:51

关注

cjr82123 发表于 2011-3-14 23:27:56

MARK

dianzidog 发表于 2011-3-14 23:52:35

看了一遍,觉得这个方法有缺陷。加密的安全性依赖算法了,但算法却是简单异或。
只要你的密文前6个字节数据比较有规律,有解密经验的人一眼就可以看出来,0x00^任意数 = 任意数 0xff^任意数 = ~任意数

一个高安全性的加密方案,应该算法无明显漏洞,安全性依赖密钥长度。换句话来说,只能靠猜密码才能破_解。

chenchuan 发表于 2011-3-15 07:35:14

嗯,简单确实很简单,我来随便探讨一下
这个算法的核心是每次用一个随机数附加加密,这样即使是相同的明文也可以加密出不同的密文,
另外也可以考虑用时间戳或者顺序号做这个随机数,这样还有一定的防仿造功能

目前比较正统的一个观点是加密不依赖于算法的保密还是依赖密钥,这个4楼上也说了
异或算法如果密钥很长,随机性很好,是一个很好的加密算法,你现在用单字节或者几字节的时间戳、顺序号来做密钥,
加密强度太低,很容易用统计分析来解密得到你的密钥
如果你加长密钥,那么密钥的生成、发放、管理又是巨大的问题
现实中异或算法要就是用来加密很不重要的数据,要就是用来加密极其重要的数据,
但是绝大多数人加密并不用异或算法

你想要做的事情,其实随便一个分组加密算法都可以做到

luzhengmao 发表于 2011-3-15 08:01:40

分组加密   才是正道。

这些学科都已经不是随便拍脑袋就可以有个big gold等着你的。

有空学习1下 应用密码学把。

zhouxinjie1 发表于 2011-3-15 08:33:09

不管国产SM1算法,还是AES最主要的还是人,人要是没有了保密意识要算法是没用的。

Etual 发表于 2011-3-15 08:48:32

呵呵,先感谢一下 4 楼 和 5楼的指导 :-)

正如上面所说的,我的目标只是简单加密,比完全裸露数据要好,而且使用台系IC实现的,用过都知道那资源多匮乏,
实现AES算法是不多可能的,所以才想个简单容易,能起一定的作用。
加密不重要的数据是可以,加密重要数据就不要了。
呵呵,班门弄斧了,楼下继续探讨~~

ssaweee 发表于 2011-3-15 08:59:07

回复【8楼】Etual
-----------------------------------------------------------------------

那你可以在两边用同一个随机数种子。

fnems 发表于 2011-3-15 10:03:28

回复【8楼】Etual
-----------------------------------------------------------------------

流密码建议用RC4,分组密码可以用TEA或者XTEA

都是经过长期讨论的,安全度比较高的标准加密方法,
而且算法比较简单,占用资源少,在8位单片机上也很容易实现

Etual 发表于 2011-3-15 15:41:49

好的,感谢大家! 我再去学习一下加密。

jackielau 发表于 2011-3-15 15:55:32

我用XTEA的,在89C82,mega64上,只是比较耗时,大数据量不方便

huhuan521 发表于 2012-4-10 19:09:03

mark了,不错!

淡淡的心事 发表于 2012-5-30 14:17:57

mark了,不错!

xiatianzhang 发表于 2012-7-23 10:14:52

xiatianzhang 发表于 2012-7-23 10:16:53

Etual 发表于 2012-7-23 10:38:32

回 17 楼,代码确实是搞错了。你是对的。
(我奇怪我博客上面的文章没有搞错啊 ..... 奇怪....)// 随机数加密算法,原理很简单 A^B = C , A^C =B , B^C = A
// Etual 2011-3-14




#include <stdio.h>

// 7byte 数据 和 1byte key

unsigned char code_buf = {0x12,0x13,0x14,0x15,0x21,0x22,0x23,0x00};
void print_buf(void)
{
    int i;
    for (i=0;i<8;i++)
    {
      printf("%x,",code_buf);
    }
    printf("\n");
}

int main(void)
{
    unsigned char key,new_key;
    unsigned char rand_digi;
    int i;

    printf("original buf is!\n");
    print_buf();

    // key 是一个私钥,两个通讯之间各自拥有

    key = 0x55;
    // rand_digi 是一个随机数

    rand_digi = 0xe3;
    // 用私钥对随机数加密得到密文作为新的key使用

    new_key = key ^ rand_digi;

    // 用这个新的key对数据进行加密

    for (i=0;i<7;i++)
    {
      code_buf ^= new_key;
    }
    // 这个key伴随着数据一起传送出去

    code_buf = new_key;

    printf("encrypted buf is!\n");
    print_buf();

    // 假设接收端正确接收到这个已经加密了的8字节数据

    printf("now decode:\n");
    // 因为最后一个字节是key,用这个对前面的数据进行解密

    for (i=0;i<7;i++)
    {
      code_buf ^= code_buf;
    }
    // 最后一个本身也是加密了的,用私钥进行还原可以得到随机数

    code_buf ^= key;

    print_buf();


    return 0;
}

maxims 发表于 2012-7-23 10:50:45

这个。。。。

好像某些游戏的实体key,或者类似QQ安全管家的手机软件,就是这么工作的

chenfzg 发表于 2012-7-23 17:27:40

嗯嗯,值得好好研究                     

woaigongda 发表于 2012-8-8 19:33:13

mark...........{:lol:}

younge 发表于 2012-8-8 21:26:13

哈哈,上传一个《应用密码学》

younge 发表于 2012-8-8 21:32:26

续上条

pkjapan 发表于 2012-11-3 12:50:44

不错,楼主乐于贡献,值得顶起,时间戳也不错

zhikai_wu 发表于 2012-11-3 13:20:33

想法不错,可以在这之上做些扩展

dulala 发表于 2017-11-3 23:49:50

学习一下,学校做作业用到了
页: [1]
查看完整版本: 今天想了一种使用随机数进行加密的算法,分享一下