elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Mensajes
Páginas: 1 ... 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 [134] 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 ... 431
1331  Programación / Programación Visual Basic / Re: Ayuda Urgente con un Generador de Curp en Visual Basic 6 en: 13 Octubre 2020, 20:38 pm
Empieza por hacerte entender...

¿Qué es un 'Curp' ?. Puedo imaginar que se trate de algún tipo de codificación específica, pero seguramente tan específica que fuera de cierto ámbito, nadie más sepa de qué se trata.

Haciendo una búsqueda llego a wikipedia: https://es.wikipedia.org/wiki/Clave_Única_de_Registro_de_Población

Donde se aclara que tal 'Curp' es en efecto una codificación específica de Méjico.
Pués no parece tan complicado generar dicho código. Simplemente crea funciones para obtener cada campo solicitado que se vayan concatenando...

Sea al caso los datos:
Nombre: José de la Cierva
Apellidos: Columbus Pacificus
Fecha de Nacimiento: 2020/12-31
Género: Varón
País de Nacimiento: Méjico, Yucatán





Código
  1.  
  2. public function CrrearCurp(byref Nombre as string, byref Apellidos as string, byref FechaNac as date, byval Varon as boolean, byref NacidoEn as string, optional EsExtranjero as boolean)
  3.   dim curp as string
  4.  
  5.   curp = spaces(18)
  6.  
  7.   mid$(curp,1,2)= GetDataApellido1(apellidos)   ' CO...
  8.   mid$(curp,3,1) = GetDataApellido2(apellidos)   ' COP...
  9.   mid$(curp,4,1) = GetDataNombre(Nombre)      ' COPC
  10.   mid$(curp,5,6) = GetFechaToString(FechaNac) ' COPC201231...
  11.   mid$(curp, 11,1) = GetValueGenero(varon)   ' COPC201231H...
  12.  
  13.   ' ya ya tienes 11 de los 18 dígitos... el resto tampoco son más complicados....
  14.  
  15.   CrearCurp = ucase$(curp) ' todo en mayúsculas...
  16. end function
  17.  
  18. ' se reclama primera letra y y primera vocal del primer apellido:
  19. private function GetDataApellido1(byref Apellidos as string) as string
  20.    dim k as integer, j as integer, vocal as string, letra1 as string
  21.  
  22.    letra1 = left$(apellidos)
  23.    vocal = GetFirstVocal(Apellidos, 2)
  24.  
  25.    GetDataApellido1 = (letra1 & vocal)
  26. end function

' se considera que no habrá errores, luego no se tratan...
private function GetFirstVocal(byref Word as string, byval Inicio as integer) as string
    dim k as integer

    k = instr(ucase$(word), "A", " ", Inicio)
    If (k= 0) then  
        k = instr(ucase$(word), "E", " ", Inicio)
        If (k= 0) then
            k = instr(ucase$(word), "I", " ", Inicio)
            If (k= 0) then
                k = instr(ucase$(word), "O", " ", Inicio)
                If (k= 0) then    
                    k = instr(ucase$(word), "U", " ", Inicio)  
                end if
            end if
        end if
    end if

    GetFirstVocal = mid$(word, inicio, 1)
end function

