免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4562 | 回复: 19
打印 上一主题 下一主题

[算法] 一种新的加密算法?安全么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-14 15:47 |只看该作者 |倒序浏览
前一阵子,自己想了个较容易实现的算法,不知道可靠不可靠,特在此贴出来各位帮忙参考参考。
1)我想到3种简单的运算可以在字节的级别上可逆,他们是+,-,^,逆运算分别是-,+,^
2)对每一个字节假如是由一个数对其执行了一个运算,那么我们只要用同一个数对其执行逆运算就可以恢复了
3)用0表示'+',1表示'-',2表示'^'
4)加密开始时随机生成一个32byte密钥(也可以是(64,128....)
5)把该密钥转化成3进制的数组,每一个字节可以化为3进制表示的,固定长度为6位(3^5=243最接近255了),比如8表示为E{0,0,0,0,2,2},那么32字节的密钥可以
转化为长度为6*32=192的数组了
6)现在加密开始,输入一个串,该算法一个字节一个字节的加密,假如是第N个字节,那么可以通过N%32取得加密的操作数,同时通过N%192取得当前操作符(0或则1或则2)


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct tag_YCODEC
  5. {
  6.         unsigned char key[32];
  7.         char ops[192];

  8.         void (*encrypt)(struct tag_YCODEC *codec, unsigned char *bytes,int off,int len);
  9.     void (*decrypt)(struct tag_YCODEC *codec, unsigned char *bytes,int off,int len);

  10. }YCodec;

  11. static void YCodec_encrypt(YCodec *ycodec, unsigned char *bytes,int off,int len);
  12. static void YCodec_decrypt(YCodec *ycodec, unsigned char *bytes,int off,int len);

  13. static void Init_YCodec(YCodec *ycodec,unsigned char *theKey)
  14. {
  15.          int i;
  16.          //TODO make sure no buffer-overflow
  17.      memcpy(ycodec->key,theKey,32);
  18.          memset(ycodec->ops,0,192);
  19.          for(i=0;i<32;i++)
  20.          {
  21.                  int k=ycodec->key[i];
  22.                  int j=(i+1)*6;
  23.                  while(k>0)
  24.                  {
  25.                         ycodec->ops[--j]=k%3;
  26.                         k=(k-ycodec->ops[j])/3;
  27.                  }
  28.                  
  29.          }
  30.          ycodec->encrypt=&YCodec_encrypt;
  31.          ycodec->decrypt=&YCodec_decrypt;

  32. }

  33. static void YCodec_encrypt(YCodec *ycodec, unsigned char *bytes,int off,int len)
  34. {
  35.     int idx=off;
  36.         for(;idx<off+len;idx++)
  37.         {
  38.         if(ycodec->ops[idx%192]==0)//'+'
  39.                 {
  40.             bytes[idx]+=ycodec->key[idx%32];
  41.                 }
  42.                 else if(ycodec->ops[idx%192]==1)//'-'
  43.                 {
  44.                         bytes[idx]-=ycodec->key[idx%32];
  45.                 }
  46.                 else if(ycodec->ops[idx%192]==2)//'^'
  47.                 {
  48.                         bytes[idx]^=ycodec->key[idx%32];
  49.                 }
  50.                 else
  51.                 {
  52.                         //error
  53.                 }
  54.         }
  55. }
  56. static void YCodec_decrypt(YCodec *ycodec, unsigned char *bytes,int off,int len)
  57. {
  58.         int idx=off;
  59.         for(;idx<off+len;idx++)
  60.         {
  61.         if(ycodec->ops[idx%192]==0)//'-'
  62.                 {
  63.             bytes[idx]-=ycodec->key[idx%32];
  64.                 }
  65.                 else if(ycodec->ops[idx%192]==1)//'+'
  66.                 {
  67.                         bytes[idx]+=ycodec->key[idx%32];
  68.                 }
  69.                 else if(ycodec->ops[idx%192]==2)//'^'
  70.                 {
  71.                         bytes[idx]^=ycodec->key[idx%32];
  72.                 }
  73.                 else
  74.                 {
  75.                         //error
  76.                 }
  77.         }

  78. }

  79. int main(char *argv[],int argc)
  80. {

  81.         char key[]="01234567890123456789012345678901";
  82.         char text[]="hello, this is a test string ererrergfhfghgfffhfghfvvdfgsrtereretrtdddsdfghhjjkjklkkldfdfdfdfdfdf toooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......";
  83.         YCodec ycodec;
  84.         Init_YCodec(&ycodec,(unsigned char *)key);
  85.         ycodec.encrypt(&ycodec,(unsigned char *)text,0,sizeof(text)-1);
  86.         printf("after encrypt :%s\n",text);
  87.         ycodec.decrypt(&ycodec,(unsigned char *)text,0,sizeof(text)-1);

  88.         printf("after decrypt :%s\n",text);
  89.         return 0;
  90.        

  91. }
