Just nu i M3-nätverket
Gå till innehåll

Kryptera sträng mellan javascript och vb.net och viceversa.


tonlof

Rekommendera Poster

Hej, finns det någon duktig vänlig själ varför encryptCryptoJSAESString funtionen inte returnerar en krypterad sträng?

 

Jag har fått det att fungera om jag genererar en aes krypterad string från javascript och decrypterar den i DecryptCryptoJSAESString men jag vill även ha den omvända funktionen att skapa en aes sträng i vb.net och sedan decryptera den i javascript. Eller om någon har något tips på att göra detta på annat sätt.

 

Koden nedan hittade jag för ett bra tag på google men tyvärr kommer jag inte ihåg källan och det fanns ingen copyrighttext eller ägare för koden angiven som jag kan hitta så har jag gjort ett övertramp med att lägga ut den här ber jag ursäkt samtidigt som admin får ta bort inlägget.

 

Tack på förhand.

Dim str1 As String = encryption.encryptCryptoJSAESString("test", "abcde")
Dim str2 As String = encryption.DecryptCryptoJSAESString(str1, "abcde")
MsgBox(str1 & vbNewLine & str2)
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text

Public Class encryption



    Public Shared Function GetRandomString() As String
        Return Path.GetRandomFileName().Replace(".", "")
    End Function

    Public Shared Function DecryptCryptoJSAESString(openSSLCompatibleString As String, passphrase As String) As String
        If [String].IsNullOrEmpty(openSSLCompatibleString) OrElse [String].IsNullOrEmpty(passphrase) Then
            Throw New ArgumentNullException("FatalError: arguments cannot be empty!")
        End If

        Dim plainText As String = Nothing

        Try
            Using rijAlg As New RijndaelManaged()
                rijAlg.Mode = CipherMode.CBC
                rijAlg.Padding = PaddingMode.PKCS7

                Dim cryptedString As Byte() = parseOpenSSLString(openSSLCompatibleString, passphrase, rijAlg)

                Dim decryptor As ICryptoTransform = rijAlg.CreateDecryptor()

                Using msDecrypt As New MemoryStream(cryptedString)
                    Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
                        Using srDecrypt As New StreamReader(csDecrypt)
                            plainText = srDecrypt.ReadToEnd()
                        End Using
                    End Using

                End Using
            End Using

        Catch generatedExceptionName As Exception
        End Try

        Return plainText

    End Function

    Private Shared Function parseOpenSSLString(base64EncodedString As String, passphrase As String, algo As SymmetricAlgorithm) As Byte()
        Const ITERATION_COUNT As Integer = 1

        Using openSSLStream As New MemoryStream(Convert.FromBase64String(base64EncodedString))
            Using reader As New BinaryReader(openSSLStream)
                Dim markWord1 = reader.ReadBytes(4)
                Dim markWord2 = reader.ReadBytes(4)

                If BitConverter.IsLittleEndian Then
                    Array.Reverse(markWord1)
                    Array.Reverse(markWord2)
                End If

                If BitConverter.ToInt32(markWord1, 0) = &H53616C74 AndAlso BitConverter.ToInt32(markWord2, 0) = &H65645F5F Then
                    Dim salt As Byte() = reader.ReadBytes(8), key As Byte(), iv As Byte()

                    openSSLAES256DeriveKeyAndIV(Encoding.ASCII.GetBytes(passphrase), salt, ITERATION_COUNT, key, iv)

                    algo.Key = key
                    algo.IV = iv

                    Return reader.ReadBytes(CInt(openSSLStream.Length) - 16)
                End If
            End Using
        End Using

        Return Nothing
    End Function


    Private Shared Sub openSSLAES256DeriveKeyAndIV(data As Byte(), salt As Byte(), count As Integer, ByRef key As Byte(), ByRef iv As Byte())
        Dim hashList As New List(Of Byte)()
        Dim currentHash As Byte() = New Byte(-1) {}

        Dim preHashLength As Integer = data.Length + (If((salt IsNot Nothing), salt.Length, 0))
        Dim preHash As Byte() = New Byte(preHashLength - 1) {}

        System.Buffer.BlockCopy(data, 0, preHash, 0, data.Length)
        If salt IsNot Nothing Then
            System.Buffer.BlockCopy(salt, 0, preHash, data.Length, salt.Length)
        End If

        Using hash As MD5 = MD5.Create()
            currentHash = hash.ComputeHash(preHash)

            For i As Integer = 1 To count - 1
                currentHash = hash.ComputeHash(currentHash)
            Next

            hashList.AddRange(currentHash)

            While hashList.Count < 48
                ' for 32-byte key and 16-byte iv
                preHashLength = currentHash.Length + data.Length + (If((salt IsNot Nothing), salt.Length, 0))
                preHash = New Byte(preHashLength - 1) {}

                System.Buffer.BlockCopy(currentHash, 0, preHash, 0, currentHash.Length)
                System.Buffer.BlockCopy(data, 0, preHash, currentHash.Length, data.Length)
                If salt IsNot Nothing Then
                    System.Buffer.BlockCopy(salt, 0, preHash, currentHash.Length + data.Length, salt.Length)
                End If

                currentHash = hash.ComputeHash(preHash)

                For i As Integer = 1 To count - 1
                    currentHash = hash.ComputeHash(currentHash)
                Next

                hashList.AddRange(currentHash)

            End While
        End Using

        key = New Byte(31) {}
        iv = New Byte(15) {}
        hashList.CopyTo(0, key, 0, 32)
        hashList.CopyTo(32, iv, 0, 16)
    End Sub
    '------------------------------------------

    Public Shared Function encryptCryptoJSAESString(openSSLCompatibleString As String, passphrase As String) As String
        If [String].IsNullOrEmpty(openSSLCompatibleString) OrElse [String].IsNullOrEmpty(passphrase) Then
            Throw New ArgumentNullException("FatalError: arguments cannot be empty!")
        End If

        Dim plainText As String = Nothing

        Try
            Using rijAlg As New RijndaelManaged()

                rijAlg.Mode = CipherMode.CBC
                rijAlg.Padding = PaddingMode.PKCS7

                Dim f As New StringBuilder
                For Each j In rijAlg.LegalBlockSizes
                    f.Append(j.ToString)
                Next


                Dim cryptedString As Byte() = joinOpenSSLString(openSSLCompatibleString, passphrase, rijAlg)

                Dim encryptor As ICryptoTransform = rijAlg.CreateEncryptor()

                Using msencrypt As New MemoryStream(cryptedString)
                    Using csencrypt As New CryptoStream(msencrypt, encryptor, CryptoStreamMode.Read)
                        Using srencrypt As New StreamReader(csencrypt)
                            plainText = srencrypt.ReadToEnd()
                        End Using
                    End Using

                End Using
            End Using

        Catch generatedExceptionName As Exception
            Console.WriteLine(generatedExceptionName.Message)
        End Try

        Return plainText

    End Function


    Private Shared Function joinOpenSSLString(byteEncodedString As String, passphrase As String, algo As SymmetricAlgorithm) As Byte()
        Const ITERATION_COUNT As Integer = 1
        Dim plaintextBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(byteEncodedString)
        Using openSSLStream As New MemoryStream(plaintextBytes)
            Using reader As New BinaryReader(openSSLStream)
                Dim markWord1 = reader.ReadBytes(4)
                Dim markWord2 = reader.ReadBytes(4)

                If BitConverter.IsLittleEndian Then
                    Array.Reverse(markWord1)
                    Array.Reverse(markWord2)
                End If

                If BitConverter.ToInt32(markWord1, 0) = &H53616C74 AndAlso BitConverter.ToInt32(markWord2, 0) = &H65645F5F Then
                    Dim salt As Byte() = reader.ReadBytes(8), key As Byte(), iv As Byte()

                    openSSLAES256DeriveKeyAndIV(Encoding.ASCII.GetBytes(passphrase), salt, ITERATION_COUNT, key, iv)


                    algo.Key = key
                    algo.IV = iv

                    Return Convert.FromBase64String(Int(openSSLStream.Length - 16))
                End If
            End Using
        End Using

        Return Nothing
    End Function

End Class
Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...