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

2017-05-21 18:51:56 +08:00
 aimoji

发现 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 公钥在程序中,私钥掌握在自己手中,所以这只程序也按照病毒作者的方法来写。
以上。。

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













...
是的
至少我再睡😝
lxy
2017-05-21 19:13:33 +08:00
以前用过类似的加密方法( RSA+AES )写了个对文本文件进行行级加密的 Demo。
https://github.com/BlowingDust/SimpleRowLevelEncryption
loading
2017-05-21 19:27:11 +08:00
@yongSir 您好,我到目前位置,课程里没有密码学,233.
crab
2017-05-21 19:33:26 +08:00
@loading 上 V2 大部分知道对称加密 非对称加密吧。
Tunar
2017-05-21 19:42:19 +08:00
@loading 不用密码学,大一信息安全导论里面就有
zmj1316
2017-05-21 19:53:17 +08:00
你确定人家是用 rsa 加密整个文件?一般不是随机一个 aes 密钥然后把密钥用 rsa 加密么?
aimoji
2017-05-21 20:11:03 +08:00
@zmj1316 兄弟,好好看下代码
bukip
2017-05-21 20:27:52 +08:00
@loading 谁不知道啊?
kdplus
2017-05-21 20:31:37 +08:00
漏了一点吧,实际上是有两对 rsa 的,一对是作者自己的,一对是受害者的。受害者的 publick 是用来加密 aes 的,其 private key 用作者的公钥加密了
然后作者的私钥是用来解密受害者的 private key->然后解密 aes->然后解密文件
aimoji
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
2017-05-21 20:52:07 +08:00
不懂的人也看不懂你的这个程序。
kdplus
2017-05-21 21:02:17 +08:00
@aimoji 啊,不好意思,源自我老师的 slide 所以也不好外传,也有可能是我没有理解清楚吧。不过根据老师的资料是,每个用户自己的那对,公钥存在 00000000.pky 里面,私钥加密了之后存在 00000000.eky 里面,然后作者的公钥是编在程序里面的。
wzxjohn
2017-05-21 21:14:03 +08:00
@kdplus 你的理解是对的。
@aimoji 不要看国内的翻译文章。。。。。。。。。
kdplus
2017-05-21 21:15:08 +08:00
@wzxjohn 感谢噗噗,有点方的
wzxjohn
2017-05-21 21:19:02 +08:00
@aimoji 居然还是我大腾讯写的。。。有点误导人。。。
准确的说,程序内置了 2 个 RSA 公钥和 1 个 RSA 私钥,其中一对是用来演示的,一个是只有作者知道私钥的对应公钥。加密的时候,程序会生成另外一对 RSA 用户密钥,公钥存 00000000.pky,私钥在内存中用内置的只有作者知道私钥的对应公钥加密然后存 00000000.eky,实际加密 AES 密钥的是这个 00000000.pky。
aimoji
2017-05-21 21:24:50 +08:00
@kdplus
@wzxjohn
Thanks,我再研究研究
mengyaoss77
2017-05-22 00:00:45 +08:00
话说这么长的密钥加密性能怎么样啊,这要遍历全盘文件,加密需要多久?有相关的报告没?
loading
2017-05-22 07:16:09 +08:00
大家果然都用自己的常识来定位群众………
难怪这么多 app 难用得崩溃!
neighbads
2017-05-22 08:26:04 +08:00
@mengyaoss77 只有小文件是对称加密然后 RSA 加密对称密钥的。大文件都是本地的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/362805

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX