我正在使用 this code的略微修改版本来创建关键任务应用程序.那些将被加密的文件非常重要.这必须从头开始,因为还有一些其他事情必须与此一起完成. 这有多安全?它不可能破解这种加
这有多安全?它不可能破解这种加密吗?
很抱歉,这是一个有用的链接. http://www.codeproject.com/Articles/12092/Encrypt-Decrypt-Files-in-VB-NET-Using-Rijndael
Imports System Imports System.IO Imports System.Security Imports System.Security.Cryptography '************************* '** Global Variables '************************* Dim strFileToEncrypt As String Dim strFileToDecrypt As String Dim strOutputEncrypt As String Dim strOutputDecrypt As String Dim fsInput As System.IO.FileStream Dim fsOutput As System.IO.FileStream '************************* '** Create A Key '************************* Private Function CreateKey(ByVal strPassword As String) As Byte() 'Convert strPassword to an array and store in chrData. Dim chrData() As Char = strPassword.ToCharArray 'Use intLength to get strPassword size. Dim intLength As Integer = chrData.GetUpperBound(0) 'Declare bytDataToHash and make it the same size as chrData. Dim bytDataToHash(intLength) As Byte 'Use For Next to convert and store chrData into bytDataToHash. For i As Integer = 0 To chrData.GetUpperBound(0) bytDataToHash(i) = CByte(Asc(chrData(i))) Next 'Declare what hash to use. Dim SHA512 As New System.Security.Cryptography.SHA512Managed 'Declare bytResult, Hash bytDataToHash and store it in bytResult. Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash) 'Declare bytKey(31). It will hold 256 bits. Dim bytKey(31) As Byte 'Use For Next to put a specific size (256 bits) of 'bytResult into bytKey. The 0 To 31 will put the first 256 bits 'of 512 bits into bytKey. For i As Integer = 0 To 31 bytKey(i) = bytResult(i) Next Return bytKey 'Return the key. End Function '************************* '** Create An IV '************************* Private Function CreateIV(ByVal strPassword As String) As Byte() 'Convert strPassword to an array and store in chrData. Dim chrData() As Char = strPassword.ToCharArray 'Use intLength to get strPassword size. Dim intLength As Integer = chrData.GetUpperBound(0) 'Declare bytDataToHash and make it the same size as chrData. Dim bytDataToHash(intLength) As Byte 'Use For Next to convert and store chrData into bytDataToHash. For i As Integer = 0 To chrData.GetUpperBound(0) bytDataToHash(i) = CByte(Asc(chrData(i))) Next 'Declare what hash to use. Dim SHA512 As New System.Security.Cryptography.SHA512Managed 'Declare bytResult, Hash bytDataToHash and store it in bytResult. Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash) 'Declare bytIV(15). It will hold 128 bits. Dim bytIV(15) As Byte 'Use For Next to put a specific size (128 bits) of bytResult into bytIV. 'The 0 To 30 for bytKey used the first 256 bits of the hashed password. 'The 32 To 47 will put the next 128 bits into bytIV. For i As Integer = 32 To 47 bytIV(i - 32) = bytResult(i) Next Return bytIV 'Return the IV. End Function
加密和解密
'**************************** '** Encrypt/Decrypt File '**************************** Private Enum CryptoAction 'Define the enumeration for CryptoAction. ActionEncrypt = 1 ActionDecrypt = 2 End Enum Private Sub EncryptOrDecryptFile(ByVal strInputFile As String, _ ByVal strOutputFile As String, _ ByVal bytKey() As Byte, _ ByVal bytIV() As Byte, _ ByVal Direction As CryptoAction) Try 'In case of errors. 'Setup file streams to handle input and output. fsInput = New System.IO.FileStream(strInputFile, FileMode.Open, _ FileAccess.Read) fsOutput = New System.IO.FileStream(strOutputFile, _ FileMode.OpenOrCreate, _ FileAccess.Write) fsOutput.SetLength(0) 'make sure fsOutput is empty 'Declare variables for encrypt/decrypt process. Dim bytBuffer(4096) As Byte 'holds a block of bytes for processing Dim lngBytesProcessed As Long = 0 'running count of bytes processed Dim lngFileLength As Long = fsInput.Length 'the input file's length Dim intBytesInCurrentBlock As Integer 'current bytes being processed Dim csCryptoStream As CryptoStream 'Declare your CryptoServiceProvider. Dim cspRijndael As New System.Security.Cryptography.RijndaelManaged 'Setup Progress Bar pbStatus.Value = 0 pbStatus.Maximum = 100 'Determine if ecryption or decryption and setup CryptoStream. Select Case Direction Case CryptoAction.ActionEncrypt csCryptoStream = New CryptoStream(fsOutput, _ cspRijndael.CreateEncryptor(bytKey, bytIV), _ CryptoStreamMode.Write) Case CryptoAction.ActionDecrypt csCryptoStream = New CryptoStream(fsOutput, _ cspRijndael.CreateDecryptor(bytKey, bytIV), _ CryptoStreamMode.Write) End Select 'Use While to loop until all of the file is processed. While lngBytesProcessed < lngFileLength 'Read file with the input filestream. intBytesInCurrentBlock = fsInput.Read(bytBuffer, 0, 4096) 'Write output file with the cryptostream. csCryptoStream.Write(bytBuffer, 0, intBytesInCurrentBlock) 'Update lngBytesProcessed lngBytesProcessed = lngBytesProcessed + _ CLng(intBytesInCurrentBlock) 'Update Progress Bar pbStatus.Value = CInt((lngBytesProcessed / lngFileLength) * 100) End While 'Close FileStreams and CryptoStream. csCryptoStream.Close() fsInput.Close() fsOutput.Close()
我已将主要代码粘贴到此处.
如上所述,没有什么是不可能破解的,你只能遵循最佳实践,使任何潜在的攻击者尽可能地努力.实际上,您链接的代码不再被视为最先进的代码(如果它曾经是).它通过散列密码来创建对称加密密钥.这很糟糕,因为密码通常没有足够的熵来阻止基于字典的复杂攻击.此外,它不使用任何salt或同等版本,因此使用预先计算的表来攻击它非常容易.
无论何时,您都应该使用安全的PRNG(伪随机数生成器)生成对称密钥.如果没有特别需要涉及密码,请不要这样做.如果绝对必须是密码,请使用PKCS5中的PBKDF2或bcrypt或scrypt等替代品.
IV也应始终从安全的PRNG生成,并且如果可能,永远不会重复使用.也没有必要从密码中派生出来,如您链接的示例所示.
IV是公共信息,这意味着您可以安全地发布它 – 但它必须保持不可预测和随机 – 否则您会受到某些dedicated attacks的影响,除非您使用经过验证的加密模式(如GCM).
如果您不熟悉这些主题并且有疑问,我强烈建议咨询专家.如果要保护的数据与您说的一样重要,那么应该花费额外的资金.如果没有在该地区的经验,可能是太高,你可能会忽略手工制作自己的解决方案时的重要事项.