SPN线性密码分析【附code】

article/2025/10/4 0:41:29

综述

SPN线性密码分析:

  • 基于S盒子逼近的分析方法;
  • 是已知明文的分析方法,需要较多的名密文对;
  • 此方法只能分析最后一轮子密钥,缩小了密钥穷举范围(当分析出最后一轮密钥时,由于密钥生成算法固定,因此也为分析第一轮密钥提供了可能)。

相关概念

  • 定义对于 { 0 , 1 } \{0,1\} {0,1}上的离散随机变量 X i X_i Xi p i = P ( X i = 0 ) p_i=P(X_i=0) pi=P(Xi=0)
  • 定义 X i X_i Xi的偏差为: ϵ i = p i − 1 2 \epsilon_i=p_i-\frac{1}{2} ϵi=pi21
  • 堆积引理: X i 1 , X i 2 , … , X i k X_{i_1},X_{i_2},\dots,X_{i_k} Xi1,Xi2,,Xik独立随机变量, ϵ i 1 , ϵ i 2 , … , ϵ i k \epsilon_{i_1},\epsilon_{i_2},\dots,\epsilon_{i_k} ϵi1,ϵi2,,ϵik分别表示随机变量 X i 1 , X i 2 , … , X i k X_{i_1},X_{i_2},\dots,X_{i_k} Xi1,Xi2,,Xik的偏差,那么对变量 X i 1 ⨁ X i 2 ⨁ ⋯ ⨁ X i k X_{i_1}\bigoplus X_{i_2}\bigoplus \dots\bigoplus X_{i_k} Xi1Xi2Xik的偏差,则有: ϵ i 1 , i 2 , … , i k = 2 k − 1 ∏ j = 1 k ϵ i j \epsilon_{i_1,i_2,\dots,i_k}=2^{k-1}\prod_{j=1}^{k}\epsilon_{i_j} ϵi1,i2,,ik=2k1j=1kϵij

线性分析过程

  • 收集大量明密文对;
  • 选择一个固定的输入位 i n ( x , y ) = ( ∑ i = 1 4 ⊕ a i x i ) ⊕ ( ∑ i = 1 4 ⊕ b i y i ) in(x,y)=(\sum_{i=1}^{4}\oplus a_ix_i)\oplus(\sum_{i=1}^{4}\oplus b_iy_i) in(x,y)=(i=14aixi)(i=14biyi),如:选择 x 1 ⊕ x 3 ⊕ y 2 x_1\oplus x_3\oplus y_2 x1x3y2
  • 通过收集的明密文对,根据上面构造的 i n ( x , y ) in(x,y) in(x,y)来构建线性逼近表;
  • 根据输入,选取线性逼近表中偏差最大的作为输出,找到对应位置进行输入;再根据线性逼近表找到输出;以此类推,构建出线性逼近链(偏差越大,越具有线性关系);
  • 根据该线性逼近链,通过将中间过程中的输入输出相异或来化简过程,最终化简为只剩下输入和最后一轮输入异或的关系式 t e s t ( ) test() test()
  • 遍历所有可能的密钥,遍历所有收集到的明密文对,通过y和当前测试的密钥计算出最后一轮输入,将该值带入关系式 t e s t ( ) test() test()中,若该关系式为0,则该密钥对应 c o u n t count count值加1;
  • 遍历结束后输出 c o u n t count count值最大的密钥。

线性分析原理

线性分析基于三个事实:

  • 找到一组S盒子,对于输入明文 X X X在经过该S盒子后,将得到固定的密文 Y Y Y,我们可以列出所有明文 X X X对应的密文 Y Y Y的情况。选出需要的“逼近中的活动S盒”,计算这些活动S盒中输入随机变量和输出随机变量的异或的偏差。并利用堆积引理计算这些“逼近中的活动S盒”的总偏差。
  • 根据输入随机变量经过这些S盒子的过程可以推算出仅包含明文比特和S盒子最后一轮输入比特的关系式。而通过已知的密文 Y Y Y即可反推回最后一轮的输出值,再反推回最后一轮的输入值。这样我们便可以计算该关系式。
  • X = ( x 1 , x 2 , … , x n ) X=(x_1,x_2,\dots,x_n) X=(x1,x2,,xn),其对应的加密值 Y = ( y 1 , y 2 , … , y n ) Y=(y_1,y_2,\dots,y_n) Y=(y1,y2,,yn),即 Y = π s ( X ) Y=\pi_s(X) Y=πs(X)
    因此必有 X ⊕ Y = 0 X\oplus Y=0 XY=0。换言之,对于任意情况下的变量 X 、 Y X、Y XY,若存在关系 X ⊕ Y = 0 X\oplus Y=0 XY=0,则必有 Y Y Y X X X的对应密文。

