V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aimoji
V2EX  ›  程序员

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

  •  
  •   aimoji · 2017-05-21 18:51:56 +08:00 · 6975 次点击
    这是一个创建于 2503 天前的主题,其中的信息可能已经有所发展或是发生改变。

    发现 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   ·   我们的愿景   ·   实用小工具   ·   1286 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:48 · PVG 01:48 · LAX 10:48 · JFK 13:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.