- 主题:介绍一种加密算法
附件(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.*
是和图灵破解的那个 ENIGMA 机思路类似吗?
每输出一个字节换一组转换关系是吗?
密钥另外用别的渠道传递过去?
--
FROM 114.241.81.*
原理相同,参数不同。密钥的设定也不同。
由于enigma已经被盟军缴获,转轮的配线已经不是秘密,剩下的问题就是每个转轮的起始位置,3个字母,信息熵为15bit。图灵借助国家力量,也就是破解了15bit的密钥。
我的改进,一个编码轮,一个反射轮,都是256码点,起始位置不重要。转轮的配线是真正的密钥,毕竟机械转轮不可能随时改变配线,软件可以。
两个转轮的总信息熵是2504bit,按当今算力,破解需要宇宙年龄的若干倍。
用在传输加密领域,可以通过密钥协商技术约定双方密钥。
可以ai一下DH方法。
这个版太冷,更多的讨论如下:
https://www.newsmth.net/nForum/#!article/CPlusPlus/434238
12楼有一个生成转轮的算法,给出任何字节序列都可以生成。
生成程序可以随便搞,双方一致就行。
23楼有三种方法的效果。
【 在 ameng 的大作中提到: 】
: 是和图灵破解的那个 ENIGMA 机思路类似吗?
: 每输出一个字节换一组转换关系是吗?
: 密钥另外用别的渠道传递过去?
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*
每输出一个字节,不一定转几步,由密钥和前一个明文字节决定。算法你可以任意改,双方一致即可。见上述链接10楼。
100个人可以做出100个不同的enigma方法。这就是其神奇之处。enigma的意思,就是神奇。
程序包你拿去,玩好了,自己随便改,变幻无穷。
【 在 ameng 的大作中提到: 】
: 是和图灵破解的那个 ENIGMA 机思路类似吗?
: 每输出一个字节换一组转换关系是吗?
: 密钥另外用别的渠道传递过去?
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*