因此,当我们遍历可能的密钥空间,并计算相应的关系式的值,当为0时我们进行计数(为0表示此时明文与密文对应),结束后输出计数值最大的密钥,密钥越正确,对应的明密文则越多。
实际上真正的密钥计数器值应接近 1 2 ± ϵ \frac{1}{2}\pm\epsilon 21±ϵ,因为 1 2 ± ϵ = p i = P ( X ⊕ Y = 0 ) \frac{1}{2}\pm\epsilon=p_i=P(X\oplus Y=0) 21±ϵ=pi=P(XY=0)

代码

在这里插入图片描述
  首先使用书中给出的线性分析链,分析出第5轮第2、4部分的密钥。再选择新的线性分析链,在第2、4部分密钥已知的基础上分析出第1、3部分的密钥。接着在已知起始密钥低16位的基础上,穷举高16位密钥对给出的8000个明密文对进行验证。由于在加密过程中进行了5轮的S代换和P置换,导致相同明文在不同密钥下得到相同密文的概率极低,因此在实际验证过程中并不需要验证8000个明密文对是否对应,而仅需验证3个即可判断出密钥是否合适。
  需要注意的是:第一,由于虽然可以选取到仅包含第5轮第1、3部分的线性分析链,但是由于偏差不大,因此代表性较差,可能导致对于1、3部分密钥可能性较大部分的遍历过多,而导致时间开销较大,所以自选的线性分析链应该首先选择偏差较大的链条(尽管该链条可能还包含第5轮第2或第4部分密钥)。第二,由于线性分析是基于概率的分析,因此count值最大的并不一定是真正密钥,因此需要在一定范围内遍历count值较大的所有可能密钥并进行验证。
  基于以上两点,需要有两层主循环,第一层主循环遍历可能的第5轮第2、4部分密钥,第二层在已知第5轮第2、4部分密钥的基础上生成并遍历可能的第5轮第1、3部分密钥,同时穷举高16位密钥并进行验证。
综上程序流程为:读入明密文对并存入数组;根据明密文对和书中已知线性分析链计算第5轮第2、4部分密钥对应的count值并存起来;开始两层循环;找到后退出循环并输出结果。
  读入和输出采用快速读入和输出。