Código
  1. private function GetFirstVocal(byref Word as string, byval Inicio as integer) as string
  2.    dim k as integer, j as integre, i as integer
  3.  
  4.    j=len(Word)
  5.    Word = ucase$(Word)
  6.    For k =Inicio to j
  7.        i= instr("AEIOU", mid$(Word, k))
  8.        If i >0 then
  9.            GetFirstVocal=mid$("AEIOU", i, 1)
  10.            Exit for
  11.        End if
  12.    Next
  13. End function
  14.  
  15. ' se reclama solo la primera letra del segundo apellido
  16. private function GetDataApellido2(byref Apellidos as string) as string
  17.    dim k as integer
  18.  
  19.    k= instr(apellidos," ",1)
  20.    GetDataApellido2 = mid$(apellidos,k,1)
  21. end function
  22.  
  23. ' se reclama solo la primera letra del nombre y si es compuesto la primera del ultimo sobrenombre, si dicho sobrenombre fueran: Maria o José.
  24. private function GetDataNombre(byref Nombre as string) as string
  25.    dim k as integer
  26.  
  27.    k= instrrev(nombre, " ")
  28.    if (k=0) then
  29.        GetDataNombre = left$(Nombre, 1)
  30.    else    ' si el nombre es compuesto, se devuelve la primera letra del último sobrenombre 'José de la Cierva', devuelve la 'C' de 'cierva'
  31.        sobrenombre = ucase$(right$(nombre, k, len(nombre)-k))
  32.        if ((sobrenombre = "MARÍA") or (sobrenombre= "JOSÉ")) then            
  33.            GetDataNombre = mid$(nombre, k,1)
  34.        else
  35.            GetDataNombre = left$(Nombre, 1)
  36.        end if
  37.    end if
  38. end function
  39.  
  40. ' entendemos que viene en el formato tipo de datos 'date' si viene en otro formato, desde luego debe ajustarse al caso...
  41. private function GetFechaToString(byref Fecha as date) as string
  42.    dim f as string
  43.  
  44.    f= Format(fecha, "yy/MM/dd")
  45.  
  46.    GetFechaToString = replace(f, "/", "")
  47. end function
  48.  
  49. ' Los valores elegidos para representar el campo son ambiguos, pués ambos pueden siginificar ambas cosas, son intercambiables, como se ve:
  50. '    H = "Hombre" o "Hembra"
  51. '    M = "Macho/Masculino" o "Mujer"
  52. private function GetValueGenero(byval Varon as boolean) as string
  53.    if (varon= true) then
  54.        GetValueGenero = "H"  'ver comentario, igual es el otro...
  55.    else
  56.        GetValueGenero = "M"  'ver comentario, igual es el otro...
  57.    end if
  58.  

Te he resuelto los primeros 11 caracteres del código, a tu esfuerzo queda el resto....
Date cuenta que hay más condicionantes, que dado que tu eres el interesado tendrás que empaparte de ellos, y corregir donde proceda... yo solo he leído el artículo de wikipedia por encima... y seguramente en la página del gobierno puedas encontrar una descripción más  detallada de cada detalle de los campos.

P. D.: me edito... Antes de mirar en Wikipedia, leí en otra parte una desafortunada descripción que me indujo a malinterpretar el segundo valor del código.. . Y al verlo hoy recordé que luego olvidé corregir... La función tachada...
1332  Sistemas Operativos / Windows / Re: Eliminar Microsoft edge definitivamente en: 9 Octubre 2020, 21:16 pm
El problema de eliminar determinados programas 'completamente', es que hay librerías compartidas... que son utilizadas por otras aplicaciones y que al insistir (usar métodos desesperados) en 'eliminarlos completamente', se corra el riesgo de que alguna aplicación no funcione o peor... cuelgue el sistema. Un problema que luego suele ser más complicado de solucionar.
1333  Foros Generales / Foro Libre / Re: El algoritmo de Facebook califica de contenido sexual inapropiado… unas cebollas en: 9 Octubre 2020, 21:06 pm
Es la demostración explícita del sesgo en el entrenamiento de los algoritmos... más aún, que en las personas. El porcentaje de diferentes detalles en la alimentación del algoritmo (el ambiente circundante en el caso de las personas), determina, marca, justifica el sego del aprendizaje...
1334  Seguridad Informática / Seguridad / Re: Crackeo de hashes sha512-crypt con John the Ripper en: 9 Octubre 2020, 20:46 pm
No respondiendo precisamente al tema, pero igualmente supongo que puede ser apreciado por aquellos a los que estos temas les resulta de interés...

La fuerza bruta sería aún más improductible, si el password fuera hasheado en el 'servidor' con dos algoritmos disitintos ... pués exige que un mismo password coincida con los hashes almacenados para sendos algoritmos, esto reduce notablemente dos posibilidades:
1 xxxxx: Hallar un hash para el password recibido que colisione con el hash generado para el password original. ...es demostrable que cuanto más pequeña sea la contraseña original, más fácil es que logre hallarse por una colisión.

Se eleva el costo de encontrar las soluciones por colisión a:
    espacio de combinaciones: combinacionesAlgoritmo(A) * CombinacionesAlgoritmo(B)

- No debe confundirse que 'CombAlgA * CombAlgB' sea igual que 'combAlgA con password del doble de tamaño'. Éste último valor suele ofrecer muchas más combinaciones, pero complica enormemente al usuario al tener que exigirle el doble de caracteres para sus contraseñas.
Esto, curiosamente puede ser contraproducente, ya que ante tales exigencias (exigir un tamaño muy grande para las contraseñas) los usuarios suelen simplificar las contraseña en base a repetir caracteres y en general introducir secuencias más simples, lo que en definitiva en vez de aumentar la seguridad, la acaba reduciedo logrando el efecto contrario al deseado. Esto es tanto más cierto, cuanto más 'zoquete-negado' sea un usuario digital.

