ECDiffieHellmanCng entschlüsselt die Daten nicht

  • VB.NET
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    ECDiffieHellmanCng entschlüsselt die Daten nicht

    Hi Leute,
    ich hänge hier an dem Problem mit der ECDiffieHellmanCng Klasse. Ich will eine Nachricht verschlüsselt mit dem PublicKey vom Partner und meinem PublicKey(?). Das verschlüsseln funktioniert zwar, allerdings nicht das entschlüsseln. Weiß jemand woran dies liegen kann?
    Ich bekomme die Fehlermeldung: Der angegebene Schlüssel hat keine gültige Größe für diesen Algorithmus.

    Hier mal der Code
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Imports System
    2. Imports System.IO
    3. Imports System.Security.Cryptography
    4. Imports System.Text
    5. Public Class Form1
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. 'Create Keys
    8. Dim p As Keys = CreateKeys(CngAlgorithm.ECDiffieHellmanP521, CngAlgorithm.Sha512)
    9. Dim PrivateKey As Byte() = p.PrivateKey
    10. Dim PublicKey As Byte() = p.PublicKey
    11. 'Encrypt Message
    12. Dim Message As String = "Hello World"
    13. Dim IV As Byte() = {23, 45, 76, 22, 100, 142, 244, 83}
    14. Dim encryptData_ As Byte() = EncryptData(System.Text.UTF8Encoding.UTF8.GetBytes(Message), PublicKey, Algorithm.AES, IV)
    15. 'Decrypt Message
    16. MsgBox(DecryptData(encryptData_, PrivateKey, IV))
    17. End Sub
    18. Private ECDiffieHellman_ As ECDiffieHellmanCng
    19. Private Structure Keys
    20. Public PrivateKey As Byte()
    21. Public PublicKey As Byte()
    22. End Structure
    23. Private Function CreateKeys(ByVal CngAlgorithm_ As CngAlgorithm, Optional ByVal HashAlgorithm_ As CngAlgorithm = Nothing, Optional ByVal KeyName As String = Nothing) As Keys
    24. ECDiffieHellman_ = New ECDiffieHellmanCng(CngKey.Create(CngAlgorithm_, KeyName, New CngKeyCreationParameters() With {.ExportPolicy = CngExportPolicies.AllowPlaintextExport}))
    25. Select Case HashAlgorithm_
    26. Case Nothing
    27. ECDiffieHellman_.HashAlgorithm = CngAlgorithm.Sha256
    28. Case Else
    29. ECDiffieHellman_.HashAlgorithm = HashAlgorithm_
    30. End Select
    31. Using Keys_ As ECDiffieHellmanCng = ECDiffieHellman_
    32. Keys_.DeriveKeyMaterial(CngKey.Import(ECDiffieHellman_.PublicKey.ToByteArray, CngKeyBlobFormat.EccPublicBlob))
    33. Keys_.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash
    34. Keys_.HashAlgorithm = CngAlgorithm.Sha256
    35. Dim KeysNew As New Keys
    36. KeysNew.PrivateKey = Keys_.Key.Export(CngKeyBlobFormat.EccPrivateBlob)
    37. KeysNew.PublicKey = Keys_.Key.Export(CngKeyBlobFormat.EccPublicBlob)
    38. Return KeysNew
    39. End Using
    40. End Function
    41. Enum Algorithm
    42. AES
    43. DES
    44. TDES
    45. End Enum
    46. Private Function EncryptData(ByVal Data As Byte(), ByVal PublicKey As Byte(), ByVal Algo As Algorithm, Optional ByVal iv As Byte() = Nothing) As Byte()
    47. Select Case Algo
    48. Case Algorithm.AES
    49. Using aes As New AesCryptoServiceProvider()
    50. iv = aes.IV
    51. ' Encrypt the message
    52. Using ciphertext As New MemoryStream()
    53. Using cs As New CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write)
    54. Dim plaintextMessage As Byte() = Data
    55. cs.Write(plaintextMessage, 0, plaintextMessage.Length)
    56. cs.Close()
    57. Return ciphertext.ToArray()
    58. End Using
    59. End Using
    60. End Using
    61. Case Algorithm.DES
    62. Using des As New DESCryptoServiceProvider()
    63. iv = des.IV
    64. ' Encrypt the message
    65. Using ciphertext As New MemoryStream()
    66. Using cs As New CryptoStream(ciphertext, des.CreateEncryptor(), CryptoStreamMode.Write)
    67. Dim plaintextMessage As Byte() = Data
    68. cs.Write(plaintextMessage, 0, plaintextMessage.Length)
    69. cs.Close()
    70. Return ciphertext.ToArray()
    71. End Using
    72. End Using
    73. End Using
    74. Case Algorithm.TDES
    75. Using tdes As New TripleDESCryptoServiceProvider
    76. iv = tdes.IV
    77. ' Encrypt the message
    78. Using ciphertext As New MemoryStream()
    79. Using cs As New CryptoStream(ciphertext, tdes.CreateEncryptor(), CryptoStreamMode.Write)
    80. Dim plaintextMessage As Byte() = Data
    81. cs.Write(plaintextMessage, 0, plaintextMessage.Length)
    82. cs.Close()
    83. Return ciphertext.ToArray()
    84. End Using
    85. End Using
    86. End Using
    87. End Select
    88. End Function
    89. Private Function DecryptData(ByVal EncryptData As Byte(), ByVal PrivateKey As Byte(), ByVal iv As Byte()) As String
    90. Using aes As New AesCryptoServiceProvider()
    91. aes.Key = PrivateKey
    92. aes.IV = iv
    93. ' Decrypt the message
    94. Using plaintext As New MemoryStream()
    95. Using cs As New CryptoStream(plaintext, aes.CreateDecryptor(), CryptoStreamMode.Write)
    96. cs.Write(EncryptData, 0, EncryptData.Length)
    97. cs.Close()
    98. Dim message As String = Encoding.UTF8.GetString(plaintext.ToArray())
    99. Return message
    100. End Using
    101. End Using
    102. End Using
    103. End Function
    104. End Class
    //Edit

    Ok, habs gelöst bzw. hab jetzt alles hinbekommen. Hab da einiges falsch gemacht ^^
    Hier die Lösung:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Security.Cryptography
    2. Imports System.IO
    3. Imports System.Text
    4. Public Class Diffie_Hellman_Encryption
    5. Private CreateCng As New ECDiffieHellmanCng
    6. Friend PublicKey As Byte() = CreateCng.PublicKey.ToByteArray
    7. ''' <summary>
    8. ''' Erstellt einen Key von dem PublicKey des Partners
    9. ''' </summary>
    10. ''' <param name="PublicKey">Der PublicKey des Partners</param>
    11. ''' <returns></returns>
    12. ''' <remarks></remarks>
    13. Friend Function CreateKey(ByVal PublicKey As Byte(), Optional ByVal KeyDerivationFunction As ECDiffieHellmanKeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash, Optional ByVal HashAlgorithm As CngAlgorithm = Nothing) As Byte()
    14. CreateCng.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash
    15. Select Case HashAlgorithm
    16. Case Nothing
    17. Case Else
    18. CreateCng.HashAlgorithm = CngAlgorithm.Sha256
    19. End Select
    20. Return CreateCng.DeriveKeyMaterial(CngKey.Import(PublicKey, CngKeyBlobFormat.EccPublicBlob))
    21. End Function
    22. Public Class Encrypt
    23. Friend Shared iv As Byte() = Nothing
    24. ''' <summary>
    25. ''' Verschlüsselt Daten in AES, hierzu wird der Key von dem PublicKey des Partners benötigt.
    26. ''' </summary>
    27. ''' <param name="Data">Die Daten die verschlüsselt werden sollen</param>
    28. ''' <param name="Key">Der Key von dem PublicKey des Partners</param>
    29. ''' <returns>Die Rückgabe ist Verschlüsselt aus den Daten</returns>
    30. ''' <remarks></remarks>
    31. Friend Shared Function EncryptData(ByVal Data As Byte(), ByVal Key As Byte()) As Byte()
    32. Using aes As New AesCryptoServiceProvider()
    33. aes.Key = Key
    34. iv = aes.IV
    35. Using ciphertext As New MemoryStream()
    36. Using cs As New CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write)
    37. cs.Write(Data, 0, Data.Length)
    38. cs.Close()
    39. Return ciphertext.ToArray()
    40. End Using
    41. End Using
    42. End Using
    43. End Function
    44. End Class
    45. Public Class Decrypt
    46. ''' <summary>
    47. ''' Die Verschlüsselten Daten werden entschlüsselt.
    48. ''' </summary>
    49. ''' <param name="Data">Hier kommen die Verschlüsselten Daten hin</param>
    50. ''' <param name="Key">Hier kommt der Key vom PublicKey des Partners hin</param>
    51. ''' <param name="IV">Hier kommt der IV von den Verschlüsselten Daten hin. Der IV hat der Nutzer der die Daten verschlüsselt hat.</param>
    52. ''' <returns></returns>
    53. ''' <remarks></remarks>
    54. Friend Shared Function DecryptData(ByVal Data As Byte(), ByVal Key As Byte(), ByVal IV As Byte()) As Byte()
    55. Using aes As New AesCryptoServiceProvider()
    56. aes.Key = Key
    57. aes.IV = IV
    58. Using plaintext As New MemoryStream()
    59. Using cs As New CryptoStream(plaintext, aes.CreateDecryptor(), CryptoStreamMode.Write)
    60. cs.Write(Data, 0, Data.Length)
    61. cs.Close()
    62. Return plaintext.ToArray()
    63. End Using
    64. End Using
    65. End Using
    66. End Function
    67. End Class
    68. End Class


    //Edit
    Hier mein Snippet: dotnet-snippets.de/snippet/dif…an-verschluesselung/15129

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mr. Johny“ ()