首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >as3crypto加密与C#/.NET不匹配

as3crypto加密与C#/.NET不匹配
EN

Stack Overflow用户
提问于 2016-10-12 04:45:57
回答 1查看 77关注 0票数 0

目前,我在C#/.NET中有这样的算法:

代码语言:javascript
复制
    private static byte[] key = { };
    private static readonly byte[] IV = { 20, 52, 88, 120, 76, 89, 205, 239 };
    private static readonly string sEncryptionKey = "abcdefgh";

    public static string Encrypt(string stringToEncrypt)
    {
        try
        {
            Debug.WriteLine("stringToEncrypt: " + stringToEncrypt);
            key = System.Text.Encoding.UTF8.GetBytes(sEncryptionKey.Substring(0, 8));
            Debug.WriteLine("key: " + Convert.ToBase64String(key));
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            //var des = new AesCryptoServiceProvider();
            des.Padding = PaddingMode.Zeros;
            byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
            Debug.WriteLine("inputByteArray: " + Convert.ToBase64String(inputByteArray));
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
            Debug.WriteLine("IV: " + Convert.ToBase64String(IV));
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            Debug.WriteLine("Convert.ToBase64String(ms.ToArray()): " + Convert.ToBase64String(ms.ToArray()));
            return Convert.ToBase64String(ms.ToArray());
        }
        catch (Exception e)
        {
            return e.Message;
        }
    }

问题是,我试图通过使用ActionScript DES获得这个算法的结果,以匹配我的as3crypto的结果:

代码语言:javascript
复制
    protected function encrypt(input:String):String
    {
        var logData:Object = new Object();

        var decrKey:String = new String("abcdefgh");
        // byte[] IV = { 20, 52, 88, 120, 76, 89, 205, 239 };
        var iv:ByteArray = new ByteArray();
        iv.writeByte(20);

        iv.writeByte(52);

        iv.writeByte(88);

        iv.writeByte(120);

        iv.writeByte(76);

        iv.writeByte(89);

        iv.writeByte(205);

        iv.writeByte(239);

        iv.position = 0;
        trace("iv: " + iv);         

        //var decrIV:String = iv.readUTF();
        var decrIV:String = new String();
        while (iv.bytesAvailable > 0) { 
            //read to letter or end of bytes 
            decrIV += iv.readUTFBytes(1);
        } 
        var inputBA:ByteArray=Hex.toArray(Hex.fromString(input));
        var key:ByteArray = Hex.toArray(Hex.fromString(decrKey));
        var pad:IPad = new NullPad();
        var aes:ICipher = Crypto.getCipher("des-cbc", key, pad);
        pad.setBlockSize(aes.getBlockSize());
        var ivmode:IVMode = des as IVMode;
        ivmode.IV = Hex.toArray(Hex.fromString(decrIV));
        des.encrypt(inputBA);

        return Base64.encodeByteArray( inputBA);
    }

有谁有什么不同的建议吗?我遗漏了什么?蒂娅。

更新:

这是我现在使用的ActionScript代码,但正如我的注释所指出的,它仍然与C#结果不同:

代码语言:javascript
复制
    protected function encrypt(input:String):String
    {
        var logData:Object = new Object();

        var decrKey:String = new String("tuber$20");
        // byte[] IV = { 20, 52, 88, 120, 76, 89, 205, 239 };
        var iv:ByteArray = new ByteArray();
        iv.writeByte(20);

        iv.writeByte(52);

        iv.writeByte(88);

        iv.writeByte(120);

        iv.writeByte(76);

        iv.writeByte(89);

        iv.writeByte(205);

        iv.writeByte(239);

        iv.position = 0;
        trace("iv: " + iv);         

        //var decrIV:String = iv.readUTF();
        var decrIV:String = new String();
        while (iv.bytesAvailable > 0) { 
            //read to letter or end of bytes 
            decrIV += iv.readUTFBytes(1);
        }
       //var inputBA:ByteArray = Hex.toArray(Hex.fromString(input));
        var inputBA:ByteArray = new ByteArray(); 
        inputBA.writeUTFBytes(input);

        //var key:ByteArray = Hex.toArray(Hex.fromString(decrKey));
        var key:ByteArray = new ByteArray();
        inputBA.writeUTFBytes(decrKey);

        var pad:IPad = new NullPad();
        var aes:ICipher = Crypto.getCipher("des-cbc", key, pad);
        pad.setBlockSize(aes.getBlockSize());
        var ivmode:IVMode = aes as IVMode;
        //ivmode.IV = Hex.toArray(Hex.fromString(decrIV));
        ivmode.IV = new ByteArray();
        inputBA.writeUTFBytes(decrIV);

        aes.encrypt(inputBA);

        return Base64.encodeByteArray( inputBA);
    }

更新2:

“谢谢,”米格尔·桑切斯说。如果我将每一项数据分解并比较它们的输出,它们是相同的,除了最后一次加密:

代码语言:javascript
复制
    protected function encrypt(input:String):String
    {
        trace("stringToEncrypt: " + input);                     
        var logData:Object = new Object();

        var decrKey:String = new String("tuber$20");
        // byte[] IV = { 20, 52, 88, 120, 76, 89, 205, 239 };
        var iv:ByteArray = new ByteArray();
        iv.writeByte(20);

        iv.writeByte(52);

        iv.writeByte(88);

        iv.writeByte(120);

        iv.writeByte(76);

        iv.writeByte(89);

        iv.writeByte(205);

        iv.writeByte(239);

        iv.position = 0;
        trace("iv: " + Base64.encodeByteArray(iv));         

        //var decrIV:String = iv.readUTF();
        var decrIV:String = new String();
        while (iv.bytesAvailable > 0) { 
            //read to letter or end of bytes 
            decrIV += iv.readUTFBytes(1);
        }
        trace("decrIV: " + decrIV);

        //var inputBA:ByteArray = Hex.toArray(Hex.fromString(input));
        var inputBA:ByteArray = new ByteArray(); 
        inputBA.writeUTFBytes(input);
        trace("inputBA: " + Base64.encodeByteArray(inputBA));       

        //var key:ByteArray = Hex.toArray(Hex.fromString(decrKey));
        var key:ByteArray = new ByteArray();
        key.writeUTFBytes(decrKey);
        trace("key: " + Base64.encodeByteArray(key));   

        var pad:IPad = new NullPad();
        var aes:ICipher = Crypto.getCipher("des-cbc", key, pad);
        pad.setBlockSize(aes.getBlockSize());
        var ivmode:IVMode = aes as IVMode;
        //ivmode.IV = Hex.toArray(Hex.fromString(decrIV));
        ivmode.IV = new ByteArray();
        ivmode.IV.writeUTFBytes(decrIV);
        trace("ivmode.IV: " + Base64.encodeByteArray(ivmode.IV));

        aes.encrypt(inputBA);

        trace("Base64.encodeByteArray(inputBA): " + Base64.encodeByteArray(inputBA));
        return Base64.encodeByteArray(inputBA);
    }

下面是来自ActionScript的输出:

代码语言:javascript
复制
stringToEncrypt: a1d63a1fb90b422ecce953b3302b6e521f96
key: dHViZXIkMjA=
inputBA: YTFkNjNhMWZiOTBiNDIyZWNjZTk1M2IzMzAyYjZlNTIxZjk2
iv: FDRYeExZze8=
decrIV: 4XxLYÍï
ivmode.IV: FDRYeExZw43Drw==
Base64.encodeByteArray(inputBA): 6AJu1PUFRHx+Ykf0r1HlZVy39kR0HrOaw+wTHmnRPPunisp4TR0cSw==

stringToEncrypt: 10:00
key: dHViZXIkMjA=
inputBA: MTA6MDA=
iv: FDRYeExZze8=
decrIV: 4XxLYÍï
ivmode.IV: FDRYeExZw43Drw==
Base64.encodeByteArray(inputBA): N5VgWd0Ccu0=

下面是C#/.NET的输出:

代码语言:javascript
复制
stringToEncrypt: a1d63a1fb90b422ecce953b3302b6e521f96
key: dHViZXIkMjA=
inputByteArray: YTFkNjNhMWZiOTBiNDIyZWNjZTk1M2IzMzAyYjZlNTIxZjk2
IV: FDRYeExZze8=
Convert.ToBase64String(ms.ToArray()): h2jT8xR2SOPagrQwF3leuKFdEvHpYyfCUzEJw2lxXG2HnuUyw1QXzg==

stringToEncrypt: 10:00
key: dHViZXIkMjA=
inputByteArray: MTA6MDA=
IV: FDRYeExZze8=
Convert.ToBase64String(ms.ToArray()): WVOOknAikYs=

更新3:

这是最后一步的ActionScript代码:

代码语言:javascript
复制
    aes.encrypt(inputBA);

    return Base64.encodeByteArray(inputBA);

这是最后几步的C#/.NET代码:

代码语言:javascript
复制
        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
        cs.Write(inputByteArray, 0, inputByteArray.Length);
        cs.FlushFinalBlock();
        return Convert.ToBase64String(ms.ToArray());
EN

回答 1

Stack Overflow用户

发布于 2016-10-12 14:12:10

首先更改这一行

代码语言:javascript
复制
inputBA.writeUTFBytes(decrKey);

代码语言:javascript
复制
key.writeUTFBytes(decrKey);

您可能需要一些像这样的函数才能在ByteArray中打印AS3

代码语言:javascript
复制
public static function fromArray(array:ByteArray, colons:Boolean=false):String {
        var s:String = "";
        for (var i:uint=0;i<array.length;i++) {
                s+=("0"+array[i].toString(16)).substr(-2,2);
                if (colons) {
                        if (i<array.length-1) s+=":";
                }
        }
        return s;
}

资料来源:AS3 ByteArray to Hex representation

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39990689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档