2 xxxxx: Explotar posibles vulnerabilidades halladas en uno o ambos algoritmos de hashing, para generar un password que colisione con el hash aún conociendo uno u ambos hashes. Nótese que el interés especial del diseño descrito estriba sobre todo en la fortaleza que se logra con esto...
- El producto de dos hashes, simplemente reduce las posibilidades de que un password distinto del original, colisione con el password original (sin necesidad de que para ello intervenga el propio usuario). Y aunque a priori no parezca muy importante porque las colisiones son difíciles, aumenta exponencialmente la fuerza de los algoritmos de hashes ante posible defectos en su diseño. Es decir complica enormemente explotar fallos y fugas en la fuerza del diseño del algoritmo. Por ello ambos algoritmos deben ser sutancialmente muy distintos, para así asumir que ambos no adolecen de exactamente los mismos errores.
Conociendo las vulnerabilidades de un algoritmo dado, y conocido un hash a ser generado, puede sortearse el algoritmo para encontrar algún password que colisione con el hash esperado. Sin embargo, ese password (que no es el original), y que ha sido generado al efecto aprovechando los defectos del diseño, acabará fallando para generar el hash con el segundo algoritmo, pués incluso aunque éste tenfa también sus defectos, no van a ser coincidentes con el previo.


Lo interesante del caso, es que con apenas unas líneas más de código (y un inapreciable tiempo de cálculo extra, que para el caso de la seguridad el tiempo de contrastar contraseñas favorece la seguridad, pués ralentiza los intentos de fuerza bruta), la seguridad aumenta notablemente.

Al caso, para no malograrlo, no deberían cometerse errores, como concatenar ambos hashes en uno, o hashear ambos hashes (con alguno u otro algoritmo), debe exigirse el test, con ambos hashes. Algo así:
Código:
bolueano = funcion Test(Password, Alias)
    string hash1, hash2
   
    hash1 = hashingAlgA(password)
    hash2 = HaslingAlgB(password)

    devolver (hash1 = Search(Alias, algA)) and (hash2 = Search(Alias, algB))
...donde las funciones 'HashingAlgA' y 'HashingAlgB' son dos funciones distintas de hashing y donde la función 'Search', localiza el hash correspondiente al 'Alias' y el tipo de algoritmo solicitado (algA y algB, serían valores enumerados o cualquier otro que identiifique claramente que hash debe entregarse).

