2013-04-26 353 views
1

我構建了一個可以使用rijndael算法隱藏和解密文件的程序。但是,如果我調試我得到以下錯誤:在mscorlib.dll中發生類型'System.ArgumentNullException'的第一次機會異常

A first chance exception of type 'System.ArgumentNullException' occurred in mscorlib.dll

這是我的代碼:

Imports crypter.crypter 
Public Class Form1 

    Private Sub btnEncrypt_Click(sender As System.Object, e As System.EventArgs) Handles btnEncrypt.Click 
    Dim objCrypter As New crypter.crypter 
    Dim strPass As String = txtPass.Text 
    Dim bytkey As Byte() 
    Dim bytIV As Byte() 

    bytkey = objCrypter.CreateKey(strPass) 
    bytIV = objCrypter.CreateIV(strPass) 

    objCrypter.EncryptOrDecryptFile(txtSource.Text, txtDestination.Text, bytkey, bytIV, CryptoAction.ActionEncrypt) 


    End Sub 


    Private Sub btnDecrypt_Click(sender As Object, e As System.EventArgs) Handles btnDecrypt.Click 
    Dim objCrypter As New crypter.crypter 
    Dim strPass As String = txtPass.Text 
    Dim bytkey As Byte() 
    Dim bytIV As Byte() 

    bytkey = objCrypter.CreateKey(strPass) 
    bytIV = objCrypter.CreateIV(strPass) 

    objCrypter.EncryptOrDecryptFile(txtSource.Text, txtDestination.Text, bytkey, bytIV, crypter.crypter.CryptoAction.ActionDecrypt) 

    End Sub 
End Class 

,這是我的代碼從我的類crypter

Imports System 
Imports System.IO 
Imports System.Security 
Imports System.Security.Cryptography 

Public Class crypter 
#Region "1. Global Variables " 

    '************************* 
    '** 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 

#End Region 


#Region "2. Create A Key " 

    '************************* 
    '** 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 

#End Region 


#Region "3. Create An IV " 

    '************************* 
    '** 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 

#End Region 


#Region "4. Encrypt/Decrypt File " 

    '**************************** 
    '** 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 


      '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) 
      End While 

      'Close FileStreams and CryptoStream. 
      csCryptoStream.Close() 
      fsInput.Close() 
      fsOutput.Close() 

      'If encrypting then delete the original unencrypted file. 
      If Direction = CryptoAction.ActionEncrypt Then 
       Dim fileOriginal As New FileInfo(strFileToEncrypt) 
       fileOriginal.Delete() 
      End If 

      'If decrypting then delete the encrypted file. 
      If Direction = CryptoAction.ActionDecrypt Then 
       Dim fileEncrypted As New FileInfo(strFileToDecrypt) 
       fileEncrypted.Delete() 
      End If 

     Catch 
      fsInput.Close() 
      fsOutput.Close() 

      If Direction = CryptoAction.ActionDecrypt Then 
       Dim fileDelete As New FileInfo(strOutputFile) 
       fileDelete.Delete() 

      Else 
       Dim fileDelete As New FileInfo(strOutputFile) 
       fileDelete.Delete() 


      End If 

     End Try 
    End Sub 

#End Region 

End Class 

沒有任何人有一個想法關於什麼可能是我的錯誤?

由於提前,

+3

噢我的,你真的希望有人讀這段代碼?難道你不能只發布失敗的方法,並顯示引發異常的確切行嗎? – Steve 2013-04-26 13:24:00

回答

13

雖然我不知道具體的問題,順便我覺得第一次機會異常的原因是去到Visual Studio調試菜單 - >選擇例外項,兩個複選框針對公共語言運行時異常。

現在,當您進行調試時,即使所有異常被捕獲,IDE也會中斷。

重新運行您的代碼,您應該看到調用mscorlib的行並導致null異常。

祝你好運!

+0

感謝您的建議!這對我有很大的幫助 – kasperB 2013-04-29 17:17:28

相關問題