首页 > 其他分享 >AES key — encoded in the machine readable zone of a European ePassport

AES key — encoded in the machine readable zone of a European ePassport

时间:2023-10-09 21:26:28浏览次数:40  
标签:kab AES return ePassport zone def European

AES key

— encoded in the machine readable zone of a European ePassport

题目地址

AES key — encoded in the machine readable zone of a European ePassport

解题过程

第一步:补全给出的密钥

通过查阅题目附录里提到的文档,可以找到校验位的具体机制,依据解释可求出初始密钥"?"处的取值
image

def pre(k):
    k = list(k)
    weights = [7, 3, 1, 7, 3, 1]
    sum = 0
    for i in range(21, 27):
        sum += int(k[i]) * weights[i - 21]
    sum %= 10
    k[27] = str(sum)
    return ''.join(k)

第二步:根据文档对\(K_{seed}\)的描述还原MRZ_information和\(K_{seed}\)

image

def getK_seed(k):
    mrz_imt = k[:10] + k[13:20] + k[21:28]
    H_SHA1 = sha1(mrz_imt.encode()).hexdigest()
    return H_SHA1[:32]

第三步:根据附录五求出\(K_{ENC}\),也就是Key

image
由于我们只需要求出\(K_{ENC}\),所以只需要令c='00000001'即可

def getKab(k):
    kab = []
    k = '{:064b}'.format(int(k, 16))
    for i in range(0, len(k), 8):
        kab.append(k[i:i + 7])
        if k[i:i + 7].count('1') % 2 == 0:
            kab.append('1')
        else:
            kab.append('0')
    return hex(int(''.join(kab), 2))[2:]


def getKey(k):
    k = k + '00000001'
    H = sha1(bytes.fromhex(k)).hexdigest()
    return getKab(H[:16]) + getKab(H[16:32])

第四步:利用求得的Key求出明文

用CBC模式下的AES加密即可直接求出密文

def getP(C, k):
    C = b64decode(C)
    aes =  AES.new(bytes.fromhex(k), AES.MODE_CBC, bytes.fromhex('0'*32))
    return aes.decrypt(C).decode()

运行结果

image

完整代码

from hashlib import sha1
from base64 import b64decode
from Crypto.Cipher import AES

C = '9MgYwmuPrjiecPMx61O6zIuy3MtIXQQ0E59T3xB6u0Gyf1gYs2i3K9Jxaa0zj4gTMazJuApwd6+jdyeI5iGHvhQyDHGVlAuYTgJrbFDrfB22Fpil2NfNnWFBTXyf7SDI'
K = '12345678<8<<<1110182<111116?<<<<<<<<<<<<<<<4'


def pre(k):
    k = list(k)
    weights = [7, 3, 1, 7, 3, 1]
    sum = 0
    for i in range(21, 27):
        sum = (sum + int(k[i]) * weights[i - 21]) % 10
    k[27] = str(sum)
    return ''.join(k)


def getK_seed(k):
    mrz_imt = k[:10] + k[13:20] + k[21:28]
    H_SHA1 = sha1(mrz_imt.encode()).hexdigest()
    return H_SHA1[:32]


def getKab(k):
    kab = []
    k = '{:064b}'.format(int(k, 16))
    for i in range(0, len(k), 8):
        kab.append(k[i:i + 7])
        if k[i:i + 7].count('1') % 2 == 0:
            kab.append('1')
        else:
            kab.append('0')
    return hex(int(''.join(kab), 2))[2:]


def getKey(k):
    k = k + '00000001'
    H = sha1(bytes.fromhex(k)).hexdigest()
    return getKab(H[:16]) + getKab(H[16:32])

def getP(C, k):
    C = b64decode(C)
    aes =  AES.new(bytes.fromhex(k), AES.MODE_CBC, bytes.fromhex('0'*32))
    return aes.decrypt(C).decode()

if __name__ == '__main__':
    K = pre(K)
    K_seed = getK_seed(K)
    Key = getKey(K_seed)
    P = getP(C, Key)
    print(P)

感想

对加密方式有了更新的认识,通过设置多个且校验方式不同的校验位进行检验的方式很有趣。这个题目的实现代码不长,但基于飞行护照的背景,也让我认识深刻:密码在生活中,无处不在。

标签:kab,AES,return,ePassport,zone,def,European
From: https://www.cnblogs.com/FlyingLight/p/17752863.html

相关文章

  • maestro studio 简化编写测试worflow 的工具
    对于自己编写workflow有时可能会比较复杂,maestrostudio提供了基于ai的强大能力,同时可以实时模拟器的页面与web集成对于测试人员来说是一个很不错的选择,很值得看看,同时因为maestrostudio也是开源的,代码上也值得学习参考参考资料https://maestro.mobile.dev/getting-started......
  • maestro ios 简单试用
    主要是体验下maestro的使用预备对于ios需要以来facebook的idb需要安装参考安装命令brewtapfacebook/fbbrewinstallfacebook/fb/idb-companion试用下载示例直接使用maestro自带的 maestrodownload-samples解压......
  • maestro 移动ui 自动化测试框架
    maestro是一个移动ui自动化测试框架,基于yaml定义就可以快速的实现移动ui的测试,支持ios,android,reactnatice,fluttermaestro安装简单,就是一个二进制文件说明对于需要进行移动端自动化测试的团队maestro是一个很值得使用的工具参考资料https://github.com/mobile-dev-inc/ma......
  • Go - Representing Time Zones
    Problem: YouwanttoincludethetimezoneinformationinaTimestruct.Solution: TheTimestructincludesaLocation,whichistherepresentationofthetimezone. Atimezoneisanareathatfollowsastandardtimethatroughlyfollowslongitudebu......
  • AES加密解密
    key要16位的字符串。publicclassAESHelper{///<summary>///AES加密///</summary>///<paramname="text">加密字符</param>///<paramname="key">密钥</param>/......
  • 博科交换机划zone实战
    1、查看主Esxi主机的wwn号,登录博科A交换机,输入以下命令查看端口对应的WWN号,switchshow 2、再登录ESXI主机确认WWN是否能对应得上 3、对博科交换机创建别名和划zone,两台博科交换机都必须做配置。alicreate"ESXI_F7PDUX060","51:40:2e:c0:18:1c:85:30;51:40:2e:c0:18:1c......
  • 报错:Invalid bound statement (not found): org.example.mapper.ZoneInfoMapper.getA
    错误org.apache.ibatis.binding.BindingException:Invalidboundstatement(notfound):org.example.mapper.ZoneInfoMapper.getAll解决方法<resources><resource><directory>src/main/java</directory>&......
  • com.qq.weixin.mp.xml.AesException: 签名验证错误
    【已解决】AesException:签名验证错误问题原因:部分语言在url接收时会将+转化为空格导致出错的。这个问题企业微信官方客服两天也没有给个解释,突然就解决了。生气...... ......
  • MacOS 使用 Asan 编译 C++报警告malloc: nano zone abandoned due to inability to re
    问题clang(llvm)编译c++程序,带内存问题检查工具选项-fsanitize=address-fsanitize=undefined之后出现:malloc:nanozoneabandonedduetoinabilitytoreservevmspace.解决vi~/.zshrc#加入:exportMallocNanoZone=0source~/.zshrc参考:ios-malloc:nanozonea......
  • crash —— 获取系统NODE、ZONE、SECTION、MEMBLOCK等信息
    crash>kmem-nNODESIZEPGLIST_DATABOOTMEM_DATANODE_ZONES0100925439ffff88e03ffc1000----ffff88e03ffc1000ffff88e03ffc5000......