- 主题:介绍一种加密算法
附件(72.3KB) ENIGMA-b.rarENIGMA的电脑版,适合对byte流加密。
在明文空间就地加密,在密文空间就地解密(密文字节数=明文字节数),不需要另外的空间。
速度很快。使用简单。
这个算法,是序列密钥。在网络通信领域很有价值。一般使用的DES,AES等等是分组密钥,加密要凑整个分组,在通信包头里要指明在整个数据包里有多少是有效字节,用于剔除填充字节。在已经应用中的包头里添加参数信息,会导致整个系统的颠覆式升级(新旧协议不兼容)。所以在一个旧系统升级加密功能,用分组密钥是不方便的。
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*
其中的enigma.h:
void enigma1(ENIGMA t,char *buf,int len);
这个是基本的加密解密程序。
t是生成好的转轮加密机。
buf是需要加密解密的数据地址,len是字节数。
对明文运行一次,buf里就是密文。
对密文运行一次,buf里就是明文。
#define ROTORSZ 256
typedef char ENIGMA[3][ROTORSZ];//这看起来有点像ENIGMA的3个转轮,其实不是。
void frenz_encode(ENIGMA t,char *string,int len);//加密
void frenz_decode(ENIGMA t,char *string,int len);//解密
string就是上边的buf,名字起的不好。
这两个比ENIGMA1强度高一些,采用了明文字符影响下次转轮的步数,就是上文相关。
就是说,Cn=f(Mn,K,Mn-1);
【 在 ylh1969 的大作中提到: 】
: [upload=1][/upload]
: ENIGMA的电脑版,适合对byte流加密。
: 在明文空间就地加密,在密文空间就地解密,不需要另外的空间。
: ...................
#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); //解密
#ifdef __cplusplus
}
#endif
#endif
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*
这是基本的ENIGMA,加密解密是一个程序。
与传统的ENIGMA不同的是:
256个码点,而不是26个。适合字节流加密。
密钥是转轮的配线而不是起始位置。传统的配线固定,用起始位置作密钥。
每次不一定转1格。
【 在 ylh1969 的大作中提到: 】
: 其中的enigma.h:
: void enigma1(ENIGMA t,char *buf,int len);
: 这个是基本的加密解密程序。
: ...................
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;
}
}
}
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*
其中teni.c是测试程序,测试ENIGMA1的程序片段如下:
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");//生成转轮
。。。。。。
while(!ferror(stdin)) {
fgets(buf,sizeof(buf),stdin);
if(feof(stdin)) break;
TRIM(buf);
//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("\ntimeval=%ld\n",interval(&beg,&end));//计时
enigma1(t,buf,len);//解密
printf("enigma1 decode:\n%.100s\n",buf);
是不是使用特别简单?
【 在 ylh1969 的大作中提到: 】
: [upload=1][/upload]
: ENIGMA的电脑版,适合对byte流加密。
: 在明文空间就地加密,在密文空间就地解密,不需要另外的空间。
: ...................
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*