Python AES加密(PyCrypto)-> AS3解密(as3Crypto)使用AES

1 投票
1 回答
891 浏览
提问于 2025-04-18 05:20

我有一个Django应用,它可以给Flash应用提供加密的媒体文件。在Python中加密是用PyCrypto这个库来实现的,具体代码如下(我也附上了描述,以防有用):

 def encrypt_aes(key, text):
    try:
        raw = _pad(text)
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(key, AES.MODE_CBC, iv)
        return base64.b64encode(iv + cipher.encrypt(raw))
    except Exception as e:
        print e.message
        return text


def decrypt_aes(key, text):
    try:
        enc = base64.b64decode(text)
        iv = enc[:AES.block_size]
        cipher = AES.new(key, AES.MODE_CBC, iv)
        return _unpad(cipher.decrypt(enc[AES.block_size:]))
    except Exception as e:
        print e.message
        return text

    def _pad(s):
    bs = 16
    return s + (bs - len(s) % bs) * chr(bs - len(s) % bs)

    def _unpad(s):
        return s[:-ord(s[len(s) - 1:])]

我还不能解密用Python生成的媒体文件(这些文件是通过LoaderMax这个工具下载的,使用的是'数据加载器')。我的AS3代码(使用AS3Crypto)如下:

public static function decipher(_key:String):void{
    key=_key;
    cipher = Crypto.getCipher("simple-aes-cbc", Hex.toArray(key));
    cipher.decrypt(ByteArray(_content));    
}

我遇到了

范围错误:错误 #2006

我怀疑是因为在Python中我使用的是64位的基础,但我觉得AS3的ByteArray是32位的。我尝试了下面的代码,但还是得到了同样的错误。

cipher.decrypt(ByteArray(com.hurlant.util.Base64.decodeToByteArray(_content)));  

另一个怀疑是我没有正确地去掉_content中的'填充',或者没有正确设置我的IV(初始化向量),这个是由我必须去掉的填充来决定的。不过,这应该通过那个“简单”的语句来完成。我一直在尝试这个,但没有成功:

var pad:IPad = new PKCS5
cipher = Crypto.getCipher("simple-aes", Hex.toArray(key),pad);
pad.setBlockSize(cipher.getBlockSize());

有没有人能告诉我该怎么解决这个问题呢? :)

非常感谢!

1 个回答

0

好的,终于搞清楚问题出在哪里了。除了对AS3做了一些调整,我们之前错误地把文件当成了MP3或图片来传输(其实应该是文本/HTML格式)。

我们的Python代码保持不变。AS3的代码调整成了下面这样。

这是我们使用的AS3类:

package com.xperiment.preloader
{

import com.greensock.loading.DataLoader;
import com.hurlant.crypto.Crypto;
import com.hurlant.crypto.symmetric.ICipher;
import com.hurlant.util.Base64;
import flash.events.Event;
import flash.utils.ByteArray;


public class EncryptedDataLoader extends DataLoader
{
    private static var backlog:Vector.<EncryptedDataLoader>;
    private static var cipher:ICipher;
    private var decrypted:Boolean = true;

    public function EncryptedDataLoader(urlOrRequest:*, vars:Object=null)
    {
        this.addEventListener(Event.COMPLETE,decryptL);
        super(urlOrRequest, vars);
    }

    public function decryptL(e:Event):void {
        trace("start decrypt");
        e.stopImmediatePropagation();
        this.removeEventListener(Event.COMPLETE,decryptL);

        backlog ||= new Vector.<EncryptedDataLoader>;
        backlog.push(this);
        if(cipher)  pingBacklog();
    }

    public function decipher():void
    {
        _content = Base64.decodeToByteArray( _content );
        cipher.decrypt( _content );     

        decrypted=true;
        this.dispatchEvent(new Event(Event.COMPLETE));
    }

    public static function setCipher(_key:String):void{
        var keyBA:ByteArray = new ByteArray;
        keyBA.writeMultiByte(_key, "iso-8859-1"); 
        cipher = Crypto.getCipher("simple-aes", keyBA);
        pingBacklog();
    }

    public static function kill():void{
        cipher.dispose();
        cipher = null;  
    }

    public static function pingBacklog():void{
        if(backlog){
            var encrypted:EncryptedDataLoader;
            while(backlog.length>0){
                encrypted=backlog.shift();
                encrypted.decipher();
            }
            backlog=null;
        }
    }
}

}

撰写回答