2017-09-13 23 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