原来这么多人还不知道 WANNACRY 的加密算法啊,写了一个 Python 的加密和解密程序,仅供研究 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
aimoji
V2EX    程序员

原来这么多人还不知道 WANNACRY 的加密算法啊,写了一个 Python 的加密和解密程序,仅供研究

a href="Javascript:" Onclick="upVoteTopic(362805);" class="vote">
  •  
  •   aimoji 2017-05-21 18:51:56 +08:00 7560 次点击
    这是一个创建于 3070 天前的主题,其中的信息可能已经有所发展或是发生改变。

    发现 V2 上讨论勒索病毒的同学不在少数啊,本人就着自己的理解写了一段给任意文件加密的程序和解密程序,代码量不多,也并不复杂。
    本人学习 python 时间并不长,有啥错误的地方,欢迎大家指正和讨论。
    大神轻拍~下面是代码

    from Crypto.Cipher import AES import random,rsa,os x = [chr(y) for y in range(1,127)] key = ''.join(random.sample(x,16)) iv = ''.join(random.sample(x,16)) RSA_public_string = u'-----BEGIN RSA PUBLIC KEY-----\nMIGJAoGBALvD8lK3bgYhRPD3ybKZlo4AJLe6WrXR8SEVY09+W9IXOfl1mCjkxkko\nbykxfevl84qMgrHbXB+7YWN9x5Mgw3jWxSsg1RJcWP+4WKvx/n7i6c4f9R6ndfEC\n4Upa4ElomhiBt426eaCm5zbnUO3i2jc358b/1oHtsLQKBl6qqatXAgMBAAE=\n-----END RSA PUBLIC KEY-----\n' RSA_Pub_key = rsa.PublicKey.load_pkcs1(RSA_public_string) Encrypt_key_iv = rsa.encrypt(key+iv, RSA_Pub_key) Encrypt_key_iv_padding = Encrypt_key_iv+'\0'*(200-len(Encrypt_key_iv)) def Encrypt_File(PATH): f = open(PATH,'rb') filebuffsize = 100*1024*1024 w = open(PATH+'.WANNACRYCRY','wb') AES_cryptor = AES.new(key,AES.MODE_CBC,iv) w.write(Encrypt_key_iv_padding) while True: g = f.read(filebuffsize) length = len(g) if length == 0: print 'done!!' break if length < filebuffsize: g += (16-length%16)*'\0' w.write(AES_cryptor.encrypt(g)) print 'done!!' break w.write(AES_cryptor.encrypt(g)) print '++go--->' f.close() w.close() def Decrypt_File(PATH): RSA_private_string = u'-----BEGIN RSA PRIVATE KEY-----\nMIICYAIBAAKBgQC7w/JSt24GIUTw98mymZaOACS3ulq10fEhFWNPflvSFzn5dZgo\n5MZJKG8pMX3r5fOKjIKx21wfu2FjfceTIMN41sUrINUSXFj/uFir8f5+4unOH/Ue\np3XxAuFKWuBJaJoYgbeNunmgpuc251Dt4to3N+fG/9aB7bC0CgZeqqmrVwIDAQAB\nAoGAdgw8ZnrCZoI2KNVwbqQXPpGihAxaiWNDmUwsEsdbjRtjLI4dKuCiNU6BjMF7\n7Hq3Ag1TAeTq51xUX0utOoj0MvWWR99ajF1E9zEEdSbptIXXV+eEwQYVZ3OOPBvh\ne2MeXEqc1cRdaMc7MjkfT8HVTdNybFign4fBtdY29uyM4dECRQD1PRDpw5t85He1\nrYk1vxtahMlKzwvpQrdJlInldn6cRxqZ72ZZjCNQFHY97dNIQ5iOPxg5GQX2n0Ej\n6oIu2Cw6tfdMCQI9AMQBPsY3xbW9du6ptruOOQyL2/oCSOs/M/o6cfpSUQX1Ijmo\nEe6gK/vErUajm/HgUEyMWpfHlSVBpsXUXwJFAMW906FqZDm0TwJjRzvbOMcoQtbb\nVBNmBDyEVRx9C2Ifw0dUTgbuhJrRpPYSika+mog4P+PqVXCiwPeg5A+5pxBAIYNh\nAjxivuHaSNTRV69oU5Yc7WzuVjOvw6Dq63+LLBCp9Pie0L26YGMQXh9qis5lDR4O\ngFzUA83MM59/EpErj28CRCrYQEUUHnbA4cJihxKV7ZusZ/30R0IInTeH3U+bzum5\nKan0fug4DN6IrKk89jQGvr3y6rGFluiG4LS1LO46Rh/Zj+wh\n-----END RSA PRIVATE KEY-----\n' RSA_Private_Key = rsa.PrivateKey.load_pkcs1(RSA_private_string) f = open(PATH,'rb') w = open(PATH.rstrip('\.WANNACRYCRY'),'wb') g = f.read(200).rstrip('\0') key_iv_string = rsa.decrypt(g, RSA_Private_Key) key = key_iv_string[:16] iv = key_iv_string[16:] AES_decryptor = AES.new(key,AES.MODE_CBC,iv) filebuffsize = 100*1024*1024 while True: g = f.read(filebuffsize) length = len(g) if length == 0: print 'done!!' break if length < filebuffsize: w.write(AES_decryptor.decrypt(g).rstrip('\0')) print 'done!!' break w.write(AES_decryptor.decrypt(g)) print '--go--->' f.close() w.close() Encrypt_File(r'E:\Movie\xxx.mp4') Decrypt_File(r'E:\Movie\xxx.mp4.WANNACRYCRY') 

    按照一般分析,病毒作者是硬编码了 RSA 公钥在程序中,私钥掌握在自己手中,所以这只程序也按照病毒作者的方法来写。
    以上。。

    26 条回复    2017-05-22 16:42:21 +08:00
    loading
        1
    loading  
       2017-05-21 18:57:05 +08:00
    他们需要普及的是为什么会存在这么神奇的加密算法,一个密码加密,却要用另一个密码解开.
    yongSir
        2
    yongSir  
       2017-05-21 19:13:33 +08:00
    @loading 黑的好恨...
    真当所有人的密码学课程都在睡觉吗













    ...
    是的
    至少我再睡
    lxy
        3
    lxy  
       2017-05-21 19:13:33 +08:00
    以前用过类似的加密方法( RSA+AES )写了个对文本文件进行行级加密的 Demo。
    https://github.com/BlowingDust/SimpleRowLevelEncryption
    loading
        4
    loading  
       2017-05-21 19:27:11 +08:00
    @yongSir 您好,我到目前位置,课程里没有密码学,233.
    crab
        5
    crab  
       2017-05-21 19:33:26 +08:00
    @loading 上 V2 大部分知道对称加密 非对称加密吧。
    Tunar
        6
    Tunar  
       2017-05-21 19:42:19 +08:00 via Android
    @loading 不用密码学,大一信息安全导论里面就有
    zmj1316
        7
    zmj1316  
       2017-05-21 19:53:17 +08:00
    你确定人家是用 rsa 加密整个文件?一般不是随机一个 aes 密钥然后把密钥用 rsa 加密么?
    aimoji
        8
    aimoji  
    OP
       2017-05-21 20:11:03 +08:00
    @zmj1316 兄弟,好好看下代码
    bukip
        9
    bukip  
       2017-05-21 20:27:52 +08:00
    @loading 谁不知道啊?
    kdplus
        10
    kdplus  
       2017-05-21 20:31:37 +08:00
    漏了一点吧,实际上是有两对 rsa 的,一对是作者自己的,一对是受害者的。受害者的 publick 是用来加密 aes 的,其 private key 用作者的公钥加密了
    然后作者的私钥是用来解密受害者的 private key->然后解密 aes->然后解密文件
    aimoji
        11
    aimoji  
    OP
       2017-05-21 20:46:07 +08:00
    @kdplus 还有这种说法的?
    我看到的资料是这样的:两对 RSA,其中一对是有配对的,可以演示解密的,另一对就直接用来加密 AES 的密钥了。
    参见[http://www.freebuf.com/articles/system/134578.html]( http://www.freebuf.com/articles/system/134578.html)
    能提供一下你这个说法的链接吗?感谢!
    Kilerd
        12
    Kilerd  
       2017-05-21 20:52:07 +08:00
    不懂的人也看不懂你的这个程序。
    kdplus
        13
    kdplus  
       2017-05-21 21:02:17 +08:00
    @aimoji 啊,不好意思,源自我老师的 slide 所以也不好外传,也有可能是我没有理解清楚吧。不过根据老师的资料是,每个用户自己的那对,公钥存在 00000000.pky 里面,私钥加密了之后存在 00000000.eky 里面,然后作者的公钥是编在程序里面的。
    wzxjohn
        14
    wzxjohn  
       2017-05-21 21:14:03 +08:00
    @kdplus 你的理解是对的。
    @aimoji 不要看国内的翻译文章。。。。。。。。。
    kdplus
        15
    kdplus  
       2017-05-21 21:15:08 +08:00
    @wzxjohn 感谢噗噗,有点方的
    wzxjohn
        16
    wzxjohn  
       2017-05-21 21:19:02 +08:00
    @aimoji 居然还是我大腾讯写的。。。有点误导人。。。
    准确的说,程序内置了 2 个 RSA 公钥和 1 个 RSA 私钥,其中一对是用来演示的,一个是只有作者知道私钥的对应公钥。加密的时候,程序会生成另外一对 RSA 用户密钥,公钥存 00000000.pky,私钥在内存中用内置的只有作者知道私钥的对应公钥加密然后存 00000000.eky,实际加密 AES 密钥的是这个 00000000.pky。
    aimoji
        17
    aimoji  
    OP
       2017-05-21 21:24:50 +08:00
    @kdplus
    @wzxjohn
    Thanks,我再研究研究
    mengyaoss77
        18
    mengyaoss77  
       2017-05-22 00:00:45 +08:00 via Android
    话说这么长的密钥加密性能怎么样啊,这要遍历全盘文件,加密需要多久?有相关的报告没?
    loading
        19
    loading  
       2017-05-22 07:16:09 +08:00 via Android
    大家果然都用自己的常识来定位群众………
    难怪这么多 app 难用得崩溃!
    neighbads
        20
    neighbads  
       2017-05-22 08:26:04 +08:00
    @mengyaoss77 只有小文件是对称加密然后 RSA 加密对称密钥的。大文件都是本地的
    JerryCha
        21
    JerryCha  
       2017-05-22 08:42:58 +08:00
    更多人不知道的是这是加密,以为只是个病毒,搞的勒索界面崩溃就有解了
    ThunderEX
        22
    ThunderEX  
       2017-05-22 09:17:46 +08:00
    第 4-6 行不如改成:
    key = os.urandom(16)
    iv = os.urandom(16)
    这样?
    yanzixuan
        23
    yanzixuan  
       2017-05-22 09:23:43 +08:00
    不就是 AES 加密么?我还看过 AES 硬件加密的 verilog 代码。。
    nanpuyue
        24
    nanpuyue  
       2017-05-22 10:11:34 +08:00
    @JerryCha
    瞎说什么大实话……
    aimoji
        25
    aimoji  
    OP
       2017-05-22 11:10:30 +08:00   1
    @mengyaoss77 本地测试一个 4G 的视频文件,用时 1 分钟,用 C 的话估计会更快一点。
    @ThunderEX 不错,学到一招,谢哈
    uncleroot
        26
    uncleroot  
       2017-05-22 16:42:21 +08:00 via Android
    不是的哦。他这个是对称加密的密钥,然后密钥“用非对称加密”加密。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4333 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 01:02 PVG 09:02 LAX 18:02 JFK 21:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86