A5流密码算法

0x01 A5/1流密码算法的基本用法

作用:
用于蜂窝式移动电话系统语言和数字加密
过程:
A5/1算法用于用户的手机到基站之间的通信加密,通信内容到基站后先解密变成明文,然后再进行基站到基站之间,以及基站到用户手机之间的信息加密,完成通信内容在通信过程的加密保护。
在这里插入图片描述
应用环节:
只需考察用户A到基站1之间通信内容的加解密,中间消息的传送由基站到基站之间的加密完成,而接受方B对消息的加解密与用户A到基站1之间的通信完全类似,只不过用户B先解密消息

基本密钥KA1
预置在SIM卡中,与基站1共享。
•生存期:一旦植入SIM卡将不再改变。
•用途:用来分配用户和基站之间的会话密钥。

会话密钥k
在每次会话时,基站产生一个64比特的随机数k。仅用于一次通话时间。

加密方式
一次通话使用一个会话密钥,对每帧使用不同的帧密钥。按每帧228比特分为若干帧后逐帧加密,每帧处理方式相同,其中114比特为发送,114比特用来接收数据。明文密钥流结合方式:逐位异或

0x02 密钥流产生步骤

在这里插入图片描述
A5/1算法使用3个线性反馈移位寄存器,简称为LFSR。三个寄存器的分别为19位、22位、23位。这里要使用三个共包含64位二进制的线性反馈移位寄存器,这个设计绝非偶然。绝非巧合的是,A5/1算法的密钥K也是64位。该密钥用于三个线性反馈移位寄存器的初始填充,也就是说,该密钥用于充当三个寄存器的初始值。这三个寄存器用密钥填充之后,就可以开始生成密钥流了。

每个回合步骤可以拆分为:取KEY,反馈多项式(Feedback Polynomial),位移

1、取key

取三个寄存器的最后一位,也就是19位、22位、23位,进行XOR操作,得到的结果为这一轮Key的一位。

2、反馈多项式

LFSR进行位移的前置操作,具体可以分成两步:判定是否需要进行位移,判定新的充填的值

2.1 判断是否需要移位

这里使用的是择多原则,三个寄存器中选择三个钟控信号,19位中的第8位,22位,23位中皆为第10位,两种二进制0,1,必定有0或1数量居多,居多的寄存器需要进行位移操作。就是上图的黄色部分

2.2 判定新的充填的值:

这里需要用到反馈多项式:
在这里插入图片描述
XOR后得到的值是充填到第0位的值。

3、移位

三个寄存器,由上一步的判定后进行位移,空出第0位用于充填反馈多项式得到的值。

0x03 密钥产生例子

1、假设有以下三个初始移位寄存器(先只要知道有三个移位寄存器(就是普通寄存器),分别有19位,22位,23位)
在这里插入图片描述

2、然后是如何开始生成秘钥的,假设有三个寄存器目前的状态是这样:
在这里插入图片描述
3、接下来开始进行规定的流程
取key,得到第一个密钥值为1
(1)首先找到X8=1,Y10=0,Z10=1
(2)取数量最多的作为结果M=Maj(X8,Y10 , Z10 )= Maj(1,0, 1)=1;(如果是M=Maj(0,0,1)=0)
(3)因为M=1,且X8=1,M=X8,所以X寄存器需要左移一位,那么因为左移,第一位就空出来了,则 X0=1,  所以最后X寄存器变为
在这里插入图片描述
同理:
在这里插入图片描述
在这里插入图片描述
所以最后得到的三个移位寄存器是
在这里插入图片描述
秘钥是S0=1,

就这样得到了另一位秘钥,如果需要64位秘钥,则按照上述进行循环64次操作即可。

0x04 A5/1算法弱点

移位寄存器太短容易遭受穷举攻击,A5/1算法把主密钥作为算法中三个寄存器的初始值,长度为64比特。如果利用已知明文攻击,只需要知道其中两个寄存器的初始值,就可以计算出另一个寄存器的初始值,这只需要240步就可以得出寄存器LFSR-1和LFSR-2的结构。
利用了GSM通信加密中的两个安全漏洞,可以通过离线迭代计算生成一个彩虹表,它包含有密钥和其相对应的输出密码。这个彩虹表的大小为984GB。得到了彩虹表之后,安全专家就可以在短短的九秒内确定用于加密通信数据的密钥。

参考:
https://www.cnblogs.com/gambler/p/9074356.html
https://blog.csdn.net/jerry81333/article/details/78641362
https://www.bilibili.com/video/av58596164?p=17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mcq 队列_MCQ | 密码学中作为IDEA,DES,AES,RSA的块密码

mcq 队列1) In the AES-128 algorithm there are mainly __________ similar rounds and _________ round is different from other round. 1)在AES-128算法中,主要有__________个相似的回合,而_________个回合与其他回合不同。 5 similar rounds havin…

Cookie存取和IE页面缓存的问题

最近老是发现在IE里会有Cookie的问题,如IE下面无法登出,或无法登录,或者登录后信息却无法取到,而Firefox下面一直是通过的,都试过好多次了,今天终于找回的主要的原因;Cookie的问题:首…