#include <stdio.h>
#include <string.h>
#define abs(a) {if(a >= 4000) a -= 4000; else a = 4000 - a;}
typedef unsigned short ushort;
typedef unsigned int uint;const int MAX = 8005;
int n, count13[2][16][16], cnt13[16][16], cnt24[16][16];
ushort plaintext[MAX], ciphertext[MAX], tail_key;
int key51, key52, key53, key54;
uint key;//SPN statement
const unsigned short sBox_4[16] = {0xe, 0x4, 0xd, 0x1, 0x2, 0xf, 0xb, 0x8, 0x3, 0xa, 0x6, 0xc, 0x5, 0x9, 0x0, 0x7}; 
const unsigned short inverse_sBox[16] = {0xe, 0x3, 0x4, 0x8, 0x1, 0xc, 0xa, 0xf, 0x7, 0xd, 0x9, 0x6, 0xb, 0x2, 0x0, 0x5};
const unsigned short pos[17] = {0x0,0x8000, 0x4000, 0x2000, 0x1000,0x0800, 0x0400, 0x0200, 0x0100,0x0080, 0x0040, 0x0020, 0x0010,0x0008, 0x0004, 0x0002, 0x0001};
const unsigned short pBox[17] = {0x0,0x8000, 0x0800, 0x0080, 0x0008,0x4000, 0x0400, 0x0040, 0x0004,0x2000, 0x0200, 0x0020, 0x0002,0x1000, 0x0100, 0x0010, 0x0001};
unsigned short sBox_16[65536], spBox[65536];void get_spBox(){  //获得spBox for(int i = 0; i < 65536; ++i){sBox_16[i] = (sBox_4[i >> 12] << 12) | (sBox_4[(i >> 8) & 0xf] << 8) | (sBox_4[(i >> 4) & 0xf] << 4) | sBox_4[i & 0xf];spBox[i] = 0;for(int j = 1; j <= 16; ++j){if(sBox_16[i] & pos[j]) spBox[i] |= pBox[j];}} 
}inline ushort read(){char ch;ushort buf = 0;for(int i = 0; i < 4; ){ch = getchar();if(ch >= '0' && ch <= '9'){buf = (buf << 4) | (ch ^ 48);i++;}else if(ch >= 'a' && ch <= 'z'){buf = (buf << 4) | (ch - 'a' + 10);i++;}}return buf;
}void output(){char buf[8];  //输出缓冲区for(int i = 0; i < 8; ++i){buf[7 - i] = key & 0xf;if(buf[7 - i] < 10) buf[7 - i] += '0';else buf[7 - i] = (buf[7 - i] - 10) + 'a'; key >>= 4;}for(int i = 0; i < 8; ++i) putchar(buf[i]);putchar('\n');
}inline void input(){for(int i = 1; i <= 8000; ++i){plaintext[i] = read();ciphertext[i] = read();}
}int main(){get_spBox();scanf("%d", &n);bool flag;ushort u1, u2, u3, u4;ushort x_init, y_init, z;ushort x[13], y[5];for(int i = 0; i < n; ++i){input();flag = false;//linear24();  //先分析第2、4位 memset(cnt24, 0, 256 * sizeof(int));for(int group = 1; group <= 8000; ++group){//提前处理要用到的对应位值 x_init = plaintext[group];for(int pos = 1; pos <= 12; ++pos){x[pos] = (x_init >> (16 - pos)) & 0x1;}y_init = ciphertext[group];for(int pos = 1, k = 12; pos <= 4; ++pos, k -= 4){y[pos] = (y_init >> k) & 0xf;}for(int L1 = 0; L1 < 16; ++L1){for(int L2 = 0; L2 < 16; ++L2){u2 = inverse_sBox[L1 ^ y[2]];u4 = inverse_sBox[L2 ^ y[4]];z = (x[5] ^ x[7] ^ x[8] ^ (u2 >> 2) ^ u2 ^ (u4 >> 2) ^ u4) & 0x1;if(!z) cnt24[L1][L2]++;}}}//处理count相加值for(int L1 = 0; L1 < 16; ++L1){for(int L2 = 0; L2 < 16; ++L2){abs(cnt24[L1][L2]);}}//外循环 for(int round24 = 0; round24 < 64; ++round24){//计算最大的2、4位对应密钥值 int max24 = -1;for(int L1 = 0; L1 < 16; ++L1){for(int L2 = 0; L2 < 16; ++L2){if(cnt24[L1][L2] > max24){max24 = cnt24[L1][L2];key52 = L1;key54 = L2;}}}cnt24[key52][key54] = 0;//根据2、4位对应密钥值计算1、3位对应密钥值; //linear13();memset(count13, 0, 512 * sizeof(int));for(int group = 1; group <= 8000; ++group){//提前处理要用到的对应位值 x_init = plaintext[group];for(int pos = 1; pos <= 12; ++pos){x[pos] = (x_init >> (16 - pos)) & 0x1;}y_init = ciphertext[group];for(int pos = 1, k = 12; pos <= 4; ++pos, k -= 4){y[pos] = (y_init >> k) & 0xf;}//开始计算count for(int L1 = 0; L1 < 16; ++L1){for(int L2 = 0; L2 < 16; ++L2){u1 = inverse_sBox[y[1] ^ L1];u2 = inverse_sBox[y[2] ^ key52];u3 = inverse_sBox[y[3] ^ L2];u4 = inverse_sBox[y[4] ^ key54];z = (x[1] ^ x[2] ^ x[4] ^ (u1 >> 3) ^ (u2 >> 3) ^ (u3 >> 3) ^ (u4 >> 3)) & 0x1;if(!z) count13[0][L1][L2]++;z = (x[9] ^ x[10] ^ x[12] ^ (u1 >> 1) ^ (u2 >> 1) ^ (u3 >> 1) ^ (u4 >> 1)) & 0x1;if(!z) count13[1][L1][L2]++;}}}//处理count相加值for(int L1 = 0; L1 < 16; ++L1){for(int L2 = 0; L2 < 16; ++L2){abs(count13[0][L1][L2]);abs(count13[1][L1][L2]);cnt13[L1][L2] = count13[0][L1][L2] + count13[1][L1][L2];}}for(int round13 = 0; round13 < 2; ++round13){int max13 = -1;for(int L1 = 0; L1 < 16; ++L1){for(int L2 = 0; L2 < 16; ++L2){if(cnt13[L1][L2] > max13){max13 = cnt13[L1][L2];key51 = L1;key53 = L2;}} }cnt13[key51][key53] = 0;tail_key = (key51 << 12) | (key52 << 8) | (key53 << 4) | key54;				//穷举int count, fore_key, k1, k2, k3, k4, k5;for(fore_key = 0; fore_key < 65536; ++fore_key){key = (fore_key << 16) | tail_key;//get_roundKey();k5 = tail_key;k4 = (key >> 4) & 0xffff;k3 = (key >> 8) & 0xffff;k2 = (key >> 12) & 0xffff;k1 = (key >> 16) & 0xffff;for(count = 1; count < 4; ++count){//encrypt: ciphertext = sBox_16[spBox[spBox[spBox[plaintext ^ k1] ^ k2] ^ k3] ^ k4] ^ k5; if((sBox_16[spBox[spBox[spBox[plaintext[count] ^ k1] ^ k2] ^ k3] ^ k4] ^ k5) != ciphertext[count]) break; }if(count == 4){flag = true;break;}}if(flag) break; }if(flag) break;}output();}return 0;
}

相关资料

差分分析【附code】


http://chatgpt.dhexx.cn/article/OKFZumbc.shtml

相关文章

序列密码分析——BM算法

一、 算法原理 1. 概念引入 生成与特征多项式 2. BM算法流程 二、 编程思路 1. 编程思路&#xff1a; BM算法整体流程较为清晰&#xff0c;其中包含几个核心判断&#xff1a;fnx 能否生成序列a的前n1位&#xff0c;各l值是否全相等&#xff0c;以及当l值出现不等情况下m-lm和…

第五讲 密码分析学

密码学学科分支 两个分支形成既对立又统一的矛盾体 1 安全的定义 安全的概念&#xff1a; “如果把一封信锁在保险柜中&#xff0c;把保险柜藏起来&#xff0c;然后告诉你 去看这封信&#xff0c;这并不是安全&#xff0c;而是隐藏&#xff1b; 相反&#xff0c;如果把一封信…

代换密码的密码分析—详细分析过程

代换密码的密码分析 使用单表代换密码&#xff0c;对于给出的密文进行分析并得到结果&#xff0c;了解加密解密过程 密文信息如下&#xff1a;AHNFCROACOAHNISEFLCIASFVCNWOSEAHNWSRLDWCAHCEIRNTONDATRCFFOSEOANNLTEDTLUMCEUMFRSMAHNNUITETDTTEDJTPTEAHNUOWCNLDOCAOATRCFFBTAS…

密码分析之单表代换原理详解与算法实现

【密码分析&#xff08;单表代换&#xff09;】 1. Equipment &#xff08;1&#xff09; operating system version &#xff1a;WIN 10 &#xff08;2&#xff09; CPU instruction set: x 64 &#xff08;3&#xff09; software&#xff1a;MATLAB R2020a 2.process P…

搞懂差分密码分析,看这篇文章就够了!!

搞懂差分密码分析&#xff0c;这篇文章就够了&#xff01;&#xff01; 关注我&#xff01;我会不定期发一些学习信安的心得体会 文章目录 **搞懂差分密码分析&#xff0c;这篇文章就够了&#xff01;&#xff01;**一、概述二、流密码的线性特性三、差分分析四、toy cipher-差…

线性密码分析(简单笔记)

线性密码分析(简单笔记) 关于差分密码分析的可以看差分密码分析读书报告。欢迎大家讨论留言。 1、发现 在1993年的欧洲密码年会上&#xff0c;日本学者Matsui提出了对DES算法的一种新的攻击方法&#xff0c;即线性密码分析.同年的国际密码年会上&#xff0c;Matsui发现了DES…

密码分析

破译密码体制的一般思路 经典密码分析 古典密码分析可以理解为从密文y中得到明文x&#xff0c;或者是密钥k。密码分析可以分为两类&#xff1a;一类是发现加密方法内部结构的分析攻击&#xff0c;一类是将加密算法看作是黑盒&#xff0c;试图测试所有可能密钥进行破解蛮力攻击…

密码分析(一):差分密码分析

文章目录 一、选择明文攻击&#xff08;chosen-plaintext attack, CPA&#xff09;二、差分密码分析&#xff08;differential cryptanalysis&#xff09;1.原理2.过程2.1 S盒差分分布表2.2 S盒的差分分析 总结参考文献 差分分析是一种选择明文攻击&#xff0c;其基本思想是&am…

密码分析(二):线性密码分析

​ 线性密码分析 一、已知明文攻击&#xff08;known-plaintext attack&#xff09;二、线性密码分析基本原理三、实例3.1 S盒线性逼近表3.2 例题分析3.2.1 分析算法的过程3.2.2 攻击过程加密攻击分析 具体过程 总结参考文献 在1993年欧洲密码年会上&#xff0c;日本学者Matsu…

Bluehost注册流程与问题

Bluehost注册流程与问题 第一步 进入Bluehost官方网站&#xff0c;点击下图中粉色的 Sign Up Now 进行注册 第二步 进入下一个界面后&#xff0c;你可以免费获得一个新的域名&#xff0c;BlueHost 对第一年是免费赠送一个域名&#xff0c;所以输入你想要的域名&#xff0c;然后…

BlueHost主机从零开始使用笔记,我踩过的坑你就不要踩了.

一:购买时,使用官方优惠码BH可以优惠30% 二:登陆后:点击可以显示你购买的主机,点击列表中的域名即可进入管理界面! 三:特别提醒!面板中的部分功能"比如在线文件 管理上传文件",只有使用chrome浏览器才可以,使用360浏览器的时候会出现上传不了的情况. 这里就是坑1 …

hosts文件 (屏蔽网站)

hosts文件 hosts文件是什么 Hosts是一个没有扩展名的系统文件&#xff0c;可以用记事本等工具打开。它是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”&#xff0c;当用户在浏览器中输入一个需要登录的网址时&#xff0c;系统会首先自动从Hosts文件中寻找对应…

2018年最新bluehost主机(中文站)购买教程,送30%优惠码!

Bluehost是一家老牌的美国主机商&#xff0c;行业经验达18年&#xff0c;以稳定性强&#xff0c;速度快著称&#xff0c;是国内使用较多主机之一&#xff0c;在个人站长中的口碑、使用流行度都很高。作为电子商务首选主机的BlueHost主机也深受国内外贸网站、仿牌产品等公司的喜…

bluehost虚拟主机有什么用?适合做什么网站呢?

bluehost作为比较知名的美国主机商&#xff0c;在国内也是非常的受欢迎&#xff0c;并且为了更好的服务国内用户&#xff0c;更是推出了中文站以及中文客服&#xff0c;为 国内用户提供更加本土化以及更加完善的服务&#xff0c;而且而且其机房专门对国内线路进行了优化&#x…

siteground主机和Bluehost主机哪个好,看完这篇你就有自己确定的答案

Siteground主机和Bluehost主机&#xff0c;哪个更好&#xff1f;哪个更适合外贸建站&#xff1f;读完这篇&#xff0c;你就有答案&#xff01; 说实话......我花了太多的时间来做决定。在决定买什么相机、加入什么健身房、甚至选择什么衣服时&#xff0c;都是如此。我花了一下…

linux虚拟主机建站程序,bluehost中国Linux虚拟主机建站过程

无论是我们初次接触海外主机服务商的&#xff0c;还是已经有过使用国内主机商建站经验的&#xff0c;可能初次接触BlueHost(无论是英文或者是中文官方网站产品)可能在应用上稍微有一些困惑。 因为大部分海外主机都使用的cPanel面板(Linux系统主机)&#xff0c;普通的用户肯定是…

蓝色主机 bluehost主机 启用CloudFlare的cdn加速服务

启用CloudFlare的cdn加速服务 1.到CDN官网&#xff08;www.cloudflare.com&#xff09;&#xff0c;注册账号并登陆进入。 2.点击页面右上角 Add Site,输入您的域名。 3.选择CDN套餐&#xff0c;一般用户选择FREE版本的 4.修改DNS记录&#xff0c;选择之后会自动扫描域名的DNS…

Siteground和Bluehost对比,我花了7天时间研究出了结果

Siteground主机和Bluehost主机&#xff0c;哪个更好&#xff1f;哪个更适合外贸建站&#xff1f;读完这篇&#xff0c;你就有答案&#xff01; 说实话......我花了太多的时间来做决定。在决定买什么相机、加入什么健身房、甚至选择什么衣服时&#xff0c;都是如此。我花了一下…

美国主机BlueHost vs HostEase

网站备案对于大部分个人站长而言&#xff0c;花费成本高、程序复杂&#xff0c;因此在挑选主机时&#xff0c;常选择免备案IDC服务商&#xff0c;如美国、香港主机&#xff0c;且前几日国内某免备案机房因个别网站涉及非法言论而配合相关部门采取停网整顿等&#xff0c;为此站长…

BlueHost主机建站教程

BlueHost主机支持一键安装WordPress程序与Discuz程序&#xff0c;下面就给大家演示一下如何一键安装WordPress程序和Discuz程序建站教程&#xff0c;希望对使用BlueHost主机用户有所帮助&#xff01; 腾讯云最新服务器活动--云服务器免费送。 试用领取有人能领到180天。 腾讯…