乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      c# – RijndaelManaged的AES OFB加密

       印度阿三17 2019-06-29

      我需要通過OFB模式下的加密消息從C#應用程序通信到另一個應用程序.我知道RijndaelManaged不支持AES OFB模式.是否有人比我更了解使用OFB模式加密/解密的任何其他方式?

      解決方法:

      以下流通過使用由零饋送CBC密碼流生成的密鑰流來實現OFB.

      public class OFBStream : Stream
      {
          private const int BLOCKS = 16;
          private const int EOS = 0; // the goddess of dawn is found at the end of the stream
      
          private Stream parent;
          private CryptoStream cbcStream;
          private CryptoStreamMode mode;
          private byte[] keyStreamBuffer;
          private int keyStreamBufferOffset;
          private byte[] readWriteBuffer;
      
          public OFBStream (Stream parent, SymmetricAlgorithm algo, CryptoStreamMode mode)
          {
              if (algo.Mode != CipherMode.CBC)
                  algo.Mode = CipherMode.CBC;
              if (algo.Padding != PaddingMode.None)
                  algo.Padding = PaddingMode.None;
              this.parent = parent;
              this.cbcStream = new CryptoStream (new ZeroStream (), algo.CreateEncryptor (), CryptoStreamMode.Read);
              this.mode = mode;
              keyStreamBuffer = new byte[algo.BlockSize * BLOCKS];
              readWriteBuffer = new byte[keyStreamBuffer.Length];
          }
      
          public override int Read (byte[] buffer, int offset, int count)
          {
              if (!CanRead) {
                  throw new NotSupportedException ();
              }
      
              int toRead = Math.Min (count, readWriteBuffer.Length);
              int read = parent.Read (readWriteBuffer, 0, toRead);
              if (read == EOS)
                  return EOS;
      
              for (int i = 0; i < read; i  ) {
                  // NOTE could be optimized (branches for each byte)
                  if (keyStreamBufferOffset % keyStreamBuffer.Length == 0) {
                      FillKeyStreamBuffer ();
                      keyStreamBufferOffset = 0;
                  }
      
                  buffer [offset   i] = (byte)(readWriteBuffer [i]
                      ^ keyStreamBuffer [keyStreamBufferOffset  ]);
              }
      
              return read;
          }
      
          public override void Write (byte[] buffer, int offset, int count)
          {
              if (!CanWrite) {
                  throw new NotSupportedException ();
              }
      
              int readWriteBufferOffset = 0;
              for (int i = 0; i < count; i  ) {
                  if (keyStreamBufferOffset % keyStreamBuffer.Length == 0) {
                      FillKeyStreamBuffer ();
                      keyStreamBufferOffset = 0;
                  }
      
                  if (readWriteBufferOffset % readWriteBuffer.Length == 0) {
                      parent.Write (readWriteBuffer, 0, readWriteBufferOffset);
                      readWriteBufferOffset = 0;
                  }
      
                  readWriteBuffer [readWriteBufferOffset  ] = (byte)(buffer [offset   i]
                      ^ keyStreamBuffer [keyStreamBufferOffset  ]);
              }
      
              parent.Write (readWriteBuffer, 0, readWriteBufferOffset);
          }
      
          private void FillKeyStreamBuffer ()
          {
              int read = cbcStream.Read (keyStreamBuffer, 0, keyStreamBuffer.Length);
              // NOTE undocumented feature
              // only works if keyStreamBuffer.Length % blockSize == 0
              if (read != keyStreamBuffer.Length)
                  throw new InvalidOperationException ("Implementation error: could not read all bytes from CBC stream");
          }
      
          public override bool CanRead {
              get { return mode == CryptoStreamMode.Read; }
          }
      
          public override bool CanWrite {
              get { return mode == CryptoStreamMode.Write; }
          }
      
          public override void Flush ()
          {
              // should never have to be flushed, implementation empty
          }
      
          public override bool CanSeek {
              get { return false; }
          }
      
          public override long Seek (long offset, System.IO.SeekOrigin origin)
          {
              throw new NotSupportedException ();
          }
      
          public override long Position {
              get { throw new NotSupportedException (); }
              set { throw new NotSupportedException (); }
          }
      
          public override long Length {
              get { throw new NotSupportedException (); }
          }
      
          public override void SetLength (long value)
          {
              throw new NotSupportedException ();
          }
      
      }
      

      OFBStream需要額外的類ZeroStream

      class ZeroStream : System.IO.Stream
      {
          public override int Read (byte[] buffer, int offset, int count)
          {
              for (int i = 0; i < count; i  ) {
                  buffer [offset   i] = 0;
              }
      
              return count;
          }
      
          public override bool CanRead {
              get { return true; }
          }
      
          ... the rest is not implemented
      }
      

      你可以像我對測試向量一樣使用它:

      // NIST CAVP test vector F.4.1: OFB-AES128.Encrypt from NIST SP 800-38A
      
      RijndaelManaged aes = new RijndaelManaged ();
      aes.Key = FromHex ("2b7e151628aed2a6abf7158809cf4f3c");
      aes.IV = FromHex ("000102030405060708090A0B0C0D0E0F");
      MemoryStream testVectorStream = new MemoryStream (FromHex (
          "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710"));
      OFBStream testOFBStream = new OFBStream (testVectorStream, aes, CryptoStreamMode.Read);
      MemoryStream cipherTextStream = new MemoryStream ();
      testOFBStream.CopyTo (cipherTextStream);
      Console.WriteLine (ToHex (cipherTextStream.ToArray ()));
      

      請注意,流處理尚未完全測試(尚未).

      來源:https://www./content-1-278701.html

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多