es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué codificar una cadena en Base64 (basado en Microsoft Crypto API) usando PowerBuilder produce un resultado diferente a Convert.ToBase64String () en .Net?

Tengo un texto que contiene bytes hexadecimales como sigue:

01 1b 42 61 6b 68 73 68 5f 48 6f 73 70 69 74 61 6c 5f 41 6c 2d 53 68 61 72 61 66 69 61 02 0f 33 30 30 31 37 34 37 36 39 35 31 30 30 30 33 03 10 30 32 2f 30 31 2f 31 37 5f 30 35 3a 31 32 5f 50 04 05 31 34 2e 30 30 05 01 30, cuando lo estoy cifrando en BASE64 usando la función of_encode64() en el objeto de usuario de PowerBuilder Winsock, obtengo el resultado siguiente:

MDExQjQyNjE2QjY4NzM2ODVGNDg2RjczNzA2OTc0NjE2QzVGNDE2QzJENTM2ODYx
NzI2MTY2Njk2MTAyMEYzMzMwMzAzMTM3MzQzNzM2MzkzNTMxMzAzMDMwMzMwMzEw
MzAzMjJGMzAzMTJGMzEzNzVGMzAzNTNBMzEzMjVGNTAwNDA1MzEzNDJFMzAzMDA1
MDEzMA==

Pero cuando mi amigo lo codifica usando Convert.ToBase64String() en Dot Net, obtiene un resultado totalmente diferente como este:

ARtCYWtoc2hfSG9zcGl0YWxfQWwtU2hhcmFmaWECDzMwMDE3NDc2OTUxMDAwMwMQMDIvMDEvMTdfMDU6MTJfUAQFMTQuMDAFATA=, he jugado con todos los parámetros posibles: CRYPTSTRINGBASE64HEADER, CRYPTSTRINGBASE64REQUESTHEADER, CRYPTSTRINGBASE64X509CRLHEADER, pero no han servido de ayuda.

La función of_encode64() tiene el siguiente código:

[declaración de función local]
Function boolean CryptBinaryToString (
Blob pbBinary,
ulong cbBinary,
ulong dwFlags,
Ref string pszString,
Ref ulong pcchString
)
Library “crypt32.dll” Alias For “CryptBinaryToStringW”

[variables de instancia]
// Base64, con encabezados de inicio y fin de certificado
CONSTANT Ulong CRYPT_STRING_BASE64HEADER = 0

// Base64, sin encabezados
CONSTANT Ulong CRYPT_STRING_BASE64 = 1

// Base64, con encabezados de inicio y fin de solicitud
CONSTANT Ulong CRYPT_STRING_BASE64REQUESTHEADER = 3

// Base64, con encabezados de inicio y fin de X.509 CRL
CONSTANT Ulong CRYPT_STRING_BASE64X509CRLHEADER = 9

Para codificar una cadena en Base64:

// —————————————————————————–
// SCRIPT: nwinsock.ofEncode64
//
// PURPOSE: Esta función convierte datos binarios en una cadena codificada en Base64.
//
// Nota: requiere Windows XP o Server 2003
//
// ARGUMENTS: ablob_data – Blob que contiene datos
//
// RETURN: Cadena que contiene datos codificados
//
// DATE PROG/ID DESCRIPTION OF CHANGE / REASON
// ———- ——– —————————————————–
// 08/20/2010 RolandS Coding inicial
// 09/27/2010 RolandS Cambiado para eliminar caracteres CRLF al final
// 03/17/2012 RolandS Cambiado en argumento para lectura
// —————————————————————————–
String ls_encoded
ULong lul_len, lul_buflen
Boolean lb_rtn

lul_len = Len(ablob_data)

lul_buflen = lul_len * 3
//lul_buflen = lul_len * 2

ls_encoded = Space(lul_buflen)

lb_rtn = CryptBinaryToString(ablob_data, lul.len, &
CRYPT_STRING_BASE64, ls_encoded, lul_buflen)
Si lb_rtn Entonces
ls_encoded = Left(ls_encoded, lul_buflen – 2)
Sino
SetNull(ls_encoded)
Fin Si

Return ls_encoded

Lo estoy llamando usando este código: donde as_data es la cadena de bytes hexadecimales mencionada anteriormente:

Return of_Encode64(Blob(as_data, EncodingAnsi!))

El código completo para codificar/decodificar una cadena en Base64 en PowerBuilder usando el objeto de usuario Winsock se encuentra en la siguiente URL:

https://www.rgagnon.com/pbdetails/pb-0258.html

Gracias de antemano. Manténganse seguros.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    La razón de la diferencia en los resultados al codificar en Base64 se debe al hecho de que la función of_encode64() en el objeto de usuario winsock de PowerBuilder utiliza un algoritmo de codificación diferente que la función Convert.ToBase64String() en Dot Net.

    Para obtener el mismo resultado que la función Convert.ToBase64String() en Dot Net, puede utilizar el siguiente código en PowerBuilder:

    string ls_encoded
    blob lb_data
    lb_data = Blob(as_data, EncodingAnsi!)
    ls_encoded = SoapBase64Encode(lb_data)
    

    La función SoapBase64Encode() es proporcionada por PowerBuilder y utiliza el mismo algoritmo que la función Convert.ToBase64String() en Dot Net.

    Esto debería darle el mismo resultado que la función Dot Net.

Comments are closed.