复制代码

[ 本帖最后由 yovn 于 2007-8-14 16:19 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-14 16:44 |只看该作者
加密方式弱于一次一密乱码本,周期太短
还是看看《应用密码学》吧

论坛徽章:
0
3 [报告]
发表于 2007-08-14 16:48 |只看该作者
原帖由 yg 于 2007-8-14 16:44 发表
加密方式弱于一次一密乱码本,周期太短
还是看看《应用密码学》吧

呵呵,好像一次一密乱应该是强度最高的吧,这样作加密大文件不值啊

论坛徽章:
0
4 [报告]
发表于 2007-08-14 17:00 |只看该作者
个人愚见, 如果能从数学上面对算法进行一个推理, 然后证明其安全性, 可能更好一些.
以前看的RSA算法的那个加密论文对方方面面的可能性都论证了一番的,
如果楼主能证明一下, 似乎更好!

论坛徽章:
0
5 [报告]
发表于 2007-08-14 17:06 |只看该作者
原帖由 scutan 于 2007-8-14 17:00 发表
个人愚见, 如果能从数学上面对算法进行一个推理, 然后证明其安全性, 可能更好一些.
以前看的RSA算法的那个加密论文对方方面面的可能性都论证了一番的,
如果楼主能证明一下, 似乎更好!

恩,改天好好看看《应用密码学》如何证明加密的强度。

论坛徽章:
0
6 [报告]
发表于 2007-08-14 17:12 |只看该作者
因为每一位的运算都是简单运算,而操作数只有0、1、2三个,所以每位的加密强度是弱于一次一密的,而一次一密的加密强度取决于循环周期,192实在太短了

论坛徽章:
0
7 [报告]
发表于 2007-08-14 17:13 |只看该作者
个人研究的花什么算法都可以,
一般认为正规程序里不能用标准加密算法以外的算法,貌似有此惯例

如果想使用新的加密算法,先发个paper,得到所谓学术界的赞同后就可以使用到正规程序里了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-08-14 17:15 |只看该作者
你这个算法可以做到加密相同的数据,每次都产生不同的密文么?
如果不能,连差分攻击都不用,直接明文攻击就搞定了

推荐几个密码学代码
1、AES、DES建议看LINUX内核的IPSEC部分
2、MD5、SHA1建议看coreutils代码

论坛徽章:
0
9 [报告]
发表于 2007-08-14 17:19 |只看该作者
原帖由 yg 于 2007-8-14 17:12 发表
因为每一位的运算都是简单运算,而操作数只有0、1、2三个,所以每位的加密强度是弱于一次一密的,而一次一密的加密强度取决于循环周期,192实在太短了

操作数不是0,1,2,我的想法是:
对每一个字节需要依赖2个 条件来确定是如何加密的
1)操作数
2)对该字节如何操作,+,-还是^
而操作数是随机的,由他而产生的操作码 从而也是随机的,所以破解的话不想每次都是一个操作一样(比如^)能找到规律。

论坛徽章:
0
10 [报告]
发表于 2007-08-14 17:27 |只看该作者
原帖由 safedead 于 2007-8-14 17:15 发表
你这个算法可以做到加密相同的数据,每次都产生不同的密文么?

这个是什么意思呢?MD5来算一个摘要也不会是每次产生不一样的啊
而且,我的这个算法是对称加密的,随着密钥的不一样,生成的密文肯定是不一样的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP