none
Error en encriptación RRS feed

  • Pregunta

  • Hola.

    Tenemos una clase en c# que funciona perfectamente y estamos tratando de sustituirla por una en Vb.net, pero nos da un error, la clase en C# es:

     public string obtenerDatos(string clave, string strDs_Merchant_Order, string strDs_MerchantParameters) 
        {
            //****************
            //Create signature
            //Ds_Signature
            //****************            
            //Get 3DES key
            byte[] key3DES;
            using (var tdes = new TripleDESCryptoServiceProvider())
            {
                tdes.Key = Convert.FromBase64String(clave);
                tdes.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };
                tdes.Mode = CipherMode.CBC;
                tdes.Padding = PaddingMode.Zeros;

                var cTransform = tdes.CreateEncryptor();
                var orderByteArray = Encoding.UTF8.GetBytes(strDs_Merchant_Order);
                key3DES = cTransform.TransformFinalBlock(orderByteArray, 0, orderByteArray.Length);
            }

            //Get HMAC SHA256 signature with 3DES key and DS_MerchantParameters value
            string strDs_Signature;
            using (var hmac = new HMACSHA256(key3DES))
            {
                strDs_Signature =
                    Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(strDs_MerchantParameters)));
            }

            return strDs_Signature;

        }

    Y el equivalente en vb es:

    Public Function obtenerDatos(clave As String, strDs_Merchant_order As String, strDs_MerchantParameters As String) As String
            'Creamos la firma para la compra del TPV
            '---------------------------------------------
            Dim key3DES() As Byte


            Dim tdes = New TripleDESCryptoServiceProvider()
            With tdes
                .Key = Convert.FromBase64String(clave)
                .IV = New Byte() {0, 0, 0, 0, 0, 0, 0, 0}
                .Mode = CipherMode.CBC
                .Padding = PaddingMode.Zeros
            End With

            Dim cTransform = tdes.CreateDecryptor
            Dim orderByteArray = Encoding.UTF8.GetBytes(strDs_Merchant_order)
            key3DES = cTransform.TransformFinalBlock(orderByteArray, 0, orderByteArray.Length)


            'Get HMAC SHA256 signature with 3DES key and DS_MerchantParameters value
            '--------------------------------------------------------------------------
            Dim strDs_Signature As String
            Dim hmac = New HMACSHA256(key3DES)
            strDs_Signature = Convert.ToBase64String(Encoding.UTF8.GetBytes(strDs_MerchantParameters))

            Return strDs_Signature

        End Function

    El error nos lo marca en la línea "key3DES = cTransform... y es este:

    'System.Security.Cryptography.CryptographicException' en mscorlib.dll pero no se controló en el código del usuario

    Información adicional: Longitud de datos para descifrado no válida.

    Por favor, alguien nos puede ayudar con esto?

    Gracias y un saludo

    lunes, 29 de agosto de 2016 16:10

Respuestas

  • "JJDop" escribió:

    > Tenemos una clase en c# que funciona perfectamente y estamos tratando
    > de sustituirla por una en Vb.net, pero nos da un error, la clase en C# es:
    >
    > key3DES = cTransform.TransformFinalBlock(orderByteArray, 0, orderByteArray.Length);
    >
    > Y el equivalente en vb es:
    >
    > key3DES = cTransform.TransformFinalBlock(orderByteArray, 0, orderByteArray.Length)
    >
    > El error nos lo marca en la línea "key3DES = cTransform... y es este:
    >
    > 'System.Security.Cryptography.CryptographicException' en mscorlib.dll 
    >
    > Información adicional: Longitud de datos para descifrado no válida.

    Hola:

    El error te lo marcará en esa línea, pero en realidad el error viene de la siguiente línea.

    Observa la siguiente línea de C#:

    >    var cTransform = tdes.CreateEncryptor();

    Y fíjate cómo la has traducido a Visual Basic .net:

    >    Dim cTransform = tdes.CreateDecryptor

    Si quieres traducir el código de C# a VB .NET, tal cual lo has mostrado, entonces tendrás que crear un objeto cifrador, si el procedimiento obtenerDatos se encarga de cifrar los datos pasados al procedimiento, claro está:

        Dim cTransform = tdes.CreateEncryptor()

    Y si se encarga de descifrar los datos cifrados, entonces tendrás que crear un objeto descifrador:

        Dim cTransform = tdes.CreateDecryptor()

    De todas maneras, la traducción correcta sería la que muestro más abajo, ya que en el código de C# se destruyen tanto el algoritmo simétrico como el hash mediante una llamada a sus métodos Dispose, que es lo correcto y que no aparece en la traducción realizada a Visual Basic .NET que has efectuado:

        Public Function obtenerDatos(clave As String, strDs_Merchant_order As String, strDs_MerchantParameters As String) As String
    
            'Creamos la firma para la compra del TPV
            '---------------------------------------------
            Dim key3DES As Byte()
    
            Using tdes As New TripleDESCryptoServiceProvider()
                With tdes
                    .Key = Convert.FromBase64String(clave)
                    .IV = New Byte() {0, 0, 0, 0, 0, 0, 0, 0}
                    .Mode = CipherMode.CBC
                    .Padding = PaddingMode.Zeros
                End With
    
                Dim cTransform = tdes.CreateEncryptor()
                Dim orderByteArray = Encoding.UTF8.GetBytes(strDs_Merchant_order)
                key3DES = cTransform.TransformFinalBlock(orderByteArray, 0, orderByteArray.Length)
            End Using
    
            'Get HMAC SHA256 signature with 3DES key and DS_MerchantParameters value
            '--------------------------------------------------------------------------
            Dim strDs_Signature As String
            Using hmac As New HMACSHA256(key3DES)
                strDs_Signature = Convert.ToBase64String(Encoding.UTF8.GetBytes(strDs_MerchantParameters))
            End Using
    
            Return strDs_Signature
    
        End Function

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    martes, 30 de agosto de 2016 17:12
    Moderador

