跳转到主要内容

一个小型的Python模块,用于常见的CTF加密函数。

项目描述

crypto-commons

一个小型的Python模块,用于常见的CTF加密函数。如果您认为缺少某些功能,或者您有一些有趣的代码要分享,请随时贡献。

通常我们希望尽可能减少依赖,因此很可能包含大量外部依赖的拉取请求将不会合并。

记录在案:这不是一个通用目的的加密库,也不是生产级别的加密实现!您不应在实际应用中使用此代码中的任何部分。

我们想要解决的问题

  • 需要不断寻找某些不太常见算法(如Damgard-Jurik)或不太常见场景(如RSA与素数幂)的实现。
  • 为了使用一些简单的函数,需要安装许多不同的库。
  • 在不同环境中安装依赖项的问题。特别是Python 2/3不兼容性和编译的C模块。
  • 反复编写相同的代码,并在调试错别字和小的错误上浪费时间。

我们希望遵循的一般准则

  • 将实现拆分为小步骤。CTF任务通常需要更改某些算法,因此能够从较小的块中组装算法将很棒。
  • 提供清晰的接口。面向对象代码可能适合生产级软件,但在尝试将您的原语转换为库所需的对象时会使事情更复杂。特别是当您缺少某些参数时,这些参数对于您需要的函数不是必需的。
  • 不要进行除当前函数必需之外的其他断言和检查。一些库在CTF环境中不可用,因为它们会自动检测到一些“无效”的参数而失败,而实际上我们知道参数是错误的,我们需要额外的步骤来解决任务。

安装

sudo python setup.py install

使用示例

基本使用

from crypto_commons import generic

#xor a hex array with a string and print the result
a = [0x61, 0x53, 0x40, 0x47, 0x42, 0x59, 0x45, 0x5c, 0x08]
b = "123456789"

b = map(ord, b)

xored = map(chr, generic.xor(a, b))

print(''.join(xored))

qiwi CTF,加密 400

from crypto_commons.generic import long_to_bytes
from crypto_commons.rsa.rsa_commons import hastad_broadcast


def main():
    n1 = 95118357989037539883272168746004652872958890562445814301889866663072352421703264985997800660075311645555799745426868343365321502734736006248007902409628540578635925559742217480797487130202747020211452620743021097565113059392504472785227154824117231077844444672393221838192941390309312484066647007469668558141
    n2 = 98364165919251246243846667323542318022804234833677924161175733253689581393607346667895298253718184273532268982060905629399628154981918712070241451494491161470827737146176316011843738943427121602324208773653180782732999422869439588198318422451697920640563880777385577064913983202033744281727004289781821019463
    n3 = 68827940939353189613090392226898155021742772897822438483545021944215812146809318686510375724064888705296373853398955093076663323001380047857809774866390083434272781362447147441422207967577323769812896038816586757242130224524828935043187315579523412439309138816335569845470021720847405857361000537204746060031
    c1 = 64830446708169012766414587327568812421130434817526089146190136796461298592071238930384707543318390292451118980302805512151790248989622269362958718228298427212630272525186478627299999847489018400624400671876697708952447638990802345587381905407236935494271436960764899006430941507608152322588169896193268212007
    c2 = 96907490717344346588432491603722312694208660334282964234487687654593984714144825656198180777872327279250667961465169799267405734431675111035362089729249995027326863099262522421206459400405230377631141132882997336829218810171728925087535674907455584557956801831447125486753515868079342148815961792481779375529
    c3 = 43683874913011746530056103145445250281307732634045437486524605104639785469050499171640521477036470750903341523336599602288176611160637522568868391237689241446392699321910723235061180826945464649780373301028139049288881578234840739545000338202917678008269794179100732341269448362920924719338148857398181962112
    print(long_to_bytes(hastad_broadcast([(c1, n1), (c2, n2), (c3, n3)])))


main()

qiwi CTF 再次,加密 400

import gmpy2
from crypto_commons.generic import long_to_bytes
from crypto_commons.rsa.rsa_commons import hensel_lifting, modinv


def main():
    n = 158168890645747636339512652656727367370140893295030333823920833363025940906055891357316994482461476576118114207681214323912652527927215053128809927932495206979837034713724140745400652922252749994983891690894724877897453440237829719520264826887839607084620792280551479756249230842706713662875715392719130358089
    e = 65537
    c = 140823625180859595137593494178968497314300266616869468408596741823165198698204065579249727536890649445240801729293482339393915146972721826733382396566284303449925618355682242041225432010603850355326962069585919704623290128021782032477132287121179121257196031074006842188551083381364957799238533440938240326919
    p = gmpy2.isqrt(n)
    k = 2
    base = pow(c, modinv(e, p - 1), p)  # solution to pt^e mod p
    f = lambda x: pow(x, e, n) - c
    df = lambda x: e * x
    r = hensel_lifting(f, df, p, k, base)  # lift pt^e mod p to pt^e mod p^k
    for solution in r:
        print(long_to_bytes(solution))

main()

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分布

crypto-commons-0.0.4.tar.gz (17.9 kB 查看哈希值)

上传时间 源代码

构建版本

crypto_commons-0.0.4-py2-none-any.whl (21.4 kB 查看哈希值)

上传时间 Python 2