title: as3crypto encryption does not match C#/.NET
body: <p>Presently, I have this algorithm in C#/.NET:</p>
  
  <pre><code>    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;
          }
      }
  </code></pre>
  
  <p>The problem is, I am trying to get the results of this algorithm to match the results of my ActionScript using as3crypto DES:</p>
  
  <pre><code>    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 &gt; 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);
      }
  </code></pre>
  
  <p>Does anyone have any suggestions as to why they are different?  What am I missing?  TIA.</p>
  
  <p><strong>UPDATE:</strong></p>
  
  <p>This is the ActionScript code I am now using, but as my comment indicates it is still different than the C# result:</p>
  
  <pre><code>    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 &gt; 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);
      }
  </code></pre>
  
  <p><strong>UPDATE 2:</strong></p>
  
  <p>Thank you, @Miguel Sanchez.  If I break each down and compare their output, they are identical except for the very last encryption:</p>
  
  <pre><code>    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 &gt; 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);
      }
  </code></pre>
  
  <p>Here is the output from the ActionScript:</p>
  
  <pre><code>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=
  </code></pre>
  
  <p>Here is the output from C#/.NET:</p>
  
  <pre><code>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=
  </code></pre>
  
  <p><strong>UPDATE 3:</strong></p>
  
  <p>This is the ActionScript code for the last steps:</p>
  
  <pre><code>    aes.encrypt(inputBA);
  
      return Base64.encodeByteArray(inputBA);
  </code></pre>
  
  <p>This is the C#/.NET code for the last steps:</p>
  
  <pre><code>        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
          cs.Write(inputByteArray, 0, inputByteArray.Length);
          cs.FlushFinalBlock();
          return Convert.ToBase64String(ms.ToArray());
  </code></pre>