Por supuesto nada impide que al almacenar ambos hashes en el servidor, si estén concatenados (por pura simplicidad) sabiendo que cada uno tiene un número de caracteres prefijado en el diseño y que la función 'Search', discrimina convenientemente.
1335  Programación / .NET (C#, VB.NET, ASP) / Re: Progress y ProgressBar en: 9 Octubre 2020, 19:31 pm
Primero debes establecer las propiedades:
 Minimun y Maximun, no solo Value.

Y después, en el evento de recepción actualizas la propiedad value.
Si el componente de 3ºs proporciona dicho valor en el rango 0-99 (o  1-100), perfecto, si en cambio proporciona el valor transferido (cantidad total de bytes recibidos), debes hacer el cálculo manual para saber a qué porcentaje corresponde dicho valor. Para ello es de suponer que al establece rla conexión en la petición de descarga, devuelve un parámetro u disparará une vento que notifique el tamaño total (necesario para calcular el procentaje).
Si no se proporciona en ningún momento un valor yotal del fichero, es imposible saber el procentaje si el dato proporcionado es la cantidad total descargada...

Si todo te funciona bien, es probabe que el problema sea simplemente lo primero, las propiedad Minimun y Maximun tienen el mismo valor que Value, en vez de 1-100 (ó 0-99, ó 0-100).
1336  Programación / Programación Visual Basic / Re: imprimir list1 en: 8 Octubre 2020, 16:38 pm
Me alegro que lo hayas resuelto.

El uso de string de tamaño fijo es otra solución, aunque si por ejemplo decidiras luego cambiar dinámicamente a 5 u otro cualquier número de columnas, habría que cambiar código.
Una rcomendación es en lo posible adoptar soluciones dinámicas, de tal manera que un cambio de valores no suponga un cambio del código, si no simplemente, pasar los valores adecuados en los parámetros.

Una solución basado en un array sería algo como:
Código
  1. Dim PosCols() as integer
  2. dim Headers() as string
  3.  
  4. ' Al inicializar la ventana va bien...
  5. '   (dos formas de inicializar un array)
  6. private sub form1_Load()
  7.   posCols = Array(1000, 3500, 7350, 9900)
  8.   Headers = Split("Cantidad, Producto, Precio, Subtotal", ", ")
  9. end sub
  10.  

Ya tenemos el array con los valores de inicio de cada columna...
Ahora solo falta imprimir en tales posiciones...

En los  headers, remplaza esto:
Código
  1. Printer.CurrentX = 1000: Printer.Print "Cantidad"
  2. Printer.CurrentX = 3500: Printer.Print "Producto"
  3. Printer.CurrentX = 7350: Printer.Print "Precio"
  4. Printer.CurrentX = 9900: Printer.Print "Subtotal"
  5.  

por esto:
Código
  1.    Dim k as integer
  2.  
  3.    printer.CurrentY = 3000
  4.    for k = 0 to 3
  5.        Printer.CurrentX = posCols(k): Printer.Print Headers(k)
  6.    next
  7.  

Y luego en el bucle interno (el bucle 'i', que aparece dos veces)...
Código
  1.        For i = 0 To numCols - 1
  2.            Printer.CurrentX = posCols(i)
  3.            Printer.Print List1.List(j + i)
  4.        Next
  5.  

Esto invalida la necesidad de 'n', 'anchocol', 'margenizquierdo' y 'anchopapel', aunque insisto en que es preferible parametrizar las funciones, pues les da flexibilidad y puedes reaprovechar código para otros proyectos... el código estático, necesita ser modificado para cada situación. Contradice el paradigma 'orientado a objetos' y favorece el 'código espagueti'...



1337  Foros Generales / Dudas Generales / Re: Logaritmo exacto en: 7 Octubre 2020, 21:42 pm
Mi pregunta seria por ejemplo calcular el logaritmo de base 2 con la libreria math de un numero que es por ejemplo 2^(2^(100)) lo haria eficientemente?
Yo he hecho infinitas pruebas de rendimiento, para deliverar entre distitnas formas de hacer algo en un lenguaje, cual ofrece mejor rendimiento y sobretodo al hacer cambios en algoritmos, para saber si la alternativa de cambio ofrece mejor rendimiento... pero jamás he realizado una prueba de rendimiento para determinar la eficiencia de las funciones trigonométricas, principalmente porque si no se hace un uso intensivo de las mismas, no tiene influencia notable en el resultado final de un algoritmo.

Por ejemplo, las funcione seno y coseno si tienen un uso intensivo en el trazado 3D, luego si alguien dispone de una alternativa, puede interesarle hacer unas pruebas de rendimiento y usar así la más eficiente (la que viene nativamente incluída en el lenguaje o tu propia versión).
1338  Programación / Programación Visual Basic / Re: imprimir list1 en: 7 Octubre 2020, 21:18 pm
Me acabo de editar (mientras tu respondías), corrigiéndote la función al completo.... revísa mi mensaje previo y cambia la función en tu código así como la línea que invoca dicha función.

Nota los parámetros que deben ser pasados: si con 4 columnas, pasas 4, si no hay margen izquierdo, pasa 0, etc...

Por cierto, veo que ya le das un valor posicional a cada columna, cuando estableces los valores de currentX, al declarar:
Código
  1. Printer.CurrentX = 1000: Printer.Print "Cantidad"
  2. Printer.CurrentX = 3500: Printer.Print "Producto"
  3. Printer.CurrentX = 7350: Printer.Print "Precio"
  4. Printer.CurrentX = 9900: Printer.Print "Subtotal"
  5.  

Es decir están a 1000, 3500, 7350 y 9900. es decir lo estableces manualmente y no tienen un reparto equitativo, si quieres que queden con ese mismo reparto, deberías meter dichos valores en un array. Y usarlo como posición para cada columna.
1339  Programación / Programación Visual Basic / Re: imprimir list1 en: 7 Octubre 2020, 20:33 pm
Puedes mostrar una foto de la impresión, que se vea como va quedando... así me hago cargo del tamaño de los textos, etc...????

p.d.:
Lo que si veo repasando el código, es que a la función ' listarcolumnas', no le has puesto los parámetros necesarios, y por tanto no los recibe, luego parece que simplemente estás imprimiendo un texto detrás del otro, pero sin una consideración correcta de columnas, por eso te está fallando.


Dicho de otro modo... te redacto la función con los parámetros adecuados, ya que parece que no los pasas pero tampoco los inicializas (aunque si el list1)
Código
  1. Private Sub ListarColumnas(byval NumCols as integer, byval MargenIzquierdo as integer, byval AnchoPapel as integer)
  2. Dim AnchoPapel As Integer
  3.    'Dim MargenIzquierdo As Integer, numCols As Integer
  4.    Dim filas As Long
  5.    Dim ultimafila As Long
  6.    Dim k As Long, j As Long, i As Integer, n As Integer, anchocol As Integer
  7.    Dim linea As String
  8.    'Dim margen As Integer
  9.    Dim fuente As StdFont
  10.  
  11.  
  12.    Set fuente = Printer.Font
  13.    'numCols = 4  Se recibe por parámetro mejor...
  14.    Printer.FontName = "Courier New"  ' una fuente monoespaciada, si no el trabajo es más laborioso...
  15.    filas = ((List1.ListCount + 1) \ numCols)
  16.    ultimafila = ((List1.ListCount + 1) Mod numCols) ' columnas que tendrá la última fila.
  17.    anchocol = ((AnchoPapel - MargenIzquierdo) \ numCols)
  18.  
  19.  
  20.    For k = 0 To filas - 1
  21.        n = MargenIzquierdo
  22.        For i = 0 To numCols - 1
  23.            Printer.CurrentX = n  ' imprime el texto de la columna 'i'
  24.            Printer.Print List1.List(j + i)
  25.            n = (n + anchocol)
  26.        Next
  27.  
  28.        j = (j + numCols)
  29.        Printer.CurrentY = (Printer.CurrentY + Printer.TextHeight("t"))  ' el textheight depende de la fuente seleccionada en la impresora, no importa el texto entre paréntesis... es fijo para la  fuente.
  30.    Next
  31.  
  32.    If (ultimafila > 0) Then ' la última fila tiene 1 o más columnas, pero menos que 'numcols'.
  33.        n = MargenIzquierdo
  34.        For i = 0 To ultimafila - 1
  35.            Printer.CurrentX = n  ' imprime el texto de la columna 'i'
  36.            Printer.Print List1.List(j + i)
  37.            n = (n + anchocol)
  38.        Next
  39.    End If
  40.  
  41.    Set Printer.Font = fuente
  42. End Sub
  43.  
  44. ' y la invocas así:
  45. '          numero de columnas, margen izquierdo donde empezar, ancho que ocuparán las columnas.
  46. call ListarColumnas(4, 240, printer.width - MargenDerecho)
  47.  

b]Nota que:[/b]
- MargenIzquierdo y MargenDerecho pueden valer 0, lo que significará que se usará todo el ancho disponible del papel por parte de la impresora (printer.width). Ahora bien si ves que 'queda feo', porque 4 columnas son pocas, puedes o bien añadir alguna columna o utilizar márgenes a ambos lados.
- Puedes omitir el parámetro listbox, si siempre vas a usar un único listbox, pero es acertado que una función reciba por parámetro los datos que utiliza.
Si más adelante copias y pegas la función a otro proyecto, seguirá funcionando porque requerirá el listbox que en dicho proyecto estés usando (se llame como se llame, queda aislado dentro de la función), lo que es mejor que andar renombrando cada aparición del listbox...
Para no liarte visto que ya tienes la función usando el control list1, lo retiro como parámetro, pero es más adecuado que se incluya como tal.


Recuerda que todo lo que se haga con printer.print, printer.line, printer.circle, priter.paintpicture y printer.pset se dibuja a un backbuffer, donde se va recreando la 'imagen' a imprimir, cuando se invoca enddoc, equivale a invocar 'draw' del backbuffer, es decir es cuando se vuelca la imagen completa a la impresora.

1340  Foros Generales / Noticias / Re: 4 motivos por los que no debes usar un navegador beta como habitual en: 6 Octubre 2020, 17:54 pm
Citar
Cada usuario tiene la posibilidad de elegir la propuesta de este tipo que más le guste de entre las muchas que tenemos a nuestra disposición...

Es llamativo que cuando Mocosoft dominaba el espacio de los navegadores, tras acusarlo de monopolio, se le obligó a mostrar específicamente una ventana (nada opcional), donde se expresara con claridad enlaces a otros navegadores alternativos...

Ahora que Google, monopoliza el espacio de los navegadores en los móviles (viene preinstalado por defecto como sucedía con el Internet Explorer), no exhibe ninguna ventana para dejar al usuario la opción de elegir otro navegador alternativo...

Misma historia, distinto sesgo.
Páginas: 1 ... 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 [134] 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 ... 431
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines