搜索
bottom↓
回复: 25

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

[复制链接]

出0入0汤圆

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

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

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

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


// 随机数加密算法
// Etual  2011-3-14

#include <stdio.h>

// 7byte 数据 和 1byte key
unsigned char code_buf[8] = {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[7] = 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[7];
    }
    // 最后一个本身也是加密了的,用私钥进行还原可以得到随机数
    code_buf[7] ^= key;

    print_buf();


    return 0;
}

出0入22汤圆

发表于 2011-3-14 23:12:20 | 显示全部楼层
关注,最近有个项目应用了2个cpu,可以试试。

出0入0汤圆

发表于 2011-3-14 23:20:51 | 显示全部楼层
关注

出0入0汤圆

发表于 2011-3-14 23:27:56 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-3-14 23:52:35 | 显示全部楼层
看了一遍,觉得这个方法有缺陷。加密的安全性依赖算法了,但算法却是简单异或。
只要你的密文前6个字节数据比较有规律,有解密经验的人一眼就可以看出来,0x00^任意数 = 任意数 0xff^任意数 = ~任意数

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

出0入0汤圆

发表于 2011-3-15 07:35:14 | 显示全部楼层
嗯,简单确实很简单,我来随便探讨一下
这个算法的核心是每次用一个随机数附加加密,这样即使是相同的明文也可以加密出不同的密文,
另外也可以考虑用时间戳或者顺序号做这个随机数,这样还有一定的防仿造功能

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

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

出0入0汤圆

发表于 2011-3-15 08:01:40 | 显示全部楼层
分组加密   才是正道。

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

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

出0入0汤圆

发表于 2011-3-15 08:33:09 | 显示全部楼层
不管国产SM1算法,还是AES最主要的还是人,人要是没有了保密意识要算法是没用的。

出0入0汤圆

 楼主| 发表于 2011-3-15 08:48:32 | 显示全部楼层
呵呵,先感谢一下 4 楼 和 5楼的指导 :-)

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

出0入0汤圆

发表于 2011-3-15 08:59:07 | 显示全部楼层
回复【8楼】Etual  
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-3-15 10:03:28 | 显示全部楼层
回复【8楼】Etual  
-----------------------------------------------------------------------

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

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

出0入0汤圆

 楼主| 发表于 2011-3-15 15:41:49 | 显示全部楼层
好的,感谢大家! 我再去学习一下加密。

出0入0汤圆

发表于 2011-3-15 15:55:32 | 显示全部楼层
我用XTEA的,在89C82,mega64上,只是比较耗时,大数据量不方便

出0入0汤圆

发表于 2012-4-10 19:09:03 | 显示全部楼层
mark了,不错!

出0入0汤圆

发表于 2012-5-30 14:17:57 | 显示全部楼层
mark了,不错!
头像被屏蔽

出0入0汤圆

发表于 2012-7-23 10:14:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2012-7-23 10:16:53 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2012-7-23 10:38:32 | 显示全部楼层
回 17 楼,代码确实是搞错了。你是对的。
(我奇怪我博客上面的文章没有搞错啊 ..... 奇怪....)
  1. // 随机数加密算法,原理很简单 A^B = C , A^C =B , B^C = A
  2. // Etual 2011-3-14




  3. #include <stdio.h>

  4. // 7byte 数据 和 1byte key

  5. unsigned char code_buf[8] = {0x12,0x13,0x14,0x15,0x21,0x22,0x23,0x00};
  6. void print_buf(void)
  7. {
  8.     int i;
  9.     for (i=0;i<8;i++)
  10.     {
  11.         printf("%x,",code_buf[i]);
  12.     }
  13.     printf("\n");
  14. }

  15. int main(void)
  16. {
  17.     unsigned char key,new_key;
  18.     unsigned char rand_digi;
  19.     int i;

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

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

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

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

  27.     new_key = key ^ rand_digi;

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

  29.     for (i=0;i<7;i++)
  30.     {
  31.         code_buf[i] ^= new_key;
  32.     }
  33.     // 这个key伴随着数据一起传送出去

  34.     code_buf[7] = new_key;

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

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

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

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

  45.     code_buf[7] ^= key;

  46.     print_buf();


  47.     return 0;
  48. }
复制代码

出0入0汤圆

发表于 2012-7-23 10:50:45 | 显示全部楼层
这个。。。。

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

出0入0汤圆

发表于 2012-7-23 17:27:40 来自手机 | 显示全部楼层
嗯嗯,值得好好研究                       

出0入0汤圆

发表于 2012-8-8 19:33:13 | 显示全部楼层
mark...........

出0入0汤圆

发表于 2012-8-8 21:26:13 | 显示全部楼层
哈哈,上传一个《应用密码学》

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-8-8 21:32:26 | 显示全部楼层
续上条

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-11-3 12:50:44 | 显示全部楼层
不错,楼主乐于贡献,值得顶起,时间戳也不错

出0入0汤圆

发表于 2012-11-3 13:20:33 | 显示全部楼层
想法不错,可以在这之上做些扩展

出0入0汤圆

发表于 2017-11-3 23:49:50 | 显示全部楼层
学习一下,学校做作业用到了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 16:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表