2017-09-13 21 views
0

任何人都可以提供一个使用示例SecurityDriven.Inferno AesCtrCryptoTransfom类吗?Inferno AesCtrCryptoTransform

图书馆看起来非常有前途,但我无法找到使用它的任何代码和提供的细节是不够的,我加密虚拟...

我扩大与许多密码的作品完美的应用程序,只有它不支持AES计数器模式。对于某些SSHv2会话,我需要这个aes-128-ctr密码。 应用程序有所有不同的密码非常简单密码的界面,如下图所示:

internal interface Cipher 
    { 
    void Encrypt(byte[] data, int offset, int len, byte[] result, int result_offset); 
    void Decrypt(byte[] data, int offset, int len, byte[] result, int result_offset); 
    int BlockSize { get; } 
    } 

我创建使用AesCtrCryptoTransform如下界面的implementaion,但它不工作。

public class AES128CTR : Cipher 
{ 
    private System.Security.Cryptography.ICryptoTransform Encryptor; 
    private ArraySegment<Byte> _counter; 

    public AES128CTR(byte[] key, byte[] iv) 
    { 
    _counter = new ArraySegment<byte>(iv); 
    Encryptor = new SecurityDriven.Inferno.Cipher.AesCtrCryptoTransform(key, _counter); 
    } 

    public int BlockSize { get { return Encryptor.InputBlockSize; } } 

    public void Decrypt(byte[] data, int offset, int len, byte[] result, int result_offset) 
    { 
    Encryptor.TransformBlock(data, 0, len, result, 0); 
    } 

    public void Encrypt(byte[] data, int offset, int len, byte[] result, int result_offset) 
    { 
    Encryptor.TransformBlock(data, 0, len, result, 0); 
    } 
} 

这应该很容易,我必须做出明显的错误,只是无法弄清楚。任何想法请如何做到这一点?

+1

我鼓掌张贴代码的努力,但“它不工作”仍是最糟糕的错误描述。您已经为TLS实现创建了一个*适配器*,但该适配器内的代码不太可能出错。所以我不认为这是足够的信息让我们调试TLS会话,即使它是真的不适合在线调试。 –

回答

1

这里是工作的解决方案:

public class AES128CTR : Cipher 
    { 
    private byte[] _key; 
    private byte[] _iv; 

    public AES128CTR(byte[] key, byte[] iv, int KeySize = 128) 
    { 
     this._key = key; 
     this._iv = iv; 
    } 

    public int BlockSize { get { return _iv.Length; } } 

    public void Decrypt(byte[] data, int offset, int len, byte[] result, int result_offset) 
    { 
     SecurityDriven.Inferno.Cipher.AesCtrCryptoTransform transformation = new SecurityDriven.Inferno.Cipher.AesCtrCryptoTransform(_key, new ArraySegment<byte>(_iv)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
     using (System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(ms, transformation, System.Security.Cryptography.CryptoStreamMode.Write)) 
     { 
      cs.Write(data, offset, len); 
     } 
     var r = ms.ToArray(); 
     Array.Copy(r, result, r.Length); 
     } 
    } 

    public void Encrypt(byte[] data, int offset, int len, byte[] result, int result_offset) 
    { 
     SecurityDriven.Inferno.Cipher.AesCtrCryptoTransform transformation = new SecurityDriven.Inferno.Cipher.AesCtrCryptoTransform(_key, new ArraySegment<byte>(_iv)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
     using (System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(ms, transformation, System.Security.Cryptography.CryptoStreamMode.Write)) 
     { 
      cs.Write(data, offset, len); 
     } 
     var r = ms.ToArray(); 
     Array.Copy(r, result, r.Length); 
     } 
    } 

    } 
+0

太棒了,正是我需要的。只是'Decrypt()'需要做一些调整:你传递给CryptoStream的'MemoryStream'应该包含密文('data'参数),模式应该是'CryptoStreamMode.Read'。然后你可以调用'cs.Read()'而不是'cs.Write()'。 – murf