数组(一维、二维)

1, 动态初始化: int [] arr new int [5] 如果直接输出arr; System.out.print(arr); 结果为: [I13b64eb [:表示一维数组,几个就代表几维数组; I:表…

Extjs TextField扩展

Extjs.form.TextField的默认在输入框后面是不能加入文字。在网上找到此方法以备查用。 /** * 重写textfield,为其多加一个属性sideText,在文本框后面加html * author rms * create 2011-08-17*/Ext.override(Ext.form.TextField, { sideText : , onRender : functi…

远控免杀专题10--TheFatRat免杀

0x01 免杀能力一览表 几点说明: 1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。 2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

c++语句switch语句_错误:案例标签不在C中的switch语句内

c语句switch语句The error: case label not within a switch statement occurs in C language with switch case statement, when switch (variable/value) statement is terminated by the semicolon (;). 错误:当switch(变量/值)语句由分号( ; )终止时&#xff0c…

远控免杀专题11-Avoidz免杀

0x01 免杀能力一查表 几点说明: 1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。 2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

使用方法实现数组的对调与输出

package asdasqq; import java.util.*; public class asdasdad { public static void main(String[] args) { Scanner wsqnew Scanner(System.in); int qwsq.nextInt();//输入q,表示数组arr的大小; int [] arrnew int [q];//定义一个整型数组arr&a…

CAP与流密码

CAP 中流密码的操作 1 、Cipher 下拉菜单中选中Stream 2,设置LFSR 参数,设置好参数后点击Set Key LFSR Size:表示有几个寄存器 Initial key:寄存器的初始状态,每个寄存器初始值是0或1,放在一起转化成十六进制 Feedbac…

高性能Javascript 用局部变量缓存集合元素

document.images; 由于集合元素是处于实时状态的实时存在,它与底层dom连接着。在遍历它的每一个属性或length时都会带来查找,从而性能开销很高。 这里是有关集合元素在循环处理时的优化原则 一、用变量缓存集合元素 二、在循环在缓存集合length属性 三、在循环中用变…

QTP中使用描述性编程

我们简单介绍一下有关功能测试的基本方法,这实际上对于所有自动化功能测试产品来说都是一样的。一般情况下,用QTP来进行功能测试的基本方法主要包括三个主要阶段: 1、创建测试或组建 首先可以通过在应用程序或网站上录制会话,或…

字符数组的查找法

package asdasqq; import java.util.*; public class suoying { public static void main(String[] args) { Scanner wsqnew Scanner(System.in); System.out.print(“请输入对应的星期范围在一~日:”); int week wsq.nextInt(); System.out.print(getWeek(…

结构和其他数据形式

0x01 结构声明 结构声明(structure declaration)描述了一个结构的组织布局。 struct book{char title[MAXTITL];char author[MAXAUTL];float value; };该声明描述了一个由两个字符数组和一个float类型变量组成的结构。该声明并未创建实际的数据对象&am…

Java StringBuffer char charAt(int index)方法与示例

StringBuffer类char charAt(int index) (StringBuffer Class char charAt(int index)) This method is available in package java.lang.StringBuffer.charAt(int index). 软件包java.lang.StringBuffer.charAt(int index)中提供了此方法。 This method is used to return the …

Form验证

代码写 N 久了,总想写得别的。这不,上头说在整合两个项目,做成单一登录(Single Sign On),也有人称之为“单点登录”。查阅相关文档后,终于实现了,现在把它拿出来与大家一起分享。或许…

添加LinkServer的两句代码

sp_addlinkedserver linkserver,,SQLOLEDB,linkserver.comsp_addlinkedsrvlogin linkserver,false,null,sa,asdf第一句是添加一个名字为linkserver的链接服务器 地址是linkserver.com第二句是针对第一句添加的Linkserver添加一个访问帐号两句不能同时执行 要第一句执行成功后执…

数组的基本查找

package asdasqq; import java.util.*; public class jibenchazhao { public static void main(String[] args) { int [] arr{11,22,33,44,55,66,77}; Scanner wsqnew Scanner(System.in); int qwsq.nextInt();//输入q,即为查找的数; int index g…

Cobaltstrike4.0系列教程(一)----简介与安装

0x01-Cobaltstrike简介 Cobalt Strike是一款美国Red Team开发的渗透测试神器,常被业界人称为CS。这款神器许多大佬们都已经玩的很6,我一个菜鸡玩的略有心得,因此写一下自己的Cobaltstrike系列文章,希望给各位一点帮助。 最近这个…

c ++类成员函数_仅使用C ++创建具有公共数据成员的类

c 类成员函数Let’s understand 让我们来了解 What is data member? 什么是数据成员? Any variable declared inside the class in known as data member of the class. 在类内部声明的任何变量,称为类的“数据成员”。 What is public data member…

转:php.ini中文版

[PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化, ; 在使用新的PHP版本前,研究一下php.ini会有好处的 ;;;;;;;;;;;;;;;;;;; ; 关于这个文件 ; ;;;;;;;;;;;;;;;;;;; ; 这个文件控制了PHP许…