as3crypto加密与c# /. net不匹配

本文关键字:net 不匹配 加密 as3crypto | 更新日期: 2023-09-27 18:12:51

目前,我在c#/中有这个算法。净:

    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使用as3crypto DES的结果:

    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);
    }

谁有什么建议,为什么他们是不同的?我错过了什么?TIA。

更新:

这是我现在使用的ActionScript代码,但正如我的评论指出,它仍然不同于c#的结果:

    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:

谢谢你,@Miguel Sanchez。如果我将它们逐个分解并比较它们的输出,除了最后一个加密之外,它们是相同的:

    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的输出:

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#/的输出。净:

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代码:

    aes.encrypt(inputBA);
    return Base64.encodeByteArray(inputBA);

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

        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
        cs.Write(inputByteArray, 0, inputByteArray.Length);
        cs.FlushFinalBlock();
        return Convert.ToBase64String(ms.ToArray());

as3crypto加密与c# /. net不匹配

首先修改这一行

inputBA.writeUTFBytes(decrKey);

key.writeUTFBytes(decrKey);

你可能需要一些像这样的函数来打印AS3中的ByteArray

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到十六进制表示