Todas las respuestas

  • "JJDop" escribió:

    > Tenemos una clase en c# que funciona perfectamente y estamos tratando
    > de sustituirla por una en Vb.net, pero nos da un error, la clase en C# es:
    >
    > key3DES = cTransform.TransformFinalBlock(orderByteArray, 0, orderByteArray.Length);
    >
    > Y el equivalente en vb es:
    >
    > key3DES = cTransform.TransformFinalBlock(orderByteArray, 0, orderByteArray.Length)
    >
    > El error nos lo marca en la línea "key3DES = cTransform... y es este:
    >
    > 'System.Security.Cryptography.CryptographicException' en mscorlib.dll 
    >
    > Información adicional: Longitud de datos para descifrado no válida.

    Hola:

    El error te lo marcará en esa línea, pero en realidad el error viene de la siguiente línea.

    Observa la siguiente línea de C#:

    >    var cTransform = tdes.CreateEncryptor();

    Y fíjate cómo la has traducido a Visual Basic .net:

    >    Dim cTransform = tdes.CreateDecryptor

    Si quieres traducir el código de C# a VB .NET, tal cual lo has mostrado, entonces tendrás que crear un objeto cifrador, si el procedimiento obtenerDatos se encarga de cifrar los datos pasados al procedimiento, claro está:

        Dim cTransform = tdes.CreateEncryptor()

    Y si se encarga de descifrar los datos cifrados, entonces tendrás que crear un objeto descifrador:

        Dim cTransform = tdes.CreateDecryptor()

    De todas maneras, la traducción correcta sería la que muestro más abajo, ya que en el código de C# se destruyen tanto el algoritmo simétrico como el hash mediante una llamada a sus métodos Dispose, que es lo correcto y que no aparece en la traducción realizada a Visual Basic .NET que has efectuado:

        Public Function obtenerDatos(clave As String, strDs_Merchant_order As String, strDs_MerchantParameters As String) As String
    
            'Creamos la firma para la compra del TPV
            '---------------------------------------------
            Dim key3DES As Byte()
    
            Using tdes As New TripleDESCryptoServiceProvider()
                With tdes
                    .Key = Convert.FromBase64String(clave)
                    .IV = New Byte() {0, 0, 0, 0, 0, 0, 0, 0}
                    .Mode = CipherMode.CBC
                    .Padding = PaddingMode.Zeros
                End With
    
                Dim cTransform = tdes.CreateEncryptor()
                Dim orderByteArray = Encoding.UTF8.GetBytes(strDs_Merchant_order)
                key3DES = cTransform.TransformFinalBlock(orderByteArray, 0, orderByteArray.Length)
            End Using
    
            'Get HMAC SHA256 signature with 3DES key and DS_MerchantParameters value
            '--------------------------------------------------------------------------
            Dim strDs_Signature As String
            Using hmac As New HMACSHA256(key3DES)
                strDs_Signature = Convert.ToBase64String(Encoding.UTF8.GetBytes(strDs_MerchantParameters))
            End Using
    
            Return strDs_Signature
    
        End Function

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    martes, 30 de agosto de 2016 17:12
    Moderador
  • Muchas gracias Enrique, se me pasó por alto, ahora funciona perfectamente.

    Un saludo.

    sábado, 3 de septiembre de 2016 17:24