crypto之曼彻斯特编码

crypto之曼彻斯特编码点击蓝字关注我们通过对数字信号进行编码来表示数据不归零编码 曼切斯特编码 差分曼切斯特编码都是其编码方式差分曼彻斯特编码是一种使用中位转变来计时的编码方案 数据通过在数据位开始处加一转变来

点击蓝字

c1bc40d9afc77b0859608a157c2ed489.png

关注我们

通过对数字信号进行编码来表示数据不归零编码、曼切斯特编码、差分曼切斯特编码都是其编码方式

差分曼彻斯特编码是一种使用中位转变来计时的编码方案。数据通过在数据位开始处加一转变来表示。令牌环局域网就利用差分曼彻斯特编码方案。在 每个时钟周期的中间都有一次电平跳变,这个跳变做同步之用。在每个时钟周期的起始处:跳变则说明该比特是0,不跳变则说明该比特是1。差分曼彻斯特编码的优点为:收发双方可以根据编码自带的时钟信号来保持同步,无需专门传递同步信号的线路,因此成本低;缺点为:实现技术复杂。

曼彻斯特编码(Manchester Encoding),也叫做相位编码(PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。曼彻斯特编码被用在以太网媒介系统中。曼彻斯特编码提供一个简单的方式给编码简单的二进制序列而没有长的周期没有转换级别,因而防止时钟同步的丢失,或来自低频率位移在贫乏补偿的模拟链接位错误。在这个技术下,实际上的二进制数据被传输通过这个电缆,不是作为一个序列的逻辑1或0来发送的(技术上叫做反向不归零制(NRZ))。相反地,这些位被转换为一个稍微不同的格式,它通过使用直接的二进制编码有很多的优点。

差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示”0″或”1″,有跳变为”0″,无跳变为”1″。

曼彻斯特编码的编码规则是:在信号位中电平从低到高跳变表示1,在信号位中电平从高到低跳变表示0。

这个图就单独的表示曼彻斯特编码的0,1原理图 从低到高就是0,从高到低就是1

b2582aa314e51685876ce9882c2ffd5f.png

看曼彻斯特就简单的分成一段一段看他上升还是下降就可以表示出来

而差分曼彻斯特要看他前一个信号的值,比如这图里第一个就是不跳就用1表示,第二个信号从底下升到高处就跳了表示0,第三个也是不跳用1表示,第4个同理也是1,第5个跳了就是0。而差分的意思应该就是要把一段内拆成两段只看前一段,而后一半是用来同步时钟用的,顺便可以传输下一个数据来表示是否有跳

b44ee2412cd0b9525d98e21f275aa4ca.png

再来看下三种信号的区别

dc3e7349c9fc3824fede055873aff854.png

在来说下802.3曼彻斯特和标准曼彻斯特的区别,就是编码后的字符的区别。第一种G. E. Thomas, Andrew S. Tanenbaum1949年提出的,它规定0是由低-高的电平跳变表示,1是高-低的电平跳变。按此规则有:

  • 编码0101(即0x5),表示原数据为00;
  • 编码1001(0x9)表示10;
  • 编码0110(0x6)表示01;
  • 编码1010(0xA)表示11。

第二种IEEE 802.4(令牌总线)和低速版的IEEE 802.3(以太网)中规定, 按照这样的说法, 低-高电平跳变表示1, 高-低的电平跳变表示0。

  • 编码0101(0x5)表示11;
  • 编码1001(0x9)表示01;
  • 编码0110(0x6)表示10;
  • 编码1010(0xA)表示00;

顺便推荐一个可解,差分曼彻斯特和标准曼彻斯特和802.3曼彻斯特 http://www.pc6.com/softview/SoftView_606143.html

a94e621081462224c6122faf688aad8e.png

BUUOJ-Crypto-传感器

55A65556AA696AA 这是某压力传感器无线数据包解调后但未解码的报文(hex)    已知其ID为0xFED31F,请继续将报文完整解码,提交hex。 提示1:曼联

去网上抄了个脚本,这个脚本的转换其实就是应用了802.3曼彻斯特的规则取了1和3位,题目里给了id的话,可以看flag解出来是否含有id?吗,相当于校验是否正确的一个功能。

cipher='55A65556AA696AA' def iee(cipher): tmp='' for i in range(len(cipher)): a=bin(eval('0x'+cipher[i]))[2:].zfill(4) #补齐四位方便取1和3位 tmp=tmp+a[1]+a[3] #加上1和3位,就是应用了802.3的規則,或者定义一个字典替换也可以 print(tmp) plain=[hex(int(tmp[i:i+8][::-1],2))[2:] for i in range(0,len(tmp),8)] print(''.join(plain).upper()) iee(cipher) # tmp="011111" # flag="" # for i in range(0,len(tmp),8): # # plain=hex(int(tmp[i:i+8][::-1],2))[2:] # # print(''.join(plain).upper()) # flag+=((hex(int(tmp[i:i+8][::-1],2)))[2:]) # print(flag.upper())

或者用工具也可以直接出

fc52beadd5409c5202d6d7035bb98cfc.png

CISCN(全国大学生信息安全竞赛) 2016 传感器2

现有某ID为0xFED31F的压力传感器,已知测得压力为45psi时的未解码报文为: 55A65556A5A96AAA955 压力为30psi时的未解码报文为:55A65556A9AA6AA 请给出ID为0xFEB757的传感器在压力为25psi时的解码后报文,提交hex。  注:其他测量读数与上一个传感器一致。  tips:flag是flag{破译出的明文}

根据进制转换,转成十进制差5的话就是11

0xFED31F  45psi fffffed31ff8  30psi fffffed31fd7  找到两个psi差的地方,相减,括号内是十进制的数  f8(248)-d7(215)=0x21(33)  63(99)-42(66)=0x21(33) 15差33的话,5就是差11。除3即可 15   33 5    11 0xFEB757  CC=215-11  37=66-11       拿差值替换掉  25psi   fffffed31fCC       把检验位直接替换掉       fffffebcc       转成大写       FFFFFEBCC

CISCN(全国大学生信息安全竞赛) 2017 传感器1

已知ID为0x8893CA58的温度传感器的未解码报文为:3EAAAAA56A69AA55A95995A569AA 此时有另一个相同型号的传感器,其未解码报文为:3EAAAAA56A69AA556A965AAA95656 请解出其ID,提交flag{hex(不含0x)}。

先把给的字符串转成以一位字符串转为4位2进制的01数字。然后在以两位分割,因为差分曼彻斯特编码后面的数据是同步时钟和决定下一个传输的数据的,所以加进去之后。还要等于cc,让他继续下一步的操作,判断是否为01就是是否有跳。bintohex函数就是把01数据转为字符串。可以看下面另一个脚本的单独操作

#coding:utf-8 import re #hex1 = 'AAAAA56A69AA55A95995A569AA' # # 0x8893CA58 hex1 = 'AAAAA56A69AA556A965AAA95656' def bintohex(s1): s2 = '' s1 = re.findall('.{4}',s1) print ('每一个hex分隔:',s1) for i in s1: s2 += str(hex(int(i,2))).replace('0x','') print ('ID:',s2) def diffmqst(s): s1 = '' s = re.findall('.{2}',s) cc = '01' for i in s: if i == cc: s1 += '0' else: s1 += '1' cc = i # 差分加上cc = i print ('差分曼切斯特解码:',s1) bintohex(s1) if __name__ == '__main__': bin1 = bin(int(hex1,16))[2:] diffmqst(bin1)

edea863c389de769eecee7a1fd5ad79e.png

再贴一个脚本

str1 = '3EAAAAA56A69AA556A965AAA95656' s = '' for i in xrange(len(str1)/2): ch = str1[i*2 : i*2+2] b = bin(int(ch, 16))[2:] b = '0' * (8-len(b)) + b s += b print 's:'+s r = '' #因为此处除了前六位都是10和01,很明显是曼彻斯特,因而把前六位去掉即可看到正确的结果 s = s[6:] print 's:'+s for i in xrange(len(s)/2-1): c = s[i*2+1 : i*2+3] if c == '11' or c=='00': r += '1' else: r += '0' print "r:"+r ret ='' for i in xrange(len(r)/8): c = r[i*8 : i*8+8] print str(r[i*8 : i*8+8]) + ' ' + c ret += hex(int(c, 2 ))[2:].upper() print ret

左边去掉5个字符,右边去掉4个字符

str="0000" a=0 flag="" for i in range(0,len(str)/4): # print(str[0+(i*4):4+(i*4)]) # a+=1 flag+=hex(int(str[0+(i*4):4+(i*4)],2))[2:] # print(hex(int(str[0+(i*4):4+(i*4)],2))[2:]) # print(str[4:8]) print(flag)

7f264d23619bd37a31e15f0d5f5c0570.png

或者就是直接上工具

2607cd0ec36da283c33c8251048bb8e5.png

CISCN(全国大学生信息安全竞赛) 2017 传感器2

已知ID为0x8893CA58的温度传感器未解码报文为:3EAAAAA56A69AA55A95995A569AA 为伪造该类型传感器的报文ID(其他报文内容不变),请给出ID为0xDEADBEEF的传感器1的报文校验位(解码后hex),以及ID为0xBAADA555的传感器2的报文校验位(解码后hex),并组合作为flag提交。 例如,若传感器1的校验位为0x,传感器2的校验位为0xABCDEF,则flag为flag{ABCDEF}。
0024D 8893CA58 41 81 0024D 8845ABF3 41 19 把上一题的数据拿过来查看,格式应该是0024+id+41+xx(校验) 其他格式都是固定的,即可判别最后两位为校验

把题目给的数据,分开找到校验的值。如果是按一位=4位,即为8位,可以尝试crc8

>>> bin(int('A',16)) '0b1010'

7e2688dbd6a6228713de85d30676217a.png

可以看到就是等于校验值的

5a8f2023a289fcd3f05a55ce77ecbf00.png

直接就拿题目要求的替换掉id即可

0xDEADBEEF 024DDEADBEEF41 0xBAADA555 024DBAADA55541 >>> hex(c8(binascii.unhexlify('024DDEADBEEF41'))) '0xb5' >>> hex(c8(binascii.unhexlify('024DBAADA55541'))) '0x15'

或者在线解也可以

abdf276935a4e474ee72044cf776165c.png

参考链接:

[1] https://blog.csdn.net/_37790902/article/details/79616450
[2] https://blog.csdn.net/Enderman_xiaohei/article/details/104331317
[3] http://www.pc6.com/softview/SoftView_606143.html
[4]https://blog.csdn.net/zz_Caleb/article/details/89331290
[5]https://zhuanlan.zhihu.com/p/27827585
[6]https://blog.csdn.net/_43165101/article/details/97395191

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:

文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关

通过审核并发布能收获200-800元不等的稿酬。

更多详情,点我查看!

d5310feded8b94323ed2e3f9629a3fe4.gif

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225692.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:45
下一篇 2026年3月17日 上午8:46


相关推荐

  • python+pycharm+pyqt5安装教程「建议收藏」

    python+pycharm+pyqt5安装教程「建议收藏」本文描述Windows系统下如何安装Python+PyCharm+PyQt5,并通过PyQt5采用两种方式设计GUI界面:1.直接使用代码设计界面2.先使用QtDesigner进行可视化设计,然后将生成的.ui文件转换成.py文件安装Python+PyCharm+PyQt51、安装Python访问官网https://www.python.org/,下载并安装你的目标Python版本。2、安装PyQt51)进入cmd界面。执行命令pipinstallpyqt5pyq

    2022年8月25日
    10
  • Only fullscreen activities can request orientation终极解决方法

    Only fullscreen activities can request orientation终极解决方法适配到安卓 O 适配了 Service 通知等等 天真的以为一切都结束了 换菊花厂手机试 APP 直接 crash 这简直是何等的卧槽 错误提示如下 还有一种和这个差不多 就差一个单词 一个是 onCreate 时候 另一个是设置方向之后 Onlyfullscre 先参考了一下网上各位大佬的文章 以下面的为例 https

    2026年3月17日
    2
  • 伯努利、辛钦大数定律、中心极限定理

    伯努利、辛钦大数定律、中心极限定理大数定律 一个随机变量序列 X1 X2 Xn X 1 X 2 X n X1 X2 Xn a 为常数 若对任意正数 varepsilon 有 lim n P Xn a

    2026年3月19日
    1
  • sublimetext3激活码(注册激活)

    (sublimetext3激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsa…

    2022年3月25日
    264
  • java冒泡排序代码_Java冒泡排序

    java冒泡排序代码_Java冒泡排序一、冒泡排序:利用冒泡排序对数组进行排序二、基本概念:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2…

    2022年7月8日
    16
  • 自定义web框架

    HTTP协议HTTP协议是HyperTextTransferProtocol(超文本传输协议)的缩写,是用于从万维网(WWW:WorldWideWeb)服务器传输超文本到本地浏览器的传送

    2022年3月29日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号