- 主题:介绍一种加密算法 (转载)
【 在 hotfix 的大作中提到: 】
: 我是不太懂加密算法,看一下AI的评价吧
关于反推转轮,在ENIGMA1里,我可以给出一个办法,采用选择明文法,用那个teni.c就行。
63+1k个0X00
63+1k个0X01
。
。
。
63+1k个0XFF
把它们的密文收集起来,得到一个256列×(63+1)K行的矩阵。
如果每次步进1步,这个矩阵基本可用。
但是ENIGMA1不是每次步进1步,这个矩阵需要排排序。
根据这个矩阵反推转轮是可能的。
6楼说frenz可能倒推转轮,不是吧,它的旋转步数完全不确定,在那个矩阵里,每行的各列,旋转步数各不相同,根本就不是原表的行列关系。不知道怎么倒推。
ENIGMA2,想都不要想。
它是ENIGMA1和frenz的结合,先用frenz(从头到尾关联一次,如果两个明文只差1bit,密文中这个字节及之后的所有字节都会改变),然后倒序一次,从尾到头再关联一次。
再切一次牌。完全打破了明文密文字节一一对应的关系。
最后用ENIGMA1再加密一次。AI说的混合效率低就是通过二次加密解决的。不需要反复的混合(洗牌)。
双向关联的结果,如果两个明文只差1bit,密文将完全不同(抵抗差分分析法)。
它完全可以抵抗暴力破解。因为需要先破解ENIGMA1,但是破解时没有依据,不知道得到什么样的东西是正确的。无从判断,就算真的破解开了,结果也是一堆乱码,这种情况就是量子计算机也没辙。
AI说的很对,本软件提供3个级别的方法,要速度还是要安全,你自己选。
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*
见6楼。
【 在 hotfix 的大作中提到: 】
: 我是不太懂加密算法,看一下AI的评价吧
这个AI的评价已经相当高了。
不过,应该指出,它里边说的CRC啥的,都是在生成转轮中出现的。转轮的随机性并不完全依赖CRC,它只是随机的一个因素。
给你们的转轮生成器,只是最简单的一种,它实际上只相当于70bit,就是只能生成2^70种转轮,一般情况这就足够了。总共可以有2^2504种不同的转轮,相当于2504bit,这只使用了其中极小部分。
我自己用的是可以生成2504bit的生成器。这可不是分组密钥的128,256bit。
256!×(n=1,127)连乘积(2n+1) -> 2504bit。
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*
这个高级的生成器:
可以用来替换压缩包里的生成器,不过参数多了一个,可以支持二进制key,从1字节到512字节都可以,想暴力破解的先琢磨琢磨。个别部位要修改一下。
里边的crc32仅用于随机数的种子,与安全性关系不大。
【 在 ylh1969 的大作中提到: 】
: 见6楼。
: 这个AI的评价已经相当高了。
: 不过,应该指出,它里边说的CRC啥的,都是在生成转轮中出现的。转轮的随机性并不完全依赖CRC,它只是随机的一个因素。
: ...................
#include <string.h>
#include <crc32.h>
#include <enigma.h>
/*
* A one-rotor machine designed along the lines of Enigma
* but considerably trivialized.
*/
#define MASK 0377
/* 生成密码轮 */
void enigma_init(ENIGMA t,const char *bin_key,int len)
{
int ic, i, k,random,seed;
signed char temp,*t1,*t2,*t3;
if(!t || !bin_key) return;
if(len<=0 && !(len=strlen(bin_key))) return;
seed=(int)ssh_crc32((unsigned char *)bin_key,len);
t1=t[0]; t2=t[1]; t3=t[2];
// 设置ic,初始化的自旋
ic=seed;
for(i=0;i<len;i++) ic += bin_key[i];
ic &= MASK;
//printf("%s:len=%d,seed=%d,ic=%d\n",__FUNCTION__,len,seed,ic);
// ic,初始化的自旋
for(i=0;i<ROTORSZ;i++) {
t1[i] = (i+ic) & MASK;
t3[i] = 0;
}
if(len>ROTORSZ) {//如果密钥长于ROTORSZ,使用最后一部分
bin_key += len-ROTORSZ;
len = ROTORSZ;
}
for(i=0;i<ROTORSZ;i++) {
seed = (seed<<1) + (signed)bin_key[i%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&MASK) % 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;
/*
char buf[200],*cp;
cp=buf;
for(i=0;i<32;i++)
cp+=sprintf(cp,"%02X ",t1[i]&255);
ShowLog(5,"%s:len=%d,t1=%s",__FUNCTION__,len,buf);
*/
}
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*
AES要加密卡干嘛
x86这边aes-ni指令集有了得10年左右了。
软件方便,openssl、jdk都是支持aes-ni的。
【 在 ylh1969 的大作中提到: 】
: 哦,我说的是软件,openssl里的。咱们一般商用网络应用,不会去买加密卡吧?经济性问题。如果是网络应用,服务器用加密卡,客户端还是要用软件,还得保证二者兼容。具体加密软件里边会有很多细节的。
: 提供给一般码农做通信软件用的。
: 我真是希望能有一大堆数学家进行安全评估,可惜我没有那么多钱。至于反推转轮的可能性,确实需要做数学评估。
--
FROM 124.64.134.*
哦,我那个测试是2010年测的。现在谁有兴趣再测一下吧。
前边说过,传输加密不用分组密钥的主要原因是需要凑整组,传输的字节数与信息的不等,导致需要另外分配buf,包头信息也需要表明有多少填充字节需要剔除。这不太方便。
6楼关于大文件加密的速度问题,可以把大文件分块处理。
当然,这东西不是为文件加密设计的。但是,vi -x 用的就是这个方法。它的方法比我的还要弱。转轮初值0,0,每次转1步。那么,10楼的矩阵很容易反推出转轮。
【 在 kirbyzhou 的大作中提到: 】
: AES要加密卡干嘛
: x86这边aes-ni指令集有了得10年左右了。
: 软件方便,openssl、jdk都是支持aes-ni的。
: ...................
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*
还有更不给面子的AI如是说:
结论:无论叫 ENIGMA-2、ENIGMA-2025 还是“超级转子机”,只要还是基于 1940 年代那套反射器+轮转置换结构,它在 2025 年的算力面前都不安全,只能做教学演示或 CTF 玩具,不能用于真实保密场景。
--
FROM 171.213.172.*
所以说6楼很给面子啦,至少,它认真的分析了这个算法。
你这个AI,懒,连分析都懒得分析,结论有点武断,它以为ENIGMA2只是一个命名吗?
1940的主要问题在于,转子的配线是固定的,所有的加密机都一样,而且被缴获了,转子无密可保。
图灵折腾半天也就破解了3个字母的密钥,就是3个转子的起始位置。充其量也就是15bit密钥(26个字符4.7比特,猜3次15bit)。
今天,我们不同,enigma_init,它是制造转子的。每个转轮机都是独一无二的配线。所以,起始位置不再重要,真正的密钥是轮子的配线。
它有多少可能的排列?
编码轮是256!,反射论是(n=1,127)连乘积(2n+1),就是3~255奇数积(这是ENIGMA的特征数,它的很多数学性质都来源于此)。
二者乘积是2^2504,就是2504bit。想想我们常用的3DES,AES,256bit就算多的啦。
如果想进行暴力破解,算算工作量。
当然,是否有捷径,10楼给出一些方法,但是已经针对这些方法,进行改进。
最重要的改进是ENIGMA2,它融合了现代密码学原理:
替换和交换,分组密钥就干这两件事。传统的ENIGMA只有替换,没有交换,就是明文和密文字节一一对应。
EMIGMA2,用一个密钥生成两个转轮,t和r。(5008bit啦!)
先用一个进行frenz(有从前往后关联),然后对密文,进行一次反序,在从前往后XOR一遍,实际上是从尾到头,这一步解决了差分分析,两个相似明文差1bit,密文将完全不同,6楼提出了这个问题,这是我的回答。
下一步,切一次牌,切点由密钥决定。虽然只进行了一次交换,与DES不同,DES的16次交换是在固定位置进行,这就是漏洞。这个交换位置是密钥决定的,没有密钥的话,不好猜(6楼的AI所言,混合(洗牌)的不够均匀,实际不需要太均匀)。所以,一次交换就足够了。
最后一步,用另一个转轮ENIGMA1再加密一次。为了快一点。
这就是你现代算力破解不了的关键了。
暴力破解,首要解决的是,破解成功的标志是什么。破解RSA,标准很明确,因数分解,所以量子计算机很有效。
我们这个呢?逆向操作,第一步破解第二密钥,就算找到了算法捷径,什么叫破解成功,找得到标志物吗?
下一步,把切牌还原,在没有密钥的情况下只能试。随便还原一个,再用xor卷一遍。要是第一个字节没还原对,卷的全错。反序一次。找个转轮(在2^2504里找)用frenz_decode()。。。。。10楼说了,即使选择明文,frenz也无法反推转轮。何况你没有明文。
你把我说的这些介绍给AI,看看有什么办法。关键是如何找到破解成功的标志物。
【 在 poocp 的大作中提到: 】
: 还有更不给面子的AI如是说:
: 结论:无论叫 ENIGMA-2、ENIGMA-2025 还是“超级转子机”,只要还是基于 1940 年代那套反射器+轮转置换结构,它在 2025 年的算力面前都不安全,只能做教学演示或 CTF 玩具,不能用于真实保密场景。
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*
再补充一点,我们这个东西的主要用途是通信传输加密,其生命期等同一个会话的生命期,这个场景就是真实的保密场景。
当传输一个大数据包时,TCP协议会破包,分成许多小的报片,中途被抓包的话,任何一个片段都不可以单独解密。尤其是ENIGMA2,丢失任何1bit就导致整包全错,这个在6楼里也提过了,算是一个缺点吧,不容错。
实际上经过十几年的使用,也进行过洲际传输,没有发现过错包导致的故障。tcp的可靠性还是足够的。
【 在 poocp 的大作中提到: 】
: 还有更不给面子的AI如是说:
: 结论:无论叫 ENIGMA-2、ENIGMA-2025 还是“超级转子机”,只要还是基于 1940 年代那套反射器+轮转置换结构,它在 2025 年的算力面前都不安全,只能做教学演示或 CTF 玩具,不能用于真实保密场景。
--
FROM 221.221.50.*
为什么不用现成的AES之类的呢?自己发证书
【 在 ylh1969 的大作中提到: 】
: 再补充一点,我们这个东西的主要用途是通信传输加密,其生命期等同一个会话的生命期,这个场景就是真实的保密场景。
: 当传输一个大数据包时,TCP协议会破包,分成许多小的报片,中途被抓包的话,任何一个片段都不可以单独解密。尤其是ENIGMA2,丢失任何1bit就导致整包全错,这个在6楼里也提过了,算是一个缺点吧,不容错。
: 实际上经过十几年的使用,也进行过洲际传输,没有发现过错包导致的故障。tcp的可靠性还是足够的。
: ...................
--
FROM 124.126.1.*
传输加密不用分组密钥的主要原因是需要凑整组,传输的字节数与信息的不等,导致需要另外分配buf,包头信息也需要表明有多少填充字节需要剔除。这不太方便。
aes,3des都是分组密钥。
【 在 jimmycmh 的大作中提到: 】
: 为什么不用现成的AES之类的呢?自己发证书
:
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*