2013-03-18 243 views
2

我是密碼學的新手。我的要求是解密/加密使用openssl加密/解密的文本。我們使用的算法是Openssl中的aes-256-cbc。 所以,我試圖在我的應用程序中實現相同的功能。到目前爲止,經過大量的使用Google所有我能夠做的是..使用OpenSSL進行AES-256/CBC加密並在C#中解密

private static string Encryptor(string TextToEncrypt) 
{ 
    //Turn the plaintext into a byte array. 
    byte[] PlainTextBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToEncrypt);    

    //Setup the AES providor for our purposes. 
    AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider(); 

    aesProvider.BlockSize = 128; 
    aesProvider.KeySize = 256; 
    //My key and iv that i have used in openssl 
    aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey); 
    aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV); 
    aesProvider.Padding = PaddingMode.PKCS7; 
    aesProvider.Mode = CipherMode.CBC; 

    ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor(aesProvider.Key, aesProvider.IV);    
    byte[] EncryptedBytes = cryptoTransform.TransformFinalBlock(PlainTextBytes, 0, PlainTextBytes.Length); 
    return Convert.ToBase64String(EncryptedBytes);       
} 

private static string Decryptor(string TextToDecrypt) 
{ 
    byte[] EncryptedBytes = Convert.FromBase64String(TextToDecrypt); 

    //Setup the AES provider for decrypting.    
    AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider(); 
    //aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey); 
    //aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV); 
    aesProvider.BlockSize = 128; 
    aesProvider.KeySize = 256; 
    //My key and iv that i have used in openssl 
    aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey); 
    aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV); 
    aesProvider.Padding = PaddingMode.PKCS7; 
    aesProvider.Mode = CipherMode.CBC; 


    ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor(aesProvider.Key, aesProvider.IV); 
    byte[] DecryptedBytes = cryptoTransform.TransformFinalBlock(EncryptedBytes, 0, EncryptedBytes.Length); 
    return System.Text.Encoding.ASCII.GetString(DecryptedBytes); 
} 

我OpenSSL的命令是

openssl aes-256-cbc -e -nosalt -a -in inputfile.txt -out output.txt -k key -iv ivkey 

我的密鑰長度是32digits和IV是16digits

日Thnx .. 。

+1

問題是什麼?有問題嗎?標題說「替代」?你是說你不想使用OpenSSL,而是使用其他庫? – AaronLS 2013-03-18 05:22:15

+1

@AaronLS對不起,如果我不清楚..我想創建一個類來實現openssl功能....和我的問題是我的輸出在這兩種情況是差異...我需要解密數據加密使用以下命令打開ssl,反之亦然。 thnx – Nagaraj 2013-03-18 09:14:29

回答

1

首先,閱讀man enc OpenSSL的。當使用-k時,-iv被忽略。您可能需要資金-K。其次,在OpenSSL工具使用時,如果在命令行,那麼你需要做的appropriate conversions而不是Encoding.ASCII.GetBytes你的C#是使用相同字符串鍵和IV值是十六進制(7位編碼是永遠正確的答案反正)。

爲了您的純文本,你還不如用Encoding.UTF8.GetBytes/GetString,因爲它是與ASCII向後兼容。

如果由於某種原因,您實際上想要使用小寫-k,那麼會生成密鑰和iv的密碼,這比openssl使用它自己的密鑰派生方案困難得多。此外,使用-nosalt標誌也很危險。

-nosalt: 不密鑰導出程序使用的鹽。除了測試目的或與古代 版本的OpenSSL和SSLeay的兼容性外,不應使用該選項 。

其中的一個原因,這是很危險的,是由於這樣的事實,IV的不應該是可預見的或AES-CBC重複使用,如果你不使用鹽,該密碼總是會產生使用相同的密鑰同樣的IV會打開你幾次攻擊,並可能泄漏有關明文的信息。

你可以找到如何從密碼派生,相同的密鑰和IV爲OpenSSL的從這個博客帖子Decrypting OpenSSL AES files in C#雖然它是專門爲AES-128的評論導致你如何修改爲AES-256,從man EVP_BytesToKey

Hash0 = '' 
Hash1 = MD5(Hash0 + Password + Salt) 
Hash2 = MD5(Hash1 + Password + Salt) 
Hash3 = MD5(Hash2 + Password + Salt) 

Key = Hash1 + Hash2 
IV = Hash3 
+0

採用openssl小寫-k獨自用於加密文件並對其進行解密。你能告訴我適合兩者的最佳方式嗎?感謝使用UTF8的建議,因爲它讓我對他們實際做了什麼有所瞭解。 – Nagaraj 2013-03-18 18:20:40

相關問題