求一个文件加密算法
时间:2010-06-28
来源:互联网
作者: tajial 发布时间: 2010-06-28
作者: ecjtubaowp 发布时间: 2010-06-28
好像是C++的
有C版本的吗?
作者: tajial 发布时间: 2010-06-28
作者: c/unix 发布时间: 2010-06-28
tajial 发表于 2010-06-28 14:12
ENIGMA密码:
http://blog.chinaunix.net/u3/92831/showart_2163335.html
加入SDBC群,群空间有源码。QQ100807652
加密速度:
enigma1是3DES的27倍,frenz是13.5倍,enigma2是6.5倍。
使用方法:
#include <enigma.h>
ENIGMA2 egm;
//生成密码机
enigma2_init(&ehm,"key122237@#$$%%");
//加密:
enigma2_encode(&egm,buf,size);//buf里明码原位便密码
//解密:
enigma2_decode(&egm,buf,size);//buf里密码原位变明码
安全性,在上文讨论。
适于流媒体加密。
由于是序列密码,对加密信息的长度没有限制,加密前后长度不变。
安全讨论,见80楼:
http://bbs.chinaunix.net/viewthr ... ;page=8#pid12368686
作者: yulihua49 发布时间: 2010-06-28
加入SDBC群,群空间有源码。QQ100807652
加密速度:
enigma1是3DES的27倍,fr ...
yulihua49 发表于 2010-06-28 17:00
兄弟直接上传个源码包吧
作者: c/unix 发布时间: 2010-06-28
c/unix 发表于 2010-06-28 17:06
加入SDBC群,在群空间-共享空间有,群论坛有编译方法:
你能看到吗?把part01-04下来,解压到linux'
http://qun.qq.com/air/#100807652/share
好像不行,入群吧,我等你。
只编译string和crypto两个目录即可。
crypt目录下有个t_eni.c,就是demo。
作者: yulihua49 发布时间: 2010-06-28
c/unix 发表于 2010-06-28 17:06
测试demo:
- /* enigma 加密测试 */
- #include <strproc.h>
- #include <enigma.h>
- #include <sys/time.h>
-
- //#define TEST_SPEED
-
- long interval(struct timeval *begtime,struct timeval *endtime)
- {
- long ret;
- ret=endtime->tv_sec-begtime->tv_sec;
- ret*=1000000;
- ret += endtime->tv_usec - begtime->tv_usec;
- return ret;
- }
-
-
- int main(int ac,char *av[])
- {
- char buf[131702];
- int len,i,len1;
- ENIGMA t;
- ENIGMA2 egm;
- struct timeval beg,end;
-
- enigma1_init(t,"永 垂 不 朽,Enigma");
- printf("t1:");
- for(i=0;i<256;i++) {
- if(!(i&7)) putchar('\n');
- printf("%3d:%d\t",i,255&t[0][i]);
- }
- printf("\nt3:");
- for(i=0;i<256;i++) {
- if(!(i&7)) putchar('\n');
- printf("%3d:%d\t",i,255&t[2][i]);
- }
- enigma2_init(&egm,"永 垂 不 朽 的 Enigma");
- printf("\ncrc=%d\n",egm.crc);
- // enigma2_init(&egm,"\x01\xff\x35\xf8\xef\x97\x22\x14\x80\x7f\t\b\r\n\377\177\225");
- memset(buf,'\373',sizeof(buf));
- buf[sizeof(buf)-1]=0;
- #ifndef TEST_SPEED
- while(!ferror(stdin)) {
- fgets(buf,sizeof(buf),stdin);
- if(feof(stdin)) break;
- TRIM(buf);
- #endif
- len=strlen(buf);
- gettimeofday(&beg,0);
- enigma1(t,buf,len);
- gettimeofday(&end,0);
- len1=len>32?32:len;
- printf("enigma1 encode:");
- for(i=0;i<len1;i++) printf("%02X ",buf[i]&255);
- printf("\nenigma1 encode 64K:");
- for(i=0;i<len1;i++) printf("%02X ",buf[i+65536]&255);
- printf("\ntimeval=%ld\n",interval(&beg,&end));
- enigma1(t,buf,len);
- printf("enigma1 decode:\n%.100s\n",buf);
- //test frenz
- gettimeofday(&beg,0);
- frenz_encode(t,buf,len);
- gettimeofday(&end,0);
- printf("frenz encode:");
- for(i=0;i<len1;i++) printf("%02X ",buf[i]&255);
- printf("\nfrenz encode 64K:");
- for(i=0;i<len1;i++) printf("%02X ",buf[i+65536]&255);
- printf("\ntimeval=%ld\n",interval(&beg,&end));
- frenz_decode(t,buf,len);
- printf("frenz decode:\n%.100s\n",buf);
- //test enigma2
- gettimeofday(&beg,0);
- enigma2_encode(&egm,buf,len);
- gettimeofday(&end,0);
- printf("enigma2 encode:");
- for(i=0;i<len1;i++) printf("%02X ",buf[i]&255);
- printf("\nenigma2 encode 64K:");
- for(i=0;i<len1;i++) printf("%02X ",buf[i+65536]&255);
- printf("\ntimeval=%ld\n",interval(&beg,&end));
- enigma2_decode(&egm,buf,len);
- printf("enigma2 decode:\n%.100s\n",buf);
- #ifndef TEST_SPEED
- }
- #endif
- return 0;
- }
作者: yulihua49 发布时间: 2010-06-28
作者: ecjtubaowp 发布时间: 2010-06-28
yulihua49 发表于 2010-06-28 17:20
源码:
enigma.h:
- #ifndef ENIGMA_H
- #define ENIGMA_H
-
- #define ROTORSZ 256
-
- typedef char ENIGMA[3][ROTORSZ];
- typedef struct {
- ENIGMA t;
- ENIGMA r;
- INT4 crc;
- } ENIGMA2;
-
- #ifdef __cplusplus
- extern "C" {
- #endif
- /* 改进的 ENIGMA 程序 */
- void enigma1_init(ENIGMA t,char *key);
- void enigma1(ENIGMA t,char *buf,int len);
- //疯狂旋转的转轮机,完全屏蔽了列表特征,不存在周期性
- void frenz_encode(ENIGMA t,char *string,int len);
- void frenz_decode(ENIGMA t,char *string,int len);
-
- /* 加密后扰码,用于配合多种加密手段 */
- void enigma_rev(ENIGMA t,char *buf,int len);
- /* 解扰后解密,用于解密 */
- void rev_enigma(ENIGMA t,char *buf,int len);
-
- /* 加强的ENIGMA程序,完全消除了密文与相似明文的对应关系 */
- void enigma2_init(ENIGMA2 *ep,char *key); //初始化
- void enigma2_encode(ENIGMA2 *ep,char *buf,int len); //加密
- void enigma2_decode(ENIGMA2 *ep,char *buf,int len); //解密
- /*
- void enigma3_encode(ENIGMA2 *ep,char *buf,int len); //加密
- void enigma3_decode(ENIGMA2 *ep,char *buf,int len); //解密
- */
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif
作者: yulihua49 发布时间: 2010-06-28
c/unix 发表于 2010-06-28 17:06
enigma1.c:
- #include <strproc.h>
- #include <enigma.h>
- #include <arpa/inet.h>
- #include <crc.h>
- #include <des.h>
- /*
- * A one-rotor machine designed along the lines of Enigma
- * but considerably trivialized.
- */
-
- #define MASK 0377
- // 随机串长度,如果你想使用MD5,加大这个值
- #define RAN_LEN 17
-
- /* 生成密码轮 */
- void enigma1_init(ENIGMA t,char *pw)
- {
- int ic, i, k, temp;
- int random,seed;
- char *buf,buf1[RAN_LEN+1];
- char *t1,*t2,*t3,salt[3];
- int len;
- int32_t crc,*ip;
- char *h;
- int hlen;
-
- if(!t || !pw || !*pw) return;
- t1=t[0];
- t2=t[1];
- t3=t[2];
- len=strlen(pw);
- crc=(int32_t)ssh_crc32((const unsigned char *)pw,len);
- ip=(int *)buf1;
- *ip=htonl(crc);//CRC在不同系统上具有相同的值,作为随机串的使用,必须保证在所有系统上相同的字节次序
-
- seed=0xFFFF&gencrc((unsigned char *)pw,len);
- salt[0]=seed&127;
- if(!salt[0]) salt[0]=0X41;
- seed >>= 7;
- salt[1]=seed&127;
- if(!salt[1]) salt[1]=0X41;
- salt[2]=0;
- if(seed==0) seed=pw[len-1];
-
- // 设置ic,初始化的自旋
- ic=len;
- for(i=0;i<len;i++) ic += pw[i];
- ic &= 127;
- ic|=(seed & 128);
-
- if(len>13) {
- hlen=13;
- h=pw+len-13;
- } else {
- hlen=len;
- h=pw;
- }
-
- /* 你可以在buf1里添加任何散列数据 如MD5等 */
- buf=des_fcrypt(pw,salt,buf1+sizeof(int32_t));
- for (i=0; i<13; i++) {
- seed = seed*buf[i] + i;
- //随机串由原来的6-7bit提升到8bit,并与密钥的最后13位直接相关
- buf[i] = (buf[i] << 1) ^ h[i % hlen];
- }
- // ic,初始化的自旋
- for(i=0;i<ROTORSZ;i++) {
- t1[i] = (i+ic) & MASK;
- t3[i] = 0;
- }
- for(i=0;i<ROTORSZ;i++) {
- seed = len*seed + buf1[i%RAN_LEN];
- random = (seed&0X7FFFFFFF) % 65529; //random(key);
- // 以上生成尽可能随机的random,你有充分的自由度选择你的算法
- /* 生成主编码轮 t1 */
- k = ROTORSZ-1 - i;
- ic = random % (k+1);
-
- temp = t1[k];
- t1[k] = t1[ic];
- t1[ic] = temp;
- /************************************************************************
- * 生成反射板 反射板只要不重不漏的把各点两两连接起来?
- ************************************************************************/
- if(t3[k]!=0) continue;
- ic = (random>>8) % k;
- while(t3[ic]!=0) ic = (ic+1) % k;
- t3[k] = ic;
- t3[ic] = k;
- }
- /* t2为t1的逆 */
- for(i=0;i<ROTORSZ;i++)
- t2[t1[i]&MASK] = i;
- }
- void enigma1(ENIGMA t,char *string,int len)
- {
- register char *p;
- register int n1,n2, k, x; //x旋转因子
- char *t1,*t2,*t3;
-
- if(!t || !string || len <= 0) return;
- t1=t[0];
- t2=t[1];
- t3=t[2];
- //初始位置和旋转因子与len和T有关,不知道T就不知道它们,也无法通过明文、密文的关系推断T。
- n2=t[len&1][(len>>9)&MASK]&MASK;
- n1=t3[(len>>1)&MASK]&MASK;
-
- x=((t3[((len>>17)+n1)&MASK]&3)<<1)+1; //x=1,3,5,7
-
- p=string;
- for(k=0;k<len;k++){
- *p = t2[(t3[(t1[(*p+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1;
- ++p;
- n1 += x;
- if (n1 >= ROTORSZ) {
- n1 &= MASK;
- if(++n2==ROTORSZ) n2 = 0;
- }
- }
- }
-
- void frenz_encode(ENIGMA t,char *string,int len)
- {
- register char *p;
- register int x,n1; //x旋转因子
- char *t1,*t2,*t3;
- int n2, k;
- //int r=0;
-
- if(!t || !string || len <= 0) return;
- t1=t[0];
- t2=t[1];
- t3=t[2];
- //初始位置和旋转因子与len和T有关,不知道T就不知道它们,也无法通过明文、密文的关系推断T。
-
- n2=t[len&1][(len>>9)&MASK]&MASK;
- n1=t3[(len>>1)&MASK]&MASK;
-
- p=string;
- for(k=0;k<len;k++){
- x=t2[(*p+k)&MASK];
- *p = t2[(t3[(t1[(*p+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1;
- ++p;
- n1 += x;
- if(n1<0) {
- n1&=MASK;
- continue;
- }
- if (n1 >= ROTORSZ) {
- n1 &= MASK;
- if(++n2==ROTORSZ) n2 = 0;
- // r++;
- }
- }
- }
- void frenz_decode(ENIGMA t,char *string,int len)
- {
- register char *p;
- register int x,n1; //x旋转因子
- char *t1,*t2,*t3;
- int n2, k;
-
- if(!t || !string || len <= 0) return;
- t1=t[0];
- t2=t[1];
- t3=t[2];
- //初始位置和旋转因子与len和T有关,不知道T就不知道它们,也无法通过明文、密文的关系推断T。
- n2=t[len&1][(len>>9)&MASK]&MASK;
- n1=t3[(len>>1)&MASK]&MASK;
-
- p=string;
- for(k=0;k<len;k++){
- *p = t2[(t3[(t1[(*p+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1;
- x=t2[(*p+k)&MASK];
- ++p;
- n1 += x;
- if(n1<0) {
- n1&=MASK;
- continue;
- }
- if (n1 >= ROTORSZ) {
- n1 &= MASK;
- if(++n2==ROTORSZ) n2 = 0;
- }
- }
- }
des_fcrypt,ssh_crc32是ssl里的,crcgen()是crc16,ccitt的,用别的也行,只要加密解密是一套就行。
作者: yulihua49 发布时间: 2010-06-28
yulihua49 发表于 2010-06-28 17:25
enigma2.c:
- #include <strproc.h>
- #include "enigma.h"
-
- void b_revers(char *buf,int len)
- {
- char *p,*p1,c;
- if(!buf || len<2) return;
- p=buf;
- p1=p+len-1;
- while(p1>p) {
- c=*p1;
- *p1--=*p;
- *p++=c;
- }
- return;
- }
-
- void enigma_rev(ENIGMA ep,char *buf,int len)
- {
- int i;
- char *p;
- if(!buf||len<=0) return;
- frenz_encode(ep,buf,len);
- b_revers(buf,len);
- p=buf;
- for(i=0;i<len-1;i++) {
- p[1]^=*p;
- p++;
- }
- }
- void rev_enigma(ENIGMA ep,char *buf,int len)
- {
- int i;
- char *p;
- if(!buf||len<=0) return;
- b_revers(buf,len);
- p=buf;
- for(i=0;i<len-1;i++) {
- *p^=p[1];
- p++;
- }
- frenz_decode(ep,buf,len);
- }
- void enigma2_init(ENIGMA2 *ep,char *key)
- {
- int len;
- if(!ep||!key||!*key) return;
- len=strlen(key);
- char rk[len+1];
- strcpy(rk,key);
- enigma1_init(ep->t,key);
- b_revers(rk,len);
- enigma1_init(ep->r,rk);
- ep->crc=0X7FFFFFFF & ssh_crc32(ep->t,2*sizeof(ep->t));
- //ShowLog(5,"%s:crc=%d",__FUNCTION__,ep->crc);
- return;
- }
-
- static void str_rotor(char *str,int len,int rotor)
- {
- char *p;
- if(!rotor) return;
- char buf[rotor];//WINDOWS不能如此,改alloca
-
- memcpy(buf,str,rotor);
- memcpy(str,str+rotor,len-rotor);
- memcpy(str+len-rotor,buf,rotor);
- }
-
- void enigma2_encode(ENIGMA2 *ep,char *buf,int len)
- {
- char *p;
- if(!ep) return;
- enigma_rev(ep->t,buf,len);
- str_rotor(buf,len,ep->crc%len);
- enigma1(ep->r,buf,len);
- }
-
- void enigma2_decode(ENIGMA2 *ep,char *buf,int len)
- {
- int i;
- char *p;
- if(!ep) return;
- enigma1(ep->r,buf,len);
- i=ep->crc%len;
- if(i) str_rotor(buf,len,len-i);
- rev_enigma(ep->t,buf,len);
- }
作者: yulihua49 发布时间: 2010-06-28
ecjtubaowp 发表于 2010-06-28 17:21
原始 ENIGMA不行,但他的先天体质不错,可改造,这些是我根据现代密码学的理论改造过的。
作者: yulihua49 发布时间: 2010-06-28
作者: nhuczp 发布时间: 2010-